1

我写了一个函数。当我在 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 event time output cost time是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)还是发生了一些访问冲突?我该如何解决这个问题?

4

1 回答 1

0

您的屏幕变黑是因为您正在点击 Windows TDR 事件。有关此和可能的解决方案的进一步描述,请参阅我的答案here

由于您已经嵌套了 for 循环,并且您没有告诉我们数据集的大小,因此如果您的 for 循环在足够大的范围内运行,那么您的代码肯定可能需要很长时间才能执行。

当您注释掉那行代码时,编译器可以完全优化掉循环,因此这部分代码的运行时间基本上为零。因此,您的 kenel 不再需要太长时间,因此您不会遇到 TDR 事件。

没有任何理由基于上述任何假设发生访问冲突。事实上,我会说这不太可能,因为访问冲突通常会导致未指定的启动失败,这将终止正在运行的内核。

因此,您需要调查我在上面链接的答案中提到的一些想法。

于 2013-07-25T16:36:12.920 回答