সিইডিএ গ্রিডের মাত্রা, ব্লক মাত্রা এবং থ্রেড সংগঠন বোঝা (সহজ ব্যাখ্যা) [বন্ধ]


161

কোনও জিপিইউ দ্বারা চালিত করার জন্য থ্রেডগুলি কীভাবে সংগঠিত করা হয়?


CUDA প্রোগ্রামিং গাইড এর জন্য শুরু করার জন্য ভাল জায়গা হওয়া উচিত। আমিও থেকে CUDA ভূমিকা চেক আউট সুপারিশ করবে এখানে
টম

উত্তর:


287

হার্ডওয়্যারের

যদি কোনও জিপিইউ ডিভাইসটিতে, উদাহরণস্বরূপ, 4 টি মাল্টিপ্রসেসিং ইউনিট রয়েছে এবং তারা প্রতিটি 768 থ্রেড চালাতে পারে: তবে নির্দিষ্ট মুহুর্তে 4 * 768 টির বেশি থ্রেড আসলেই সমান্তরালে চলবে না (যদি আপনি আরও থ্রেডের পরিকল্পনা করেন তবে তারা অপেক্ষা করবে) তাদের পালা)।

সফটওয়্যার

থ্রেডগুলি ব্লকগুলিতে সংগঠিত হয়। একটি ব্লক একটি মাল্টিপ্রসেসিং ইউনিট দ্বারা কার্যকর করা হয়। 1 মাত্রা (এক্স), 2 মাত্রা (এক্স, ওয়াই) বা 3 ডিিম ইনডেক্স (এক্স, ওয়াই, জেড) ব্যবহার করে একটি ব্লকের থ্রেডগুলি শোধিত (সূচিকৃত) হতে পারে তবে যে কোনও ক্ষেত্রে x y z <= 768 আমাদের উদাহরণের জন্য (অন্যান্য বিধিনিষেধগুলি প্রযোজ্য) এক্স, ওয়াই, জেড, গাইড এবং আপনার ডিভাইসের ক্ষমতা দেখুন)।

স্পষ্টতই, যদি আপনার 4 * 768 থ্রেডের বেশি প্রয়োজন হয় তবে আপনার 4 টিরও বেশি ব্লক প্রয়োজন। ব্লকগুলি 1D, 2D বা 3 ডি সূচকযুক্তও হতে পারে। জিপিইউতে প্রবেশের জন্য অপেক্ষারত ব্লকের একটি সারি রয়েছে (কারণ, আমাদের উদাহরণস্বরূপ, জিপিইউতে 4 টি মাল্টিপ্রসেসর রয়েছে এবং কেবলমাত্র 4 টি ব্লক একযোগে কার্যকর করা হচ্ছে)।

এখন একটি সহজ কেস: একটি 512x512 চিত্র প্রক্রিয়াকরণ

মনে করুন আমরা একটি পিক্সেল (i, j) প্রক্রিয়াকরণের জন্য একটি থ্রেড চাই।

আমরা প্রতিটি 64 টি থ্রেডের ব্লক ব্যবহার করতে পারি। তারপরে আমাদের 512 * 512/64 = 4096 ব্লক প্রয়োজন (সুতরাং 512x512 থ্রেড থাকতে হবে = 4096 * 64)

2D ব্লকের ব্লকডিম = 8 x 8 (প্রতি ব্লকের 64 টি থ্রেড) থ্রেডগুলি সংগঠিত করা (চিত্রটিকে আরও সহজ করার জন্য সহজ করার জন্য) সাধারণ। আমি এটিকে থ্রেড পেরব্লক বলতে পছন্দ করি।

dim3 threadsPerBlock(8, 8);  // 64 threads

এবং 2 ডি গ্রিডডিম = 64 এক্স 64 ব্লক (4096 ব্লক প্রয়োজন)। আমি এটিকে নাম্বার ব্লক করতে পছন্দ করি।

dim3 numBlocks(imageWidth/threadsPerBlock.x,  /* for instance 512/8 = 64*/
              imageHeight/threadsPerBlock.y); 

কার্নেলটি এভাবে চালু হয়:

myKernel <<<numBlocks,threadsPerBlock>>>( /* params for the kernel function */ );       

শেষ পর্যন্ত: "4096 ব্লকের একটি সারি" এর মতো কিছু থাকবে, যেখানে ব্লকটি তার 64 টি থ্রেড কার্যকর করার জন্য জিপিইউর মাল্টিপ্রসেসরগুলির মধ্যে একটি নির্ধারিত হওয়ার অপেক্ষায় রয়েছে।

কার্নেলে থ্রেড দ্বারা প্রক্রিয়া করা পিক্সেল (i, j) এইভাবে গণনা করা হয়:

uint i = (blockIdx.x * blockDim.x) + threadIdx.x;
uint j = (blockIdx.y * blockDim.y) + threadIdx.y;

11
যদি প্রতিটি ব্লক 768 থ্রেড চালাতে পারে তবে কেন কেবল 64 টি ব্যবহার করবেন? আপনি যদি 768 এর সর্বাধিক সীমা ব্যবহার করেন তবে আপনার কম ব্লক এবং আরও ভাল পারফরম্যান্স থাকবে।
আলিজা

10
@ আলিজা: ব্লকগুলি যৌক্তিক , প্রতিটি শারীরিক প্রক্রিয়াকরণ ইউনিটের জন্য 768 থ্রেডের সীমা । কাজগুলি থ্রেডে বিতরণের জন্য আপনি আপনার সমস্যার স্পেসিফিকেশন অনুসারে ব্লক ব্যবহার করেন। এমনটি সম্ভবত নয় যে আপনি নিজের সমস্যার জন্য সর্বদা 768 থ্রেডের ব্লক ব্যবহার করতে পারেন। কল্পনা করুন আপনার একটি 64x64 চিত্র (4096 পিক্সেল) প্রসেস করতে হবে। 4096/768 = 5.333333 ব্লক?
cibercitizen1

1
ব্লকটি যৌক্তিক, তবে প্রতিটি ব্লক একটি কোরকে বরাদ্দ করা হয়। কোরের চেয়ে আরও বেশি ব্লক থাকলে, কোরগুলি মুক্ত না হওয়া অবধি ব্লকগুলি সারিবদ্ধ থাকে। আপনার উদাহরণে আপনি 6 টি ব্লক ব্যবহার করতে পারেন এবং অতিরিক্ত থ্রেড কিছুই করতে পারবেন না (6th ষ্ঠ ব্লকের থ্রেডগুলির 2/3)।
আলিজা

3
@ সিবারসিটিজেন 1 - আমি মনে করি আলিজার বিষয়টি একটি ভাল: যদি সম্ভব হয় তবে একজন ব্লক হিসাবে যতটা সম্ভব থ্রেড ব্যবহার করতে চান। যদি কোনও বাধা থাকে যার জন্য কম থ্রেডের প্রয়োজন হয়, তবে এটি দ্বিতীয় উদাহরণে কেন হতে পারে তা ব্যাখ্যা করা ভাল (তবে এখনও সহজ এবং আরও আকাঙ্ক্ষিত কেসটি প্রথমে ব্যাখ্যা করুন)।

6
@ থুইস হ্যাঁ, সম্ভবত। তবে কেসটি হ'ল প্রতিটি থ্রেডের জন্য প্রয়োজনীয় পরিমাণ মেমরি অ্যাপ্লিকেশন নির্ভর। উদাহরণস্বরূপ, আমার শেষ প্রোগ্রামে, প্রতিটি থ্রেড একটি "স্ক্রিন মেমরি" প্রয়োজন, একটি সর্বনিম্ন-স্কোয়ার অনুকূলকরণ ফাংশন প্রার্থনা করে। এত বেশি, যে ব্লকগুলি 4x4 থ্রেডের চেয়ে বড় হতে পারে না। তবুও প্রাপ্ত গতিসম্পন্নটি নাটকীয় ছিল, সিক্যুয়াল সংস্করণ বনাম।
সিবারসিটিজেন 1

9

ধরুন একটি 9800GT জিপিইউ:

  • এটির 14 টি মাল্টিপ্রসেসর রয়েছে (এসএম)
  • প্রতিটি এসএমের 8 টি থ্রেড-প্রসেসর রয়েছে (একে স্ট্রিম-প্রসেসর, এসপি বা কোর)
  • প্রতি ব্লকে 512 থ্রেড পর্যন্ত অনুমতি দেয়
  • ওয়ার্পসাইজটি 32 (যার অর্থ 14x8 = 112 থ্রেড-প্রসেসরের প্রত্যেকটি 32 টি থ্রেড পর্যন্ত নির্ধারণ করতে পারে)

https://www.tutorialspoint.com/cuda/cuda_threads.htm

একটি ব্লকে 512 এর চেয়ে বেশি সক্রিয় থ্রেড থাকতে পারে না তাই __syncthreadsকেবল সীমিত সংখ্যক থ্রেডকে সিঙ্ক্রোনাইজ করতে পারে। যেমন আপনি যদি 600 টি থ্রেড দিয়ে নিম্নলিখিতটি সম্পাদন করেন:

func1();
__syncthreads();
func2();
__syncthreads();

তারপরে কার্নেলটি অবশ্যই দু'বার চালানো হবে এবং কার্যকর করার আদেশটি হবে:

  1. func1 প্রথম 512 থ্রেডের জন্য কার্যকর করা হয়
  2. func2 প্রথম 512 থ্রেডের জন্য কার্যকর করা হয়
  3. বাকি থ্রেডগুলির জন্য ফানক 1 কার্যকর করা হয়
  4. func2 বাকি থ্রেডের জন্য কার্যকর করা হয়

বিঃদ্রঃ:

মূল বিষয়টি হ'ল __syncthreadsএকটি ব্লক-ওয়াইড অপারেশন এবং এটি সমস্ত থ্রেডকে সিঙ্ক্রোনাইজ করে না।


__syncthreadsসিঙ্ক্রোনাইজ করা যায় এমন থ্রেডগুলির সঠিক সংখ্যা সম্পর্কে আমি নিশ্চিত নই , যেহেতু আপনি 512 টিরও বেশি থ্রেড সহ একটি ব্লক তৈরি করতে এবং ওয়ার্পকে সময়সূচীটি পরিচালনা করতে দিতে পারেন। আমার বোঝার জন্য এটি বলার অপেক্ষা রাখে না আরও সঠিক: ফানক 1 কমপক্ষে প্রথম 512 থ্রেডের জন্য কার্যকর করা হয়।

আমি এই উত্তরটি সম্পাদনা করার আগে (২০১০ সালে ফিরে) আমার মাপা 14x8x32 থ্রেডগুলি ব্যবহার করে সিঙ্ক্রোনাইজ করা হয়েছিল __syncthreads

যদি কেউ আরও তথ্যের আরও সঠিক অংশের জন্য এটি আবার পরীক্ষা করে দেখে আমি প্রশংসা করব।


ফানক 2 () ফানক 1 () এর ফলাফলের উপর নির্ভর করে তবে কী ঘটে। আমি মনে করি এটি ভুল
ক্রিস

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

দুঃখিত, আমি মনে করি এটিও ভুল, জিপিইউ একযোগে 112 থ্রেড চালাতে পারে।
স্টিভেন লু

@ স্টেভেনলু আপনি কি চেষ্টা করে দেখেছেন? এছাড়াও আমি মনে করি না 112 সাম্প্রতিক থ্রেডগুলি একটি জিপিইউর জন্য কোনও ধারণা দেয়। 112 হ'ল স্ট্রিম প্রসেসরের সংখ্যা। আমি এখনই
চুদা

1
@ স্টিভেনলু সর্বোচ্চ সংখ্যক থ্রেড এখানে সমস্যা নয়, __syncthreadsএটি একটি ব্লক-ওয়াইড অপারেশন এবং এটি সত্য যে এটি সমস্ত থ্রেডকে সিঙ্ক্রোনাইজ করে না এটি সিউডিএ শিখারীদের উপদ্রব। সুতরাং আপনি আমাকে যে তথ্য দিয়েছেন তার ভিত্তিতে আমি আমার উত্তর আপডেট করেছি। আমি সত্যিই এটার প্রশংসা করছি.
বিজন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.