我写了一个函数。当我在cpu中运行它时,我可以得到正确的结果。 cpu代码的一部分是:
for(int x = startx; x < endx; x+=SampleStep)
for(int y = starty; y < endy; y+=SampleMin)
{
int idoff = Width;
然后我将它移植到GPU,如下所示:
int x = threadIdx.x + blockIdx.x * blockDim.x + startx;
int y = threadIdx.y + blockIdx.y * blockDim.y + starty;
int idoff = blockDim.x * gridDim.x;
当我运行代码时,黑屏发生了,然后在一段时间后恢复。同时,系统显示如下消息:Display drive stopped responding
。
并且cuda事件时间输出成本时间为0ms,结果是错误的。
for (int k = CircleBegin; k < CircleEnd; k++)
{
bool Isright = (k-ww>=0) && (k+ww<Width);
if (Isright)
{
float AverR = 0;
for (int i = -ww; i <= ww; i++)
{
for (int j = -wh; j <= wh; j++)
{
AverR += ImgR[(k+i)+(y+j)*idoff];
}
}
当我评论AverR + = ImgR [(k + i)+(y + j)* idoff]时;代码可以在没有黑屏的情况下运行。我想知道为什么。这与我的显示设备有关(我的设备是nvida gt 240)还是发生了一些访问冲突?我该如何解决这个问题?
答案 0 :(得分:0)
您的屏幕变黑,因为您正在点击Windows TDR事件。有关此问题和可能解决方案的进一步说明,请参阅我的回答here。
由于你有嵌套的for循环,并且你没有告诉我们数据集的大小,如果你的for循环在足够大的范围内运行,你的代码执行时间太长肯定是可能的。
当您注释掉该行代码时,编译器可以完全优化掉循环,因此该部分代码将基本上没有时间运行。因此,您的kenel不再花费太长时间,因此您不会遇到TDR事件。
基于以上任何一种情况,没有理由假设发生了访问冲突。事实上,我认为这不太可能,因为访问冲突通常会导致未指定的启动失败,这将终止正在运行的内核。
因此,您需要调查我在上面链接的答案中提到的一些想法。