تحسين CUDA مع دفع في حلقة
سؤال
بالنظر إلى القطعة التالية من التعليمات البرمجية، توليد نوع من القاموس التعليمات البرمجية مع CUDA باستخدام Fugust (مكتبة قالب C ++ ل CUDA):
thrust::device_vector<float> dCodes(codes->begin(), codes->end());
thrust::device_vector<int> dCounts(counts->begin(), counts->end());
thrust::device_vector<int> newCounts(counts->size());
for (int i = 0; i < dCodes.size(); i++) {
float code = dCodes[i];
int count = thrust::count(dCodes.begin(), dCodes.end(), code);
newCounts[i] = dCounts[i] + count;
//Had we already a count in one of the last runs?
if (dCounts[i] > 0) {
newCounts[i]--;
}
//Remove
thrust::detail::normal_iterator<thrust::device_ptr<float> > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code);
int dist = thrust::distance(dCodes.begin(), newEnd);
dCodes.resize(dist);
newCounts.resize(dist);
}
codes->resize(dCodes.size());
counts->resize(newCounts.size());
thrust::copy(dCodes.begin(), dCodes.end(), codes->begin());
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin());
المشكلة هي أنه لاحظت نسخا متعددة من 4 بايت، باستخدام Profiler Cuda Visual. المنظمة البحرية الدولية هذا يتم إنشاؤها بواسطة
- حلقة العداد أنا
- برمز تعويم, int عد و قضاء
- كل وصول إلى أنا والمتغير المذكورة أعلاه
يبدو أن هذا يبطئ كل شيء (نسخ متتابع من 4 بايت ليس متعة ...).
لذلك، كيف أقول التوجه، يجب معالجة هذه المتغيرات على الجهاز؟ أم أنها بالفعل؟
باستخدام الدفع :: يبدو Device_ptr غير كاف بالنسبة لي، لأنني لست متأكدا مما إذا كانت الحلقة حول تشغيلها على المضيف أو على الجهاز (والذي قد يكون أيضا سبب آخر للإبطاط).
المحلول
لكل تكرار من I، الحجم، فهرس، رمز، إلخ. يجب نسخها من المضيف إلى الجهاز .. بالطريقة التي لديك برنامجك، لا يوجد الكثير يمكنك القيام به. للحصول على أفضل النتائج، فكر في نقل حلقة بالكامل على الجهاز، وبهذه الطريقة لن تستضيف نسخ الجهاز.
الثقة رائعة بالنسبة لبعض الأشياء، ومع ذلك، فإن الأداء يشعر بالقلق، ولا تناسب الخوارزمية الوظائف المتاحة تماما، فقد تضطر إلى إعادة كتابة أفضل أداء دون استخدام خوارزميات الدفع بشكل صريح.