我有一些过滤内核,如下所示:
__kernel void filterKernel (__global float4 *filter, __global float4* in_array, __global float4* out_array)
{
...
out_array[tid] = in_array[tid] * filter[fid];
...
}
内核filterKernel被多次调用(约1000次)。
变量过滤器是一个浮点数组,永远不会改变它的值(对所有工作组和所有内核调用保持不变)。
in_array包含32768个浮点数。
此变量过滤器的最佳声明是什么? __不变? __本地?也许在这里和那里放置一个“const”?什么能帮助编译器最多?是什么让代码最快?
答案 0 :(得分:3)
您应该使用常量地址空间(__constant),因为大多数GPU都有用于常量内存的特殊缓存。唯一的问题是常量内存的大小很小(按16-64KB的顺序)。
答案 1 :(得分:1)
__ local会出错,因为你无法将它初始化为任何东西。你可能想要使用__constant,只要它适合。
答案 2 :(得分:0)
如果它不是太大,请尝试在.cl文件中全局定义过滤器 在那里,您可以尝试在 __常量或 __ local 空间中分配它,并比较哪一个更快。但并非所有SDK都支持__local地址空间中的全局变量(我正在看你ATI)。
如果您仍想将过滤器作为内核参数传递,请考虑仅将调用其SetKernelArg(0,...)。只要内核参数的值或索引没有改变,也无需调用SetKernelArg()1000次。虽然这可能没有可衡量的性能影响,但它仍然更清晰。