আমি কয়েক সপ্তাহ ধরে CUDA ব্যবহার করছি, তবে ব্লক / ওয়ার্পস / থ্রেডের বরাদ্দ সম্পর্কে আমার কিছু সন্দেহ রয়েছে। আমি একটি ডায়ডটিক দৃষ্টিকোণ (বিশ্ববিদ্যালয় প্রকল্প) থেকে স্থাপত্য অধ্যয়ন করছি , সুতরাং শীর্ষের সম্পাদনা পৌঁছানো আমার উদ্বেগ নয়।
প্রথমত, আমি বুঝতে চাই যে এই বিষয়গুলি সরাসরি পেয়েছি:
প্রোগ্রামার একটি কার্নেল লিখে, এবং থ্রেড ব্লকের একটি গ্রিডে এর সম্পাদনের ব্যবস্থা করে।
প্রতিটি ব্লক একটি স্ট্রিমিং মাল্টিপ্রসেসর (এসএম) এর জন্য বরাদ্দ করা হয়। একবার নিয়োগের পরে এটি অন্য এসএম-তে স্থানান্তরিত হতে পারে না।
প্রতিটি এসএম তার নিজস্ব ব্লকগুলি ওয়ার্পসে বিভক্ত করে (বর্তমানে সর্বাধিক 32 টি থ্রেডের আকার সহ)। একটি ওয়ার্পের সমস্ত থ্রেড এসএম এর সংস্থাগুলিতে একযোগে কার্যকর করে।
কোনও থ্রেডের আসল সম্পাদন এসএম এর মধ্যে থাকা কুডিএ কোর দ্বারা সম্পাদিত হয়। থ্রেড এবং কোরগুলির মধ্যে কোনও নির্দিষ্ট ম্যাপিং নেই।
যদি কোনও ওয়ার্পে 20 টি থ্রেড থাকে তবে বর্তমানে কেবল 16 টি কোর উপলব্ধ থাকে তবে ওয়ার্পটি চলবে না।
অন্যদিকে যদি কোনও ব্লকে 48 টি থ্রেড থাকে, তবে এটি 2 টি ওয়ার্পে বিভক্ত হবে এবং পর্যাপ্ত মেমরি উপলব্ধ থাকলে তারা সমান্তরালে সম্পাদন করবে।
কোনও থ্রেড যদি কোনও কোর থেকে শুরু হয়, তবে এটি মেমোরি অ্যাক্সেসের জন্য বা দীর্ঘ ভাসমান পয়েন্ট অপারেশনের জন্য স্থগিত হয়, এর কার্যকরকরণটি অন্য কোনও কোরতে আবার শুরু হতে পারে।
তারা সঠিক?
এখন, আমার কাছে একটি জিওফোরস 560 টি রয়েছে তাই নির্দিষ্টকরণ অনুসারে এটি 8 এসএম সহ সজ্জিত রয়েছে, যার প্রত্যেকটিতে 48 টি সিউডিএ কোর (মোট 384 টি কোর) রয়েছে।
আমার লক্ষ্যটি নিশ্চিত করা যে আর্কিটেকচারের প্রতিটি কোর একই নির্দেশাবলী কার্যকর করে। ধরে নিলাম যে আমার কোডে প্রতিটি এসএম-এ পাওয়া যায় তার চেয়ে বেশি নিবন্ধকের প্রয়োজন হবে না, আমি বিভিন্ন পদ্ধতির কল্পনা করেছি:
আমি প্রতিটি 48 টি থ্রেডের 8 টি ব্লক তৈরি করি, যাতে প্রতিটি এসএমের সম্পাদন করার জন্য 1 টি ব্লক থাকে। এই ক্ষেত্রে 48 টি থ্রেডগুলি এসএম এর সমান্তরালভাবে কার্যকর হবে (তাদের জন্য উপলব্ধ 48 টি কোর ব্যবহার করে)?
যদি আমি 6 টি থ্রেডের 64 টি ব্লক চালু করি তবে কি কোনও পার্থক্য রয়েছে? (ধরে নিই যে তারা এসএমগুলির মধ্যে সমানভাবে ম্যাপ করা হবে)
যদি আমি নির্ধারিত কাজে জিপিইউটিকে "নিমজ্জন" করি (উদাহরণস্বরূপ, প্রতিটি 1024 থ্রেডের 1024 ব্লক তৈরি করা হয়) তবে এই ধারণাটি যুক্তিসঙ্গত হয় যে সমস্ত কোর একটি নির্দিষ্ট পয়েন্টে ব্যবহৃত হবে, এবং একই গণনা সম্পাদন করবে (ধরে নিবেন যে থ্রেডগুলি ধরে রেখেছেন) কখনও স্টল) না?
প্রোফাইলার ব্যবহার করে এই পরিস্থিতিগুলি চেক করার কোনও উপায় আছে কি?
এই জিনিস জন্য কোন রেফারেন্স আছে? আমি CUDA প্রোগ্রামিং গাইড এবং "প্রোগ্রামিং ম্যাসিভলি প্যারালাল প্রসেসর" এবং "CUDA অ্যাপ্লিকেশন ডিজাইন এবং বিকাশ" এ হার্ডওয়্যার আর্কিটেকচারকে উত্সর্গীকৃত অধ্যায়গুলি পড়েছি; তবে আমি সুনির্দিষ্ট উত্তর পেতে পারি না।