2012-11-14 446 views
0

我必須做一個映像映射的gpu實現(opencl)。正向映射vs反向映射

我似乎記得在某處閱讀過,正向映射更適合並行實現,爲什麼?

有沒有人有一些示例代碼如何做這些映射(最好在GPU上)?

回答

0

對我來說,並行實現的直觀選擇將是一個反向而非向前的映射。

考慮幾個源像素映射到單個目標像素的情況。在正向映射中,如果每個源像素都被評估爲不同的工作項目,則必須在目標像素上實現某種同步以協調多個寫入。在逆映射中沒有同步開銷,因爲它保證只有一個工作項寫入每個像素。

實施例逆映射內核代碼,利用的OpenCL的image2d_t和sampler_t概念用於圖像處理:

__kernel void warp(__read_only image2d_t srcImage, 
        __write_only image2d_t dstImage, 
        sample_r sampler) 
{ 
    int2 dstCoords = (int2){ get_global_id(0), get_global_id(1)}; 
    int2 srcCoords = my_warp_func_inverse(dstCoords); 
    float4 srcPixel = read_imagef(srcImage, sampler, srcCoords); 
    write_imagef(dstImage, dstCoords, srcPixel); 
} 

當然也有例外,其中正向映射可能是優選的。例如,如果您有一個非常大的源圖像和一個較小的目標圖像,則正向映射將允許您將源圖像分割爲多個分段,然後將它們分割爲工作項或工作組,並將分段數據緩存在__private或__local地址空間。如果沒有事先了解映射函數的知識,反向映射可能需要訪問源映像的任何部分,這可能會將您限制爲__全局內存。