我的CUDA应用程序具有小于8KB的常量内存。由于它都将被缓存,我是否需要担心每个线程访问相同的地址以进行优化?
如果是,我如何确保所有线程同时访问同一地址?
答案 0 :(得分:6)
由于它都将被缓存,我是否需要担心每个线程访问相同的地址以进行优化?
是。 缓存本身每个周期只能提供一个32位字。
如果是,我如何确保所有线程同时访问同一地址?
确保用于引用常量内存区域中的元素的任何类型的索引或寻址都不依赖于任何内置的线程变量,例如threadIdx.x
,threadIdx.y
或threadIdx.z
。请注意,实际要求不如此严格。只要索引计算给定warp中每个线程的相同数字,就可以实现必要的目标。以下是一些例子:
__constant__ int data[1024];
...
// assume 1D threadblock
int idx = threadIdx.x;
int bidx = blockIdx.x;
int a = data[idx]; // bad - every thread accesses a different element
int b = data[12]; // ok - every thread accesses the same element
int c = data[b]; // ok - b is a constant w.r.t threads
int d = data[b + idx]; // bad
int e = data[b + bidx]; // ok
int f = data[idx/32]; // ok - the same element is being accessed per warp