নিম্নলিখিত খুব সাধারণ কম্পিউটার প্রোগ্রাম বিবেচনা করুন:
for i = 1 to n:
y[i] = x[p[i]]
এখানে এবং হয় বাইটের -element অ্যারে, এবং একটি হল শব্দের -element অ্যারে। এখানে বড়, উদাহরণস্বরূপ, (যাতে ডেটাগুলির কেবল একটি नगনীয় ভগ্নাংশ কোনও ধরণের ক্যাশে স্মৃতিতে ফিট করে)।
ধরে নিন যে এলোমেলো সংখ্যা নিয়ে গঠিত, 1 এবং n এর মধ্যে সমানভাবে বিতরণ করা হয়েছে ।
আধুনিক হার্ডওয়্যার দৃষ্টিকোণ থেকে, এর অর্থ নিম্নলিখিত হওয়া উচিত:
- পড়া [ আমি ] সস্তা (ক্রমানুসারে পড়া)
- পড়া খুব ব্যয়বহুল (এলোমেলো পড়া; প্রায় সমস্ত পাঠই ক্যাশে মিস করে; আমাদের প্রতিটি স্বতন্ত্র বাইটকে মূল স্মৃতি থেকে আনতে হবে)
- লেখা [ i ] সস্তা (ক্রমানুসারে লেখা)।
এবং এটিই আমি পর্যবেক্ষণ করছি। প্রোগ্রামটি এমন প্রোগ্রামের সাথে তুলনা করে খুব ধীর হয় যা কেবলমাত্র অনুক্রমিক পড়া এবং লেখার কাজ করে। গ্রেট।
এখন প্রশ্ন আসে: আধুনিক মাল্টি-কোর প্ল্যাটফর্মগুলিতে এই প্রোগ্রামটি কতটা সমান্তরাল হয়?
আমার অনুমান ছিল যে এই প্রোগ্রামটি ভালভাবে সমান্তরাল হয় না। সর্বোপরি, বাধা প্রধান স্মৃতি। একটি একক কোর ইতিমধ্যে মূল স্মৃতি থেকে কিছু ডেটার জন্য অপেক্ষা করে এর বেশিরভাগ সময় নষ্ট করছে।
যাইহোক, আমি যখন কিছু অ্যালগরিদমের সাথে পরীক্ষা শুরু করলাম যেখানে বাধাটি এই ধরণের অপারেশন ছিল তা আমি লক্ষ্য করি নি !
আমি খালি নিখরচুর জন্য লুপের জন্য একটি ওপেনএমপি সমান্তরাল-লুপের সাথে প্রতিস্থাপন করেছি (সংক্ষেপে, এটি কেবলমাত্র এর পরিসরকে ছোট ছোট অংশে বিভক্ত করবে এবং এই অংশগুলিকে সমান্তরালে বিভিন্ন সিপিইউ কোরে চালিত করবে)।
লো-এন্ড কম্পিউটারগুলিতে, স্পিডআপগুলি সত্যই সামান্য ছিল। তবে উচ্চতর প্ল্যাটফর্মে আমি অবাক হয়েছি যে আমি খুব ভাল লিনিয়ার স্পিডআপগুলি পেয়ে যাচ্ছি। কয়েকটি কংক্রিট উদাহরণ (সঠিক সময়গুলি কিছুটা দূরে থাকতে পারে, এলোমেলো বিভিন্নতা রয়েছে; এগুলি কেবল দ্রুত পরীক্ষা-নিরীক্ষা ছিল):
2 এক্স 4-কোর জিয়ন (মোট 8 টি কোরে): একক-থ্রেড সংস্করণের তুলনায় ফ্যাক্টর 5-8 স্পিডআপগুলি।
2 এক্স 6-কোর জিয়ন (মোট 12 কোরে): একক-থ্রেডযুক্ত সংস্করণের তুলনায় 8-14 স্পিডআপগুলি ফ্যাক্টর।
এখন এটি সম্পূর্ণ অপ্রত্যাশিত ছিল। প্রশ্নাবলী:
স্পষ্টতই কেন এই ধরণের প্রোগ্রামটি এত ভালভাবে সমান্তরাল হয় ? হার্ডওয়ারে কী হয়? (আমার বর্তমান অনুমান এই রেখাগুলির পাশাপাশি কিছু: বিভিন্ন থ্রেড থেকে এলোমেলো পড়াগুলি "পাইপলাইনযুক্ত" এবং এগুলির উত্তর পাওয়ার গড় হার একক থ্রেডের তুলনায় অনেক বেশি))
কোনও স্পিডআপগুলি পেতে একাধিক থ্রেড এবং একাধিক কোর ব্যবহার করা কী প্রয়োজনীয় ? মূল স্মৃতি এবং সিপিইউর মধ্যে ইন্টারফেসে যদি কোনও ধরণের পাইপলাইনিং ঘটে থাকে তবে কোনও একক থ্রেডযুক্ত অ্যাপ্লিকেশন প্রধান মেমরিটিকে তা শিগগিরই জানতে দেয় না যে খুব শীঘ্রই এর জন্য , x [ p [ i + 1 ] ] , ... এবং কম্পিউটার মূল স্মৃতি থেকে প্রাসঙ্গিক ক্যাশে লাইন আনতে শুরু করতে পারে? যদি নীতিগতভাবে এটি সম্ভব হয় তবে আমি বাস্তবে এটি কীভাবে অর্জন করব?
সঠিক তাত্ত্বিক মডেল কী যা আমরা এই জাতীয় প্রোগ্রাম বিশ্লেষণ করতে (এবং পারফরম্যান্সের সঠিক ভবিষ্যদ্বাণী করতে পারি) ব্যবহার করতে পারি ?
সম্পাদনা করুন: এখন এখানে কিছু সোর্স কোড এবং মাপদণ্ডের ফলাফলগুলি পাওয়া যায়: https://github.com/suomela/parallel-random-read
বলপার্কের পরিসংখ্যানগুলির কয়েকটি উদাহরণ ( ):
- প্রায়. একক থ্রেড সহ পুনরাবৃত্তি (এলোমেলোভাবে পড়া) 42 এনএস
- প্রায়. 12 কোরের সাথে পুনরাবৃত্তির জন্য 5 এনএস (এলোমেলো পড়া)।