Optimization CUDA常量内存是否应该统一访问?

Optimization CUDA常量内存是否应该统一访问?,optimization,memory-management,cuda,Optimization,Memory Management,Cuda,我的CUDA应用程序的恒定内存小于8KB。由于它都将被缓存,我是否需要担心每个线程访问相同的地址进行优化 如果是,如何确保所有线程同时访问同一地址 由于它都将被缓存,我是否需要担心每个线程访问相同的地址进行优化 对。缓存本身每个周期只能提供一个32位字 如果是,如何确保所有线程同时访问同一地址 确保用于引用常量内存区域中元素的任何类型的索引或寻址都不依赖于任何内置线程变量,例如threadIdx.x、threadIdx.y、或threadIdx.z。请注意,实际要求没有此严格。只要给定扭曲中的每

我的CUDA应用程序的恒定内存小于8KB。由于它都将被缓存,我是否需要担心每个线程访问相同的地址进行优化

如果是,如何确保所有线程同时访问同一地址

由于它都将被缓存,我是否需要担心每个线程访问相同的地址进行优化

对。缓存本身每个周期只能提供一个32位字

如果是,如何确保所有线程同时访问同一地址

确保用于引用常量内存区域中元素的任何类型的索引或寻址都不依赖于任何内置线程变量,例如
threadIdx.x
threadIdx.y
、或
threadIdx.z
。请注意,实际要求没有此严格。只要给定扭曲中的每个线程的索引计算结果相同,就可以实现必要的目标。以下是几个例子:

__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
由于它都将被缓存,我是否需要担心每个线程访问相同的地址进行优化

对。缓存本身每个周期只能提供一个32位字

如果是,如何确保所有线程同时访问同一地址

确保用于引用常量内存区域中元素的任何类型的索引或寻址都不依赖于任何内置线程变量,例如
threadIdx.x
threadIdx.y
、或
threadIdx.z
。请注意,实际要求没有此严格。只要给定扭曲中的每个线程的索引计算结果相同,就可以实现必要的目标。以下是几个例子:

__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

您的意思是所有线程将尝试读取相同的地址,还是在该地址上写入?读取。我的印象是,恒定内存是只读的。你的意思是所有线程都将尝试读取相同的地址,还是在该地址上写入?读取。我的印象是,常量内存是只读的。展开的for循环也可以工作吗?我假设这就像数据[b];只要用于索引数据的变量不依赖于线程索引,for循环中就没有问题,无论是否展开。例如,如果用于索引数据的变量依赖于for循环迭代变量,则可以。通过简单地询问自己索引变量是否依赖于线程索引,您应该能够理解这一点,或者任何其他示例。展开的for循环也可以工作吗?我假设这就像数据[b];只要用于索引数据的变量不依赖于线程索引,for循环中就没有问题,无论是否展开。例如,如果用于索引数据的变量依赖于for循环迭代变量,则可以。通过简单地询问自己索引变量是否依赖于线程索引,您应该能够理解这一点,或者任何其他示例。