2012-05-07 78 views
1

比方說,我有以下的內核:傳遞數據

__kernel void classify_data_points(__global float* data, 
            __local float* datasegment) 
{ 
    int gid0 = get_global_id(0); 
    int lid = get_local_id(0); 
    dataSegment[lid] = data[gid]; 
} 

正如看見,我想借此從全局內存數據到本地內存。本地內存的大小是否同時執行此操作很重要?我的意思是,dataSegment數組大小是64字節。然後,通過這條線'dataSegment [lid] = data [gid]',我可以假設整個64字節的存儲空間是由從全局存儲器獲取的數據填充的嗎?(全局存儲器中有足夠的數據)或512字節長的本地存儲器,我們能說同樣的話嗎?

回答

3

在您的示例中,複製的內存量取決於工作組大小,而不是數據分段的大小。你不能假定64字節的內存將被複制。

如果要執行復製作爲單個操作,請查看async_work_group_copy函數。

+0

如果您的工作組不是多個數據,使用async()函數是最佳選擇。對於普通副本也是有效的,所以應該在任何情況下使用。 – DarkZeros

3

不,您需要在寫入本地內存的代碼之後使用本地內存圍欄。例如:

barrier(CLK_LOCAL_MEM_FENCE); 

只有這樣才能確保您的工作組的本地內存已被完全複製。您還需要確保您的工作組有足夠的工作項來初始化工作組的所有本地內存(在您的情況下爲dataSegment)。