这里存储数据性能低是我的问题,以加快我的项目,我要保存的内部内核生成到共享内存的值,但是,我发现它需要这么长时间来保存该值。如果我删除“THIS LINE”(见下面的代码),即去掉“THIS LINE”,速度非常快,以保存值(100次加速!)。CUDA,在共享memroy
extern __shared__ int sh_try[];
__global__ void xxxKernel (...)
{
float v, e0, e1;
float t;
int count(0);
for (...)
{
v = fetchTexture();
e0 = fetchTexture();
e1 = fetchTexture();
t = someDeviceFunction(v, e0, e1);
if (t>0.0 && t < 1.0) <========== <THIS LINE>
count++;
}
sh_try[threadIdx.x] = count;
}
main()
{
sth..
START TIMING:
xxxKernel<<<gridDim.x, BlockDim.x, BlockDim.x*sizeof(int)>>> (...);
cudaDeviceSynchronize();
END TIMING.
sth...
}
为了解决这个问题,我简化了我的代码,只是将数据保存到共享内存中。并停下来。因为我知道共享内存。是最有效的成员。除了注册,我不知道这个高延迟是正常还是我做错了。请给我一些建议!谢谢你们提前!
trudi
更新: 如果我替换共享全球MEM内存,它需要几乎在同一时间,为33ms无“THIS LINE”,它297ms。将数据保存到全局mem是否正常?需要与共享内存相同的时间?这也是“编译器优化”的一部分吗?
我也检查了其他类似的问题,也就是说,即将数据保存到共享内存或没有,这可能是由编译器优化造成的巨大时间差距,因为它是没有意义的计算数据,但不保存它们,所以编译器只是'删除'那些毫无意义的代码。
我不知道我是否共享相同的原因,因为行改变了游戏规则是一个假设 - “THIS LINE”,当我评论它,变量“计数”增加每次迭代,当我取消它在t有意义时增加。
任何想法?请...
当更改单行代码时看到像这样的大速度差异时,很可能是因为编译器能够优化出大块代码。由于您的内核仅将数据存储在共享内存中,因此它没有任何用处。编译器可以检测到这一点,并用一个空内核来替代它。您可以通过使用'nvcc -ptx mycode.cu'查看代码输出来查看这两种情况的区别。 – 2013-04-05 07:48:13
使用“@name”通知评论者。 ptx文件在某种程度上是可读的。要检查的主要问题是你的函数的主体。它应该以'.entry _Z6xxxKernelILi2EEvPj(){'开始。之后,汇编代码如下所示。 – stuhlo 2013-04-05 09:40:48
@stuhlo,谢谢你的回复。也许我应该先弄清楚如何用nvcc -ptx编译。我得到一个错误'无法找到cutil_inline.h'任何想法? – trudiQ 2013-04-05 13:13:45