ওপেনএমপি-তে পারমাণবিক ও সমালোচনার মধ্যে পার্থক্য কী?


111

ওপেনএমপি-তে পারমাণবিক ও সমালোচনার মধ্যে পার্থক্য কী?

আমি এটা করতে পারবো

#pragma omp atomic
g_qCount++;

তবে এর মতো নয়

#pragma omp critical
g_qCount++;

?

উত্তর:


173

G_qCount এ প্রভাবটি একই, তবে যা হয়েছে তা ভিন্ন।

একটি ওপেনএমপি সমালোচনা বিভাগটি সম্পূর্ণ সাধারণ - এটি কোডের যেকোন স্বেচ্ছাসেবী ব্লককে ঘিরে রাখতে পারে। আপনি সেই সাধারণতার জন্য অর্থ প্রদান করেন, তবে প্রতিবার একটি থ্রেড প্রবেশ করে এবং সমালোচনামূলক বিভাগটি (সিরিয়ালের অন্তর্নিহিত ব্যয়ের উপরে) থেকে বেরিয়ে আসে significant

(তদ্ব্যতীত, ওপেনএমপি-তে সমস্ত নামবিহীন সমালোচনামূলক বিভাগকে অভিন্ন হিসাবে বিবেচনা করা হয় (যদি আপনি পছন্দ করেন তবে সমস্ত নামবিহীন সমালোচনামূলক বিভাগগুলির জন্য কেবল একটি লক রয়েছে), যাতে উপরের মতো একটি থ্রেড যদি [[নামবিহীন] সমালোচনা বিভাগে থাকে তবে কোনও থ্রেড কোনও প্রবেশ করতে পারে না [নামবিহীন] সমালোচনা বিভাগ। আপনি যেমন অনুমান করতে পারেন, নামী সমালোচনামূলক বিভাগগুলি ব্যবহার করে আপনি এটি পেতে পারেন)।

পারমাণবিক অপারেশনের ওভারহেড অনেক কম থাকে। যেখানে উপলভ্য, এটি একটি পারমাণবিক বৃদ্ধি ক্রিয়াকলাপ সরবরাহ করার জন্য হার্ডওয়্যারটিতে সুবিধা গ্রহণ করে; সেক্ষেত্রে কোডের লাইনটি প্রবেশ / প্রস্থান করার জন্য কোনও লক / আনলকের প্রয়োজন নেই, এটি কেবলমাত্র পারমাণবিক বর্ধন করে যা হার্ডওয়্যার আপনাকে বলে যে আপনাকে হস্তক্ষেপ করা যাবে না।

আপসাইডগুলি হ'ল ওভারহেড অনেক কম, এবং একটি থ্রেড পারমাণবিক অপারেশনে থাকায় কোনও (পৃথক) পারমাণবিক ক্রিয়াকলাপ অবরুদ্ধ হয় না। ডাউনসাইড হ'ল অপারেশনগুলির সীমাবদ্ধ সেট যা পারমাণবিক সমর্থন করে।

অবশ্যই, উভয় ক্ষেত্রেই, আপনাকে সিরিয়ালাইজেশন ব্যয় করতে হবে।


5
"আপনি বহনযোগ্যতা হারাতে পারেন" - আমি নিশ্চিত না যে এটি সত্য। মান (সংস্করণ 2.0) নির্দিষ্ট করে যা পারমাণবিক অপারেশন অনুমতি দেওয়া হয় (মূলত ভালো জিনিস ++এবং *=) এবং যে যদি তারা হার্ডওয়্যার সমর্থিত নয়, তারা দ্বারা প্রতিস্থাপিত করা যেতে পারে criticalবিভাগে।
ড্যান আর

@ ড্যানরোচে: হ্যাঁ, আপনি ঠিক বলেছেন। আমি মনে করি না যে উক্তিটি কখনও সঠিক ছিল, আমি এখনই এটি সংশোধন করব।
জোনাথন দুরসি

কিছু দিন আগে আমি একটি ওপেনএমপি টিউটোরিয়াল অনুসরণ করেছি এবং যতদূর আমি বুঝতে পেরেছি, দুটি ভিন্ন কোডের মধ্যে পার্থক্য রয়েছে। ফলস্বরূপ, সমালোচনামূলক বিভাগটি আশ্বাস দেয় যে এক সময় থ্রেড দ্বারা নির্দেশনা কার্যকর করা হয়, তবে এটি সম্ভব: নির্দেশটি: g_qCount = g_qCount + 1; থ্রেড 1 এর জন্য কেবল g_qCount ফলাফল কেবল রাইট মেমরিতে নয় রাইটবফারে সংরক্ষণ করা হয় এবং থ্রেড 2 যখন g_qCount মান নিয়ে আসে তখন এটি রাইটের মধ্যে একটিটি পড়তে পারে, রাইটবফারটিতে নয়। পারমাণবিক নির্দেশনাটি আশ্বাস দেয় যে নির্দেশটি
ডেটাটিকে

31

ওপেনএমপি-তে, সমস্ত নামবিহীন সমালোচনা বিভাগগুলি পারস্পরিক একচেটিয়া।

সমালোচনামূলক এবং পারমাণবিক মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য হ'ল পারমাণবিক কেবল একটি একক কার্য রক্ষা করতে পারে এবং আপনি নির্দিষ্ট অপারেটরগুলির সাথে এটি ব্যবহার করতে পারেন।


13
এটি আগের উত্তরের একটি মন্তব্য (বা একটি সম্পাদনা) হতে পারে।
কিনান

20

জটিল অংশ:

  • কোডের ব্লকগুলির সিরিয়ালাইজেশন নিশ্চিত করে।
  • "নাম" ট্যাগের সঠিক ব্যবহারের সাথে ব্লকের গোষ্ঠীগুলির গ্রুপগুলিতে বাড়ানো যেতে পারে।

  • ধীরে!

পারমাণবিক অপারেশন:

  • অনেক দ্রুত!

  • কেবলমাত্র একটি নির্দিষ্ট ক্রিয়াকলাপের সিরিয়ালাইজেশন নিশ্চিত করে।


9
তবে এই উত্তরটি খুব পঠনযোগ্য এবং প্রথম উত্তরের একটি বড় যোগফল হবে
মিচা মিসজকিজিসিন

7

দ্রুততম উপায় সমালোচনা বা পারমাণবিকও নয়। আনুমানিক, সমালোচনামূলক বিভাগের সাথে সংযোজন সহজ সংযোজনের চেয়ে 200 গুণ বেশি ব্যয়বহুল, পারমাণবিক সংযোজন 25 গুণ বেশি ব্যয়বহুল এবং সাধারণ সংযোজন।

দ্রুততম বিকল্পটি (সর্বদা প্রযোজ্য নয়) হ'ল প্রতিটি থ্রেডকে তার নিজস্ব কাউন্টার দেওয়া এবং যখন আপনার মোট পরিমাণের প্রয়োজন হয় তখন হ্রাস অপারেশন করা।


2
আপনার ব্যাখ্যাতে আপনি উল্লিখিত সমস্ত সংখ্যার সাথে আমি একমত নই। X86_64 ধরে নিলে, পারমাণবিক অপারেশনটিতে মোটামুটি একটি চক্রের ব্যয়ে কয়েকটি চক্র ওভারহেড (একটি ক্যাশে লাইন সিঙ্ক্রোনাইজ করা) থাকবে। অন্যথায় যদি আপনার '' সত্য ভাগাভাগি '' ব্যয় হয় তবে ওভারহেড নিহিল। একটি সমালোচনামূলক বিভাগ একটি লকের দাম দেয়। লকটি ইতিমধ্যে নেওয়া হয়েছে কিনা তার উপর নির্ভর করে, ওভারহেড মোটামুটিভাবে 2 টি পারমাণবিক নির্দেশাবলী বা সময়সূচীর দুটি রান এবং ঘুমের সময় - এটি সাধারণত 200x এর চেয়ে বেশি হয়ে থাকে।
ক্লাস ভ্যান জেন্ড

6

সীমাবদ্ধতা atomicগুরুত্বপূর্ণ। তারা উপর বিশদ করা উচিতওপেনএমপি চশমাএমএসডিএন দ্রুত চিট শীট সরবরাহ করে কারণ এটি পরিবর্তন না হলে আমি অবাক হব না। (ভিজ্যুয়াল স্টুডিও 2012 এর মার্চ 2002 থেকে একটি ওপেনএমপি বাস্তবায়ন রয়েছে)) এমএসডিএনকে উদ্ধৃত করতে:

এক্সপ্রেশন বিবৃতিতে নিম্নলিখিত ফর্মগুলির একটি থাকতে হবে:

xবিনপ =expr

x++

++x

x--

--x

পূর্বের এক্সপ্রেশনগুলিতে: স্কেলার প্রকারের সাথে xএকটি lvalueপ্রকাশ। exprএটি স্কেলার প্রকারের সাথে একটি অভিব্যক্তি, এবং এটি কর্তৃক মনোনীত বস্তুর রেফারেন্স দেয় না xbinop একটি ওভারলোড অপারেটর নয় এবং এক +, *, -, /, &, ^, |,<< , অথবা >>

atomicআপনি যখন ব্যবহার করতে চান এবং আপনি অন্যথায় সমালোচনামূলক বিভাগগুলির নাম দেওয়ার পরামর্শ দিই । তাদের নামকরণ গুরুত্বপূর্ণ; আপনি এইভাবে মাথাব্যথা ডিবাগিং এড়াতে পারবেন।


1
এগুলিই নয়, আমাদের অন্যান্য উন্নত পারমাণবিক দিকনির্দেশনা রয়েছে যেমন: # প্রগমা ওম্প আর্মিক আপডেট (বা পড়ুন, উপস্থাপন করুন, লিখুন, ক্যাপচার করুন) সুতরাং এটি আমাদের আরও কিছু উপকারী বক্তব্য রাখতে দেয়
দুপুরে

1

ইতিমধ্যে এখানে দুর্দান্ত ব্যাখ্যা। তবে আমরা কিছুটা গভীর ডুব দিতে পারি। ওপেনএমপি-তে পারমাণবিক এবং সমালোচনামূলক বিভাগ ধারণার মধ্যে মূল পার্থক্য বুঝতে , আমাদের প্রথমে লকের ধারণাটি বুঝতে হবে । আসুন আমরা কেন লক ব্যবহার করতে হবে তা পর্যালোচনা করি

একটি সমান্তরাল প্রোগ্রাম একাধিক থ্রেড দ্বারা কার্যকর করা হচ্ছে। যদি এবং কেবল যদি আমরা সঞ্চালন নির্ণায়ক ফলাফল ঘটবে সিঙ্ক্রোনাইজেশন এই থ্রেড মধ্যে। অবশ্যই, থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজেশন সবসময় প্রয়োজন হয় না। আমরা সেই সব ক্ষেত্রে উল্লেখ করছি যে সিঙ্ক্রোনাইজেশন প্রয়োজনীয়।

বহু-থ্রেড প্রোগ্রামে থ্রেডগুলি সিঙ্ক্রোনাইজ করার জন্য , আমরা লক ব্যবহার করব । যখন অ্যাক্সেস একবারে কেবল একটি থ্রেড দ্বারা সীমাবদ্ধ করা প্রয়োজন, লক গুলি খেলতে আসে। লক ধারণা বাস্তবায়ন প্রসেসর থেকে প্রসেসর পরিবর্তিত হতে পারে। আসুন জেনে নেওয়া যাক যে অ্যালগোরিদমিক দৃষ্টিকোণ থেকে একটি সাধারণ লক কীভাবে কাজ করতে পারে।

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, ইত্যাদি) সম্পাদন করতে চান এবং ব্যবহার করতে চান তখন পারমাণবিক নির্দেশিকা ব্যবহার করার পরামর্শ দেওয়া হয়আরও সংখ্যক জটিল অঞ্চল যখন নিবিড় বিভাগ দ্বারা করা হচ্ছে তখন সমালোচনামূলক নির্দেশনা।


-5

পারমাণবিক অপেক্ষাকৃত পারফরম্যান্স দক্ষ যখন আপনার প্রয়োজন কেবলমাত্র একক নির্দেশাবলীর জন্য পারস্পরিক বর্জনকে সক্ষম করার জন্য omp সমালোচনা সম্পর্কে সত্য নয়।


13
এটি ব্যাখ্যা ব্যতিরেকে গ্রহণযোগ্য উত্তরের দুর্বল-কথিত পুনরায় পুনরুদ্ধার করা ছাড়া আর কিছুই নয়।
উচ্চ পারফরম্যান্স মার্ক

-5

পারমাণবিক একটি একক বিবৃতি সমালোচনামূলক বিভাগ, অর্থাৎ আপনি একটি বিবৃতি কার্যকর করার জন্য লক

সমালোচনা বিভাগটি কোডের একটি ব্লকের একটি লক

একটি ভাল সংকলক আপনার দ্বিতীয় কোডটিকে প্রথমভাবে একইভাবে অনুবাদ করবে


এটা ঠিক ভুল। আপনি যে জিনিসগুলি বুঝতে পারবেন না সে সম্পর্কে দয়া করে কথা বলবেন না।
jcsahnwaldt মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.