Fermi GPU的CUDA程序存储器错误

时间:2011-07-20 22:37:36

标签: cuda gpu-programming

我在GeForce GTX 580(费米级)GPU上面临以下问题。

为了给你一些背景知识,我正在阅读文件中以下列方式打包的单字节样本:Real(信号1),Imaginary(信号1),Real(信号2),Imaginary(信号2)。 (每个字节都是一个带符号的char,取值介于-128和127之间。)我将这些读入char4数组,并使用下面给出的内核将它们复制到与每个信号对应的两个float2数组。 (这只是一个较大程序的一个孤立部分。)

当我使用cuda-memcheck运行程序时,我会在随机线程和块索引处获得一个不合格的unspecified launch failure或同一消息以及User Stack Overflow or Breakpoint HitInvalid __global__ write of size 8

主要内核和启动相关代码如下所示。 奇怪的是,这个代码在我可以访问的非费米级GPU上运行(并且cuda-memcheck没有抛出任何错误)。我观察到的另一件事是Fermi没有给N小于16384的错误。

#define N   32768

int main(int argc, char *argv[])
{
    char4 *pc4Buf_h = NULL;
    char4 *pc4Buf_d = NULL;
    float2 *pf2InX_d = NULL;
    float2 *pf2InY_d = NULL;
    dim3 dimBCopy(1, 1, 1);
    dim3 dimGCopy(1, 1);
    ...
    /* i do check for errors in the actual code */
    pc4Buf_h = (char4 *) malloc(N * sizeof(char4));
    (void) cudaMalloc((void **) &pc4Buf_d, N * sizeof(char4));
    (void) cudaMalloc((void **) &pf2InX_d, N * sizeof(float2));
    (void) cudaMalloc((void **) &pf2InY_d, N * sizeof(float2));
    ...
    dimBCopy.x = 1024;  /* number of threads in a block, for my GPU */
    dimGCopy.x = N / 1024;
    CopyDataForFFT<<<dimGCopy, dimBCopy>>>(pc4Buf_d,
                                           pf2InX_d,
                                           pf2InY_d);
    ...
}

__global__ void CopyDataForFFT(char4 *pc4Data,
                               float2 *pf2FFTInX,
                               float2 *pf2FFTInY)
{
    int i = (blockIdx.x * blockDim.x) + threadIdx.x;

    pf2FFTInX[i].x = (float) pc4Data[i].x;
    pf2FFTInX[i].y = (float) pc4Data[i].y;
    pf2FFTInY[i].x = (float) pc4Data[i].z;
    pf2FFTInY[i].y = (float) pc4Data[i].w;

    return;
}

我在程序中注意到的另一件事是,如果我在内核中注释掉任何两个char-to-float赋值语句,则没有内存错误。我在程序中注意到的另一件事如果我在我的内核中注释掉前两个或最后两个char-to-float赋值语句,那就没有内存错误。如果我从前两个(pf2FFTInX)注释掉一个,而后两个(pf2FFTInY)注释掉一个,则错误仍会出现,但频率会降低。内核使用6个寄存器,所有四个赋值语句都没有注释,并使用 5 4个寄存器,两个赋值语句被注释掉。

我尝试使用32位工具包代替64位工具包,使用-m32编译器选项进行32位编译,在没有X窗口的情况下运行等等,但程序行为是相同的。

我在RHEL 5.6上使用CUDA 4.0驱动程序和运行时(也尝试过CUDA 3.2)。 GPU计算能力为2.0。

请帮忙!如果有人有兴趣在他们的费米卡上运行它,我可以发布整个代码。

更新:只是为了它,我在__syncthreads()pf2FFTInX赋值语句之间插入pf2FFTInYN的内存错误消失了= {327}。但在N = 65536时,我仍然会收到错误。 <--这不会持续很长时间。仍然有错误。

更新:继续奇怪的行为,当我使用cuda-memcheck运行程序时,我会在屏幕上随机分布这些16x16块多色像素。如果我直接运行程序,就不会发生这种情况。

1 个答案:

答案 0 :(得分:2)

问题是GPU卡不好(参见评论)。 [我正在添加此答案以从未答复的列表中删除问题并使其更有用。]