有关共享内存的Bank冲突的问题

有一个大小为ROWCOL(30003000)的数组,声明为一维数组A(ROWCOL),里面填充随机的int。
现在需要处理里面每一个数据,最后生成的结果也为一个一维数组R(ROW
COL)。
处理过程大致是,对于每一个数据A(row,col),它需要和其所在行前面的数据(row,col-N)做对比,
若取数据(row,col-N)为0时,则跳过这个0,继续往下取非0的数据做对比。
若这个数据比前面的20个数据都大(即最大值),则在对应的结果集数组R(row,col)的位置写入1,否则写入0。
处理过程的c++伪代码大致如下:
for(int r=0;r<ROW;r++)
{
for(int c=0;c<COL;c++)
{
//取出r*COL+c的值A1

for(int count=1;count<=20;count++)
{
//取出非0的r*COL+c-count的值A2
//对比,若A1在这20次对比中都是最大的,则在结果集写入1;否则写入0。
}
}
}

在我的源码里已经用了共享内存,划分为每一个Block计算一个ROW,但是由于Row里的数据基本上是随机读取的,所以不知道会不会产生Bank冲突。

这个程序运行在一个I7 2600 CPU上,用时20ms。我的GPU是Geforce GTX 570,用时5ms。
所以我觉得还能再次提高速度。
另外我测试发现,计算过程只用了0.04毫秒,而结果集数据传回Host用了4.9毫秒。请问这个传输过程,如何提高速度?

可以把你的程序在visual profiler里运行一下,然后看l1_shared_bank_conflicts这个counter的值。将其与shared_load+shared_store相比,就知道shared memory访问中有多少有bank conflict。再将l1_shared_bank_conflict与instruction_issued相比,就可以知道bank conflict对性能是否有重要影响。

你的传输时间比kernel计算时间大很多,所以通常的compute-memcpy重叠的技术用处不大。这也同时说明你放在GPU上的计算量比较小。你可以看看是否可以通过放更多的计算到GPU上来减少数据传输量。

谢谢斑竹的悉心指导!