باستخدام متغير الجهاز بواسطة مؤشرات ترابط متعددة على CUDA
-
20-09-2019 - |
سؤال
أنا ألعب مع كودا.
في الوقت الحالي لدي مشكلة. أنا أختبر صفيفًا كبيرًا لاستجابات معينة ، وعندما أحصل على الاستجابة ، يجب علي نسخ البيانات إلى صفيف آخر.
على سبيل المثال ، يبدو أن صفيف الاختبار الخاص بي من 5 عناصر يبدو:
] [] [V1] [] [] [V2
يجب أن تبدو النتيجة هكذا:
V1] [V2
المشكلة هي كيف يمكنني حساب عنوان الصفيف الثاني لتخزين النتيجة؟ يتم فحص جميع عناصر الصفيف الأول بالتوازي.
أفكر في إعلان متغير الجهاز int addr = 0. في كل مرة أجد فيها الرد ، سأقوم بزيادة addr. لكنني لست متأكدًا من ذلك لأنه يعني ذلك addr يمكن الوصول إليها بواسطة سلاسل خيوط متعددة في نفس الوقت. هل سيؤدي ذلك إلى مشاكل؟ أم أن الخيط ينتظر حتى ينتهي مؤشر ترابط آخر باستخدام هذا المتغير؟
المحلول
ليس تافهة كما يبدو. لقد انتهيت للتو من تنفيذ واحدة ويمكنني أن أقول ما تحتاجه قراءة مسح مقالة GPU GEMS 3 على وجه الخصوص الفصل 39.3.1 دفق الضغط.
لتنفيذ بدايتك الخاصة من مثال HargeArrayscan في SDK ، فإن ذلك سيعطيك prescan فقط. على افتراض أن لديك صفيف التحديد في ذاكرة الجهاز (صفيف من 1 و 0 يعني 1- حدد 0 - تجاهل) ، dev_selection_array أ dev_elements_array العناصر المراد اختيارها أ dev_prescan_array و dev_result_array كل الحجم ن ثم تفعل
prescan(dev_prescan_array,dev_selection_array, N);
scatter(dev_result_array, dev_prescan_array,
dev_selection_array, dev_elements_array, N);
حيث يوجد مبعثر
__global__ void scatter_kernel( T*dev_result_array,
const T* dev_prescan_array,
const T* dev_selection_array,
const T* dev_elements_array, std::size_t size){
unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size) return;
if (dev_selection_array[idx] == 1){
dev_result_array[dev_prescan_array[idx]] = dev_elements_array[idx];
}
}
للاطلاع على تطبيق لطيف آخر للسبكان ، انظر الورقة Ble93
استمتع!