我正在使用Open CL在GPU上实现一种算法。
目前我推出的内核只有一个包含128个工作项的工作组。全局内存中的数据被每个工作项多次使用。要利用共享的速度内存我使用以下代码将其复制到共享内存。
__kernel void kernel1(__global float2* input,
__global int* bin,
__global float2* DFT,
__local float2* localInput,
__const int N){
size_t itemId = get_local_id(0);
localInput[itemId] = input[itemId];
barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
........................................................
/*Remaining algo here.*/
........................................................
}
如果只有一个工作组,上面的代码很有效。但是如果有多个工作组,假设每个工作组中有两个工作组具有相同数量的项目,则上述内核仅复制第一个工作组第一个工作组共享内存的一半和后一个工作组的后半部分。
我也试过下面的内核:
__kernel void kernel1(__global float2* input,
__global int* bin,
__global float2* DFT,
__local float2* localInput,
__const int N){
size_t itemId = get_local_id(0);
if(itemId == 0){
for(int index = 0;index<N;index++){
localInput[index] = input[index];
}
}
barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
........................................................
/*Remaining algo here.*/
........................................................
}
但是上面的代码存在分歧等问题,因为条件语句会降低性能。
可以对代码进行哪些进一步修改,以便可以将整个数组有效地复制到每个工作组的共享内存中?
任何建议都非常感谢。
答案 0 :(得分:0)
根据您正在使用的设备,您很有可能完全忽略本地内存。如果您使用桌面GPU,他们使用几乎没有任何缓存,这使得使用本地内存非常重要,但是现在它们的数量相当不错。如果您在gpu上访问相同的内存部分,那么它们都在缓存中(它通常与共享内存大小相同),这与本地内存一样快(它们是同一块内存,只是拆分)。手动将其复制到本地内存可能会造成轻微的性能损失
如果您没有使用桌面GPU(arm / etc)或者您的要求使这不切实际,async_work_group_copy可能就是您要找的
在一个不相关的说明中,上面的代码只需要做一个屏障(CLK_LOCAL_MEM_FENCE),因为你可能没有修改你的输入