ওপেনএমপি-তে পারমাণবিক ও সমালোচনার মধ্যে পার্থক্য কী?
আমি এটা করতে পারবো
#pragma omp atomic
g_qCount++;
তবে এর মতো নয়
#pragma omp critical
g_qCount++;
?
ওপেনএমপি-তে পারমাণবিক ও সমালোচনার মধ্যে পার্থক্য কী?
আমি এটা করতে পারবো
#pragma omp atomic
g_qCount++;
তবে এর মতো নয়
#pragma omp critical
g_qCount++;
?
উত্তর:
G_qCount এ প্রভাবটি একই, তবে যা হয়েছে তা ভিন্ন।
একটি ওপেনএমপি সমালোচনা বিভাগটি সম্পূর্ণ সাধারণ - এটি কোডের যেকোন স্বেচ্ছাসেবী ব্লককে ঘিরে রাখতে পারে। আপনি সেই সাধারণতার জন্য অর্থ প্রদান করেন, তবে প্রতিবার একটি থ্রেড প্রবেশ করে এবং সমালোচনামূলক বিভাগটি (সিরিয়ালের অন্তর্নিহিত ব্যয়ের উপরে) থেকে বেরিয়ে আসে significant
(তদ্ব্যতীত, ওপেনএমপি-তে সমস্ত নামবিহীন সমালোচনামূলক বিভাগকে অভিন্ন হিসাবে বিবেচনা করা হয় (যদি আপনি পছন্দ করেন তবে সমস্ত নামবিহীন সমালোচনামূলক বিভাগগুলির জন্য কেবল একটি লক রয়েছে), যাতে উপরের মতো একটি থ্রেড যদি [[নামবিহীন] সমালোচনা বিভাগে থাকে তবে কোনও থ্রেড কোনও প্রবেশ করতে পারে না [নামবিহীন] সমালোচনা বিভাগ। আপনি যেমন অনুমান করতে পারেন, নামী সমালোচনামূলক বিভাগগুলি ব্যবহার করে আপনি এটি পেতে পারেন)।
পারমাণবিক অপারেশনের ওভারহেড অনেক কম থাকে। যেখানে উপলভ্য, এটি একটি পারমাণবিক বৃদ্ধি ক্রিয়াকলাপ সরবরাহ করার জন্য হার্ডওয়্যারটিতে সুবিধা গ্রহণ করে; সেক্ষেত্রে কোডের লাইনটি প্রবেশ / প্রস্থান করার জন্য কোনও লক / আনলকের প্রয়োজন নেই, এটি কেবলমাত্র পারমাণবিক বর্ধন করে যা হার্ডওয়্যার আপনাকে বলে যে আপনাকে হস্তক্ষেপ করা যাবে না।
আপসাইডগুলি হ'ল ওভারহেড অনেক কম, এবং একটি থ্রেড পারমাণবিক অপারেশনে থাকায় কোনও (পৃথক) পারমাণবিক ক্রিয়াকলাপ অবরুদ্ধ হয় না। ডাউনসাইড হ'ল অপারেশনগুলির সীমাবদ্ধ সেট যা পারমাণবিক সমর্থন করে।
অবশ্যই, উভয় ক্ষেত্রেই, আপনাকে সিরিয়ালাইজেশন ব্যয় করতে হবে।
ওপেনএমপি-তে, সমস্ত নামবিহীন সমালোচনা বিভাগগুলি পারস্পরিক একচেটিয়া।
সমালোচনামূলক এবং পারমাণবিক মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য হ'ল পারমাণবিক কেবল একটি একক কার্য রক্ষা করতে পারে এবং আপনি নির্দিষ্ট অপারেটরগুলির সাথে এটি ব্যবহার করতে পারেন।
জটিল অংশ:
"নাম" ট্যাগের সঠিক ব্যবহারের সাথে ব্লকের গোষ্ঠীগুলির গ্রুপগুলিতে বাড়ানো যেতে পারে।
ধীরে!
পারমাণবিক অপারেশন:
অনেক দ্রুত!
কেবলমাত্র একটি নির্দিষ্ট ক্রিয়াকলাপের সিরিয়ালাইজেশন নিশ্চিত করে।
দ্রুততম উপায় সমালোচনা বা পারমাণবিকও নয়। আনুমানিক, সমালোচনামূলক বিভাগের সাথে সংযোজন সহজ সংযোজনের চেয়ে 200 গুণ বেশি ব্যয়বহুল, পারমাণবিক সংযোজন 25 গুণ বেশি ব্যয়বহুল এবং সাধারণ সংযোজন।
দ্রুততম বিকল্পটি (সর্বদা প্রযোজ্য নয়) হ'ল প্রতিটি থ্রেডকে তার নিজস্ব কাউন্টার দেওয়া এবং যখন আপনার মোট পরিমাণের প্রয়োজন হয় তখন হ্রাস অপারেশন করা।
সীমাবদ্ধতা atomic
গুরুত্বপূর্ণ। তারা উপর বিশদ করা উচিতওপেনএমপি চশমা । এমএসডিএন দ্রুত চিট শীট সরবরাহ করে কারণ এটি পরিবর্তন না হলে আমি অবাক হব না। (ভিজ্যুয়াল স্টুডিও 2012 এর মার্চ 2002 থেকে একটি ওপেনএমপি বাস্তবায়ন রয়েছে)) এমএসডিএনকে উদ্ধৃত করতে:
এক্সপ্রেশন বিবৃতিতে নিম্নলিখিত ফর্মগুলির একটি থাকতে হবে:
x
বিনপ =expr
x++
++x
x--
--x
পূর্বের এক্সপ্রেশনগুলিতে: স্কেলার প্রকারের সাথে
x
একটিlvalue
প্রকাশ।expr
এটি স্কেলার প্রকারের সাথে একটি অভিব্যক্তি, এবং এটি কর্তৃক মনোনীত বস্তুর রেফারেন্স দেয় নাx
। binop একটি ওভারলোড অপারেটর নয় এবং এক+
,*
,-
,/
,&
,^
,|
,<<
, অথবা>>
।
atomic
আপনি যখন ব্যবহার করতে চান এবং আপনি অন্যথায় সমালোচনামূলক বিভাগগুলির নাম দেওয়ার পরামর্শ দিই । তাদের নামকরণ গুরুত্বপূর্ণ; আপনি এইভাবে মাথাব্যথা ডিবাগিং এড়াতে পারবেন।
ইতিমধ্যে এখানে দুর্দান্ত ব্যাখ্যা। তবে আমরা কিছুটা গভীর ডুব দিতে পারি। ওপেনএমপি-তে পারমাণবিক এবং সমালোচনামূলক বিভাগ ধারণার মধ্যে মূল পার্থক্য বুঝতে , আমাদের প্রথমে লকের ধারণাটি বুঝতে হবে । আসুন আমরা কেন লক ব্যবহার করতে হবে তা পর্যালোচনা করি ।
একটি সমান্তরাল প্রোগ্রাম একাধিক থ্রেড দ্বারা কার্যকর করা হচ্ছে। যদি এবং কেবল যদি আমরা সঞ্চালন নির্ণায়ক ফলাফল ঘটবে সিঙ্ক্রোনাইজেশন এই থ্রেড মধ্যে। অবশ্যই, থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজেশন সবসময় প্রয়োজন হয় না। আমরা সেই সব ক্ষেত্রে উল্লেখ করছি যে সিঙ্ক্রোনাইজেশন প্রয়োজনীয়।
বহু-থ্রেড প্রোগ্রামে থ্রেডগুলি সিঙ্ক্রোনাইজ করার জন্য , আমরা লক ব্যবহার করব । যখন অ্যাক্সেস একবারে কেবল একটি থ্রেড দ্বারা সীমাবদ্ধ করা প্রয়োজন, লক গুলি খেলতে আসে। লক ধারণা বাস্তবায়ন প্রসেসর থেকে প্রসেসর পরিবর্তিত হতে পারে। আসুন জেনে নেওয়া যাক যে অ্যালগোরিদমিক দৃষ্টিকোণ থেকে একটি সাধারণ লক কীভাবে কাজ করতে পারে।
1. Define a variable called lock.
2. For each thread:
2.1. Read the lock.
2.2. If lock == 0, lock = 1 and goto 3 // Try to grab the lock
Else goto 2.1 // Wait until the lock is released
3. Do something...
4. lock = 0 // Release the lock
প্রদত্ত অ্যালগরিদম নিম্নলিখিতভাবে হার্ডওয়্যার ভাষায় প্রয়োগ করা যেতে পারে। আমরা একটি একক প্রসেসর ধরে নেব এবং এতে থাকা লকের আচরণ বিশ্লেষণ করব। : এই অনুশীলন জন্য, এর নিম্নলিখিত প্রসেসর এক অনুমান করা যাক MIPS , আলফা , এআরএম বা পাওয়ার ।
try: LW R1, lock
BNEZ R1, try
ADDI R1, R1, #1
SW R1, lock
এই প্রোগ্রামটি ঠিক আছে বলে মনে হচ্ছে, তবে তা নয়। উপরের কোডটি পূর্ববর্তী সমস্যায় ভোগে; সিঙ্ক্রোনাইজেশন । আসুন সমস্যাটি খুঁজে বার করুন। লকের প্রাথমিক মানটি শূন্য হিসাবে ধরে নিন। যদি দুটি থ্রেড এই কোডটি চালায়, অন্যটি লক ভেরিয়েবলটি পড়ার আগেই একটি এসডাব্লু আর 1 এ পৌঁছে যেতে পারে lock সুতরাং, দুজনেই ভাবেন যে লকটি মুক্ত। এই সমস্যা সমাধানের জন্য, সেখানে সহজ বদলে দেওয়া আরেকটি নির্দেশ হল দৈর্ঘ্য-প্রস্থ এবং দঃপঃ । একে রিড-মডিফাই-রাইটিং ইন্সট্রাকশন বলা হয়। এটি একটি জটিল নির্দেশ (সাবিনস্ট্রাকশন সহ) যা নিশ্চিত করে যে লক অধিগ্রহণ প্রক্রিয়াটি কেবলমাত্র একক দ্বারা সম্পন্ন হয়েছে । সহজ - তুলনায় পড়ুন-পরিবর্তন করুন-লেখার পার্থক্য পড়ুন এবং লিখুন নির্দেশাবলী এটি একটি অন্যভাবে ব্যবহার করে লোড হচ্ছে এবং সংরক্ষণ । লক ভেরিয়েবলটি লোড করতে এটি এলএল (লোডযুক্ত) এবং এসসি (স্টোর কন্ডিশনাল) ব্যবহার করে লক ভেরিয়েবলটি লিখতে। লক অধিগ্রহণের প্রক্রিয়াটি একটি থ্রেড দ্বারা সম্পন্ন করা হয়েছে তা নিশ্চিত করার জন্য একটি অতিরিক্ত লিঙ্ক রেজিস্টার ব্যবহার করা হয়। অ্যালগরিদম নীচে দেওয়া হয়েছে।
1. Define a variable called lock.
2. For each thread:
2.1. Read the lock and put the address of lock variable inside the Link Register.
2.2. If (lock == 0) and (&lock == Link Register), lock = 1 and reset the Link Register then goto 3 // Try to grab the lock
Else goto 2.1 // Wait until the lock is released
3. Do something...
4. lock = 0 // Release the lock
লিংক রেজিস্টারটি পুনরায় সেট করা হয়ে গেলে, অন্য কোনও থ্রেডটি যদি লকটি নিখরচায় ধরে নিয়েছে, তবে এটি আবার লকটিতে বর্ধিত মান লিখতে সক্ষম হবে না। সুতরাং, লক ভেরিয়েবলটি অ্যাক্সেসের একত্রে সংগৃহীত হয়।
সমালোচক এবং পারমাণবিক মধ্যে মূল পার্থক্য ধারণা থেকে আসে যে:
লক ভেরিয়েবল হিসাবে আমরা আসল ভেরিয়েবলটি (যা আমরা এটিতে একটি ক্রিয়াকলাপটি চালাচ্ছি) ব্যবহার করতে পারার সময় কেন লকগুলি (একটি নতুন ভেরিয়েবল) ব্যবহার করবেন?
লকগুলির জন্য একটি নতুন ভেরিয়েবল ব্যবহার করা সমালোচনামূলক বিভাগে নিয়ে যায় , যখন প্রকৃত পরিবর্তনশীলটিকে লক হিসাবে ব্যবহার করা পারমাণবিক ধারণার দিকে নিয়ে যায় । সমালোচনা বিভাগটি কার্যকর যখন আমরা প্রকৃত ভেরিয়েবলের উপর প্রচুর গণনা (একাধিক লাইন) সম্পাদন করি। এর কারণ, যদি সেই সংখ্যার ফলাফল প্রকৃত পরিবর্তনশীলটিতে লেখা যায় না, তবে ফলাফলটি গণনা করার জন্য পুরো পদ্ধতিটি পুনরাবৃত্তি করা উচিত। এটি উচ্চ-গণনামূলক অঞ্চলে প্রবেশের আগে লকটি প্রকাশের অপেক্ষার তুলনায় দুর্বল পারফরম্যান্সের দিকে নিয়ে যেতে পারে। সুতরাং, আপনি যখনই একটি একক গণনা (x ++, x--, ++ x, --x, ইত্যাদি) সম্পাদন করতে চান এবং ব্যবহার করতে চান তখন পারমাণবিক নির্দেশিকা ব্যবহার করার পরামর্শ দেওয়া হয়আরও সংখ্যক জটিল অঞ্চল যখন নিবিড় বিভাগ দ্বারা করা হচ্ছে তখন সমালোচনামূলক নির্দেশনা।
পারমাণবিক অপেক্ষাকৃত পারফরম্যান্স দক্ষ যখন আপনার প্রয়োজন কেবলমাত্র একক নির্দেশাবলীর জন্য পারস্পরিক বর্জনকে সক্ষম করার জন্য omp সমালোচনা সম্পর্কে সত্য নয়।
পারমাণবিক একটি একক বিবৃতি সমালোচনামূলক বিভাগ, অর্থাৎ আপনি একটি বিবৃতি কার্যকর করার জন্য লক
সমালোচনা বিভাগটি কোডের একটি ব্লকের একটি লক
একটি ভাল সংকলক আপনার দ্বিতীয় কোডটিকে প্রথমভাবে একইভাবে অনুবাদ করবে
++
এবং*=
) এবং যে যদি তারা হার্ডওয়্যার সমর্থিত নয়, তারা দ্বারা প্রতিস্থাপিত করা যেতে পারেcritical
বিভাগে।