有一个大小为ROWCOL(30003000)的数组,声明为一维数组A(ROWCOL),里面填充随机的int。
现在需要处理里面每一个数据,最后生成的结果也为一个一维数组R(ROWCOL)。
处理过程大致是,对于每一个数据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毫秒。请问这个传输过程,如何提高速度?