我想使用OpenCL對圖像中的非零點數進行計數。OpenCL atom_inc分離的好主意?
由於它是一項添加工作,我使用了atom_inc。
此處顯示內核代碼。
__kernel void points_count(__global unsigned char* image_data, __global int* total_number, __global int image_width)
{
size_t gidx = get_global_id(0);
size_t gidy = get_global_id(1);
if(0!=*(image_data+gidy*image_width+gidx))
{
atom_inc(total_number);
}
}
我的問題是,通過使用atom_inc它會是多餘的權利?
當我們遇到一個非零點時,我們應該等待atom_inc。
我有這樣的想法,我們可以將整行分成數百個組,我們在不同的組中找到數字並最後添加它們。
如果我們可以做這樣的事情:
__kernel void points_count(__global unsigned char* image_data, __global int* total_number_array, __global int image_width)
{
size_t gidx = get_global_id(0);
size_t gidy = get_global_id(1);
if(0!=*(image_data+gidy*image_width+gidx))
{
int stepy=gidy%10;
atom_inc(total_number_array+stepy);
}
}
我們將整個問題分成多個組。 在這種情況下,我們可以將數字逐個添加到total_number_array中。
從理論上講,它會有很大的性能提升嗎?
那麼,有沒有人有關於求和問題的一些建議嗎?
謝謝!
減少問題。解釋數千次。 Atomic_inc()效率不高,需要在O(log2())模式下執行。 – DarkZeros