共享内存中的Bank-Conflict-Free Access

时间:2012-03-31 14:28:13

标签: cuda gpu shared-memory memory-access

我必须使用大小为64个元素的共享内存,是32个库的两倍。所以情况是内存访问次数是warp中线程数的两倍。我该如何解决这些问题以获得无冲突的银行访问?

2 个答案:

答案 0 :(得分:2)

如果是32位内存访问,您可以使用默认内存访问模式。

__shared__ int shared[32];
int data = shared[base + stride * tid];

stride是奇怪的。

如果你有64位访问权限,你可以使用这样的技巧:

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

答案 1 :(得分:0)

让我们假设您使用的是计算能力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是为了避免转置访问模式中的序列化。