এই দুই এর মধ্যে পার্থক্য কি?
[এক]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[বি]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
এই দুই এর মধ্যে পার্থক্য কি?
[এক]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[বি]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
উত্তর:
আমি মনে করি না যে কোনও পার্থক্য আছে, একটি অন্যটির শর্টকাট। যদিও আপনার সঠিক বাস্তবায়ন তাদের সাথে আলাদাভাবে ডিল করতে পারে।
সম্মিলিত সমান্তরাল ওয়ার্কশিরিং কন্সট্রাক্টসগুলি একটি ওয়ার্কারশেটিং কনস্ট্রাক্ট এবং অন্য কোনও বিবৃতি সম্বলিত সমান্তরাল নির্মাণ নির্দিষ্ট করার জন্য একটি শর্টকাট। অনুমোদিত ক্লজগুলি সমান্তরাল এবং ওয়ার্কশারিং চুক্তিগুলির জন্য অনুমোদিত অনুচ্ছেদের ইউনিয়ন।
Http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf থেকে নেওয়া
ওপেনএমপি-এর জন্য চশমা এখানে রয়েছে:
এগুলি সমতুল্য।
#pragma omp parallel
থ্রেডগুলির একটি গ্রুপ তৈরি করে, যখন #pragma omp for
স্পাড থ্রেডগুলির মধ্যে লুপ পুনরাবৃত্তিগুলি ভাগ করে। সংযুক্ত #pragma omp parallel for
নির্দেশের সাথে আপনি দুটি জিনিস একসাথে করতে পারেন ।
#pragma omp parallel for
নির্দেশটি ব্যবহার করি তখন একই জিনিস কাজ করে । কিছুটা পার্থক্য থাকা উচিত।
এখানে পৃথক parallel
এবং ব্যবহারের উদাহরণ for
এখানে । সংক্ষেপে এটি for
বিভিন্ন থ্রেডে চক্র চালানোর আগে ওপেনএমপি থ্রেড-প্রাইভেট অ্যারেগুলির গতিশীল বরাদ্দের জন্য ব্যবহার করা যেতে পারে । parallel for
ক্ষেত্রে একই সূচনাটি করা অসম্ভব ।
ইউপিডি: প্রশ্নের উদাহরণে একক প্রগমা এবং দুটি প্রগমের মধ্যে কোনও পার্থক্য নেই। তবে অনুশীলনে আপনি পৃথক সমান্তরাল এবং নির্দেশের জন্য আরও থ্রেড সচেতন আচরণ করতে পারেন। উদাহরণস্বরূপ কয়েকটি কোড:
#pragma omp parallel
{
double *data = (double*)malloc(...); // this data is thread private
#pragma omp for
for(1...100) // first parallelized cycle
{
}
#pragma omp single
{} // make some single thread processing
#pragma omp for // second parallelized cycle
for(1...100)
{
}
#pragma omp single
{} // make some single thread processing again
free(data); // free thread private data
}
যদিও অন্যান্য উদাহরণগুলিতে ইতিমধ্যে উল্লিখিত উদাহরণের উভয় সংস্করণ সমতুল্য, এখনও তাদের মধ্যে একটি ছোট পার্থক্য রয়েছে। প্রথম সংস্করণটিতে একটি অপ্রয়োজনীয় অন্তর্নিহিত বাধা রয়েছে, "omp for" এর শেষে এসেছিল। অন্যান্য অন্তর্নির্মিত বাধা সমান্তরাল অঞ্চলের শেষে পাওয়া যাবে। "Nowait" "" omp for "এ যুক্ত করা দুটি কোডকে সমতুল্য করবে, কমপক্ষে একটি ওপেনএমপি দৃষ্টিকোণ থেকে। আমি এটি উল্লেখ করছি কারণ একটি ওপেনএমপি সংকলক দুটি ক্ষেত্রে কিছুটা আলাদা কোড উত্পন্ন করতে পারে।
আমি যখন g ++ 4.7.0 এ লুপের জন্য এবং ব্যবহার করি তখন একেবারে আলাদা রানটাইমগুলি দেখতে পাচ্ছি
std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;
for (int i = 0; i < 5000000; i++)
{
double r1 = ((double)rand() / double(RAND_MAX)) * 5;
double r2 = ((double)rand() / double(RAND_MAX)) * 5;
x.push_back(r1);
y.push_back(r2);
}
int sz = x.size();
#pragma omp parallel for
for (int i = 0; i< sz; i++)
prod[i] = x[i] * y[i];
সিরিয়াল কোড (না openmp
) ms৯ এমএসে চলে। "সমান্তরাল জন্য" কোডটি 29 এমএসে চলে। আমি যদি বাদ পড়ে for
এবং ব্যবহার করি #pragma omp parallel
তবে রানটাইমটি 179 মিমি অবধি অঙ্কুরিত হয় যা সিরিয়াল কোডের চেয়ে ধীর। (মেশিনটির এইচডব্লিউ সম্মতি 8 টি)
কোড লিঙ্ক libgomp
#pragma omp for
লুপের কোনও মাল্টি-থ্রেড শেয়ারিং মোটেই নেই। তবে এটি কোনওভাবেই ওপিএস ক্ষেত্রে ছিল না, এর #pragma omp for
ভিতরে অতিরিক্ত দিয়ে আবার চেষ্টা করুন #pragm omp parallel
এবং এটি #pragma omp parallel for
সংস্করণটির মতোই (যদি একইরকম না হয়) চালানো উচিত ।
স্পষ্টতই প্রচুর উত্তর রয়েছে তবে এটি উত্তর সহ খুব সুন্দর করে দিয়েছে (উত্স সহ)
#pragma omp for
বর্তমান দলের বিভিন্ন থ্রেডের জন্য লুপের অংশগুলি কেবলমাত্র প্রতিনিধিত্ব করে । একটি দল প্রোগ্রামটি সম্পাদনকারী থ্রেডের গ্রুপ। প্রোগ্রাম শুরুর সময়, টিমটিতে কেবলমাত্র একক সদস্য থাকে: মাস্টার থ্রেড যা প্রোগ্রামটি চালায়।থ্রেডগুলির একটি নতুন দল তৈরি করতে আপনার সমান্তরাল কীওয়ার্ড নির্দিষ্ট করতে হবে। এটি পার্শ্ববর্তী প্রসঙ্গে নির্দিষ্ট করা যেতে পারে:
#pragma omp parallel { #pragma omp for for(int n = 0; n < 10; ++n) printf(" %d", n); }
এবং:
কী কী: সমান্তরাল, এবং একটি দল
সমান্তরাল, সমান্তরাল এবং এর জন্য পার্থক্য নিম্নরূপ:
একটি দল থ্রেডগুলির গোষ্ঠী যা বর্তমানে কার্যকর করে exec প্রোগ্রামের শুরুতে, দলটি একটি একক থ্রেড নিয়ে গঠিত। একটি সমান্তরাল কনস্ট্রাক্ট পরবর্তী ব্লক / স্টেটমেন্টের সময়কালের জন্য বর্তমান থ্রেডকে থ্রেডগুলির একটি নতুন দলে বিভক্ত করে, তার পরে দলটি আবার একটিতে মিশে যায়। বর্তমান দলের থ্রেডগুলির মধ্যে লুপের কাজটিকে বিভক্ত করে।
এটি থ্রেড তৈরি করে না, এটি কেবল বর্তমানে সম্পাদনকারী দলের থ্রেডগুলির মধ্যে কাজটিকে বিভক্ত করে। সমান্তরাল জন্য দুটি কমান্ডের জন্য একবারে শর্টহ্যান্ড: সমান্তরাল এবং জন্য। সমান্তরাল একটি নতুন দল তৈরি করে এবং সেই দলটিকে আলাদা করার জন্য লুপের বিভিন্ন অংশ পরিচালনা করতে পারে। যদি আপনার প্রোগ্রামে কখনও সমান্তরাল নির্মাণ থাকে না, একাধিক থ্রেড কখনও হয় না; মাস্টার থ্রেড যা প্রোগ্রামটি শুরু করে এবং এটি চালায়, নন-থ্রেডিং প্রোগ্রামগুলির মতো।
schedule(static, chunk)
নির্দেশের জন্য ক্লজটি ব্যবহার করি তখন আমার সমস্যা হয়। কোডটি ঠিকঠাক হয় তবে আমি যখন একটি এমপিআই প্রোগ্রাম থেকে এই কোডটি চালাচ্ছি তখন এটি অসীম লুপে চলে। এই লুপের সমস্ত পুনরাবৃত্তিতে লুপের কাউন্টারটি শূন্য। আমার কাছে লুপের কাউন্টারটি#pragma omp parallel
নির্দেশিকায় ব্যক্তিগত হিসাবে সংজ্ঞায়িত করা হয়েছে । এমপিআই কোডটি চালু করার সময় কেন এটি ব্যর্থ হয় সে সম্পর্কে কোনও ধারণা নেই। আমি কিছুটা নিশ্চিত যে প্রতিটি এমপিআই প্রক্রিয়া যদি বিষয়টি বিবেচনা করে তবে ক্লাস্টারের আলাদা প্রসেসরের উপর চলছে। সময়সূচী সমস্যা সৃষ্টি করছে কিনা ধারণা নেই।