CUDA运行导致显示驱动器停止

时间:2013-07-25 05:10:49

标签: cuda gpu

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

1 个答案:

答案 0 :(得分:0)

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

由于你有嵌套的for循环,并且你没有告诉我们数据集的大小,如果你的for循环在足够大的范围内运行,你的代码执行时间太长肯定是可能的。

当您注释掉该行代码时,编译器可以完全优化掉循环,因此该部分代码将基本上没有时间运行。因此,您的kenel不再花费太长时间,因此您不会遇到TDR事件。

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

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