假设我有一大堆值(仍然小于 64 kB),它们在内核中经常被读取,但不被写入。然而,它可以从外部改变。该数组有两组值,让我们称它们为左右。所以问题是,将大数组作为 __global 并将其写入 __local left 和 __local right 数组是否更快?还是将其作为一个常量 __constant large 并处理内核中的访问?例如:
__kernel void f(__global large, __local left, __local right, __global x, __global y) {
for(int i; i < size; i++) {
left[i] = large[i];
right[i] = large[i + offset];
}
...
x = foo * left[idx];
y = bar * right[idx];
}
与:
__kernel void f(__constant large, __global x, __global y) {
...
x = foo * large[idx];
y = bar * large[idx * offset];
}
(索引有点复杂,但可以用宏来制作,例如)我读到常量内存存在于全局空间中,所以它应该更慢吗?它将在 Nvidia 卡中运行。