Cuda 共享内存中的无冲突存取

Cuda 共享内存中的无冲突存取,cuda,gpu,shared-memory,memory-access,Cuda,Gpu,Shared Memory,Memory Access,我必须使用64个元素大小的共享内存,是32个银行数量的两倍。因此,情况是,内存访问的数量是扭曲中线程数量的两倍。我应该如何处理它们以产生无银行冲突的访问?在32位内存访问的情况下,您可以使用默认内存访问模式 __shared__ int shared[32]; int data = shared[base + stride * tid]; 这里的步幅很奇怪 如果您有64位访问权限,可以使用以下技巧: struct type { int x, y, z; }; __shared__

我必须使用64个元素大小的共享内存,是32个银行数量的两倍。因此,情况是,内存访问的数量是扭曲中线程数量的两倍。我应该如何处理它们以产生无银行冲突的访问?

在32位内存访问的情况下,您可以使用默认内存访问模式

__shared__ int shared[32];
int data = shared[base + stride * tid];
这里的
步幅
很奇怪

如果您有64位访问权限,可以使用以下技巧:

struct type 
{  
   int x, y, z;
};
__shared__ struct type shared[32];
struct type data = shared[base + tid];

假设您使用的是compute capability 1.x,那么您的共享内存有16个存储组,每个线程必须访问共享内存中的2个元素

您需要的是线程访问两个元素的同一内存库,因此,如果您将其组织为所需元素彼此相距16,则应该避免内存库冲突

__shared__ int shared[32];
int data = shared[base + stride * tid];
int data = shared[base + stride * tid + 16];
我使用这个模式来存储复杂的浮点,但是我有一个复杂的浮点数组,所以看起来像

#define TILE_WIDTH 16

__shared__ float shared[TILE_WIDTH][2*TILE_WIDTH + 1];
float real = shared[base + stride * tid];
float imag = shared[base + stride * tid + TILE_WIDTH];

其中+1是为了避免转置访问模式中的序列化。

如何访问共享内存。你需要每个线程64位访问,还是两个32位访问?非常感谢。例如,我有一个包含32个元素的数组,该数组与16个线程共享,因此每个线程都必须访问该数组的两个元素。那么,根据上述问题,正确的寻址方式应该是什么呢?第一种模式在您的情况下运行良好。我能问一个小问题吗:为什么是16岁?对于线程块中的所有线程,任何具有限定符
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我实际上处理的是FEM模拟,它在线程执行的计算中共享一些数组,如质量矩阵。