opencl中原子鎖的使用

opencl的核函數執行的是並行操作,因爲每一個核函數執行的是一個細粒度的操作,所以當核函數執行的時候,相當於多個線程同時執行一個函數,區別就是這些線程輸入給函數的參數不一樣,比如對於一個圖像10*10的圖像,同時有100個線程操作,每一個線程操作一個像素,當然必須是不同的像素,所以不能有併發寫的情況發生。

比如下面的核函數:

__kernel void sync_write(__global unsigned char * rgbImage, 
                              __global float * result)
{
    int x = get_global_id(0);
    int y = get_global_id(1);
    result[x-y] += 100;
}

我們對result數組進行寫操作,因爲對於不同的線程,x-y的值可能相同,比如x=0,y=0和x=100,y=100寫入的是同一個地方,所以不能直接這樣寫。

opencl提供了原子鎖的機制,只允許同時有一個線程進入:

atomic_add(result + y - x, 100);

第一個 參數是地址,第二個參數是要往這個地址增加的值。

atomic_add官方的解釋如下:

這就是說,它只支持整型元素的相加,對於浮點型和其它的類型不支持

如果遇到浮點型的相加,我們可以通過乘法將浮點型轉換爲整型,然後在cpu裏面再將整型數組轉回去,這樣的話還是比單純的cpu運算要快

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章