分段故障CUDA-C

分段故障CUDA-C,c,cuda,segmentation-fault,C,Cuda,Segmentation Fault,我使用CUDA添加两个矩阵,并在另一个矩阵中给出它们的结果。我希望利用共享内存功能,为此,我写了以下内容: #include <stdio.h> #include <cuda.h> #define grid 1024 #define BSZ 16 __global__ void addition(int *dev_a, int *dev_b, int *dev_c) { __shared__ int as[BSZ][BSZ]; __sh

我使用CUDA添加两个矩阵,并在另一个矩阵中给出它们的结果。我希望利用共享内存功能,为此,我写了以下内容:

#include <stdio.h>
#include <cuda.h>
#define grid 1024
#define BSZ 16

    __global__ void addition(int *dev_a, int *dev_b, int *dev_c)
    {

    __shared__ int as[BSZ][BSZ];
    __shared__ int bs[BSZ][BSZ];

    int by = blockIdx.y;
    int bx = blockIdx.x;

    int cvalue;

    int ty = threadIdx.y;
    int tx = threadIdx.x;

    int row = by * BSZ + ty;
    int col = bx * BSZ + tx;

    as[ty][tx] = dev_a[row*grid + col];
    bs[ty][tx] = dev_b[row*grid + col];
    __syncthreads();

    cvalue = as[ty][tx] + bs[ty][tx];

    __syncthreads();

    dev_c[row*grid + col] = cvalue;
    }

int main ()
{
    int a[grid][grid], b[grid][grid], c[grid][grid];
    //c = a + b
    for(int i=0;i<grid;i++)
    {
      for(int j=0;j<grid;j++)
      {
        a[i][j]=2;
        b[i][j]=1;
      }
    }

    printf("Working fine here");
    int *dev_a;
    int *dev_b;
    int *dev_c;
    int size = grid * grid * sizeof(int);

    printf("Working fine");
    cudaMalloc( (void**)&dev_a, size );
    cudaMalloc( (void**)&dev_b, size );
    cudaMalloc( (void**)&dev_c, size );

    cudaMemcpy(dev_a,a,size,cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b,b,size,cudaMemcpyHostToDevice);

    dim3 dimBlock(BSZ,BSZ);
    dim3 dimGrid(grid/dimBlock.x,grid/dimBlock.y);

    //Kernel launch
    addition<<<dimGrid, dimBlock>>>(dev_a, dev_b, dev_c);

    cudaMemcpy(c,dev_c,size,cudaMemcpyDeviceToHost);

    for (int i=0; i<grid; i++)
    {
      for(int j=0;j<grid;j++)
        {
          printf( "%d + %d = %d\n", a[i][j], b[i][j], c[i][j] );
        }
    }
}
我得到了一个分段错误,我无法理解为什么!请有人帮我做这个

int a[1024][1024], b[1024][1024], c[1024][1024];
这些物体的大小是天文数字!你可能已经把堆栈溢出了。我认为,如果您减小segfaults的大小,或者增加堆栈的大小,您会发现segfaults会消失,但是您的实现允许您这样做,或者甚至可以使用动态存储持续时间(例如malloc)来分配它们,而不是自动存储持续时间



这些物体的大小是天文数字!你可能已经把堆栈溢出了。我认为,如果您减小segfaults的大小,或者增加堆栈的大小,您会发现segfaults会消失,但是您的实现允许您这样做,或者甚至可以使用动态存储持续时间(例如malloc)而不是自动存储持续时间来分配它们。

您收到了多少工作罚款?如果您能告诉我们您在故障排除方面取得了多大进展,而不是让我们猜测,那您就太好了。如果您能从正确地整理报告中的任何错误开始,那又如何呢。然后,如果仍然存在seg故障,至少将问题缩小到产生seg故障的线路。这是标准的调试,不是cuda特有的,你可以用printf、调试器或者任何你喜欢的方法来完成。我没有得到任何好的效果!该程序在nvcc编译,但当我执行它时,它显示seg错误!我是cuda的新手,所以我对宏不太了解。我尝试使用HANDLE_ERROR,但在实验室的GPU机器中,这不起作用。我只是注意到,当我将网格大小更改为512时,程序正在工作!!有什么线索说明这是为什么吗?@TanmayAgrawal:如果你在Linux上,gdb或cuda gdb和valgrind可以帮助你跟踪错误。你被判了多少工作罚款?如果您能告诉我们您在故障排除方面取得了多大进展,而不是让我们猜测,那您就太好了。如果您能从正确地整理报告中的任何错误开始,那又如何呢。然后,如果仍然存在seg故障,至少将问题缩小到产生seg故障的线路。这是标准的调试,不是cuda特有的,你可以用printf、调试器或者任何你喜欢的方法来完成。我没有得到任何好的效果!该程序在nvcc编译,但当我执行它时,它显示seg错误!我是cuda的新手,所以我对宏不太了解。我尝试使用HANDLE_ERROR,但在实验室的GPU机器中,这不起作用。我只是注意到,当我将网格大小更改为512时,程序正在工作!!有什么线索说明为什么会发生这种情况吗?@TanmayAgrawal:如果你在Linux上,gdb或cuda gdb和valgrind可以帮助你跟踪错误。是的,类似的事情正在发生!我将网格大小减少到512,成功了!有什么线索可以让它在1024年有效吗?我使用Cudamaloc作为设备指针。我是否也应该将malloc用于主机指针?@TanmayAgrawal:您希望使用malloc在堆上分配内存,而不是在堆栈上。您应该阅读以下答案:。请注意,您的问题与CUDA无关,这实际上是一个C问题。使用malloc或cudaMalloc为a、b和C分配如此大的对象。。。并确保sizeof int*1024*1024不会溢出size\t,否则您将得到比您想要的小得多的对象…@BenC完全正确,我知道了。谢谢@没有定义你的权利!从现在起我会记住这一点。谢谢你,伙计!是啊,像这样的事情正在发生!我将网格大小减少到512,成功了!有什么线索可以让它在1024年有效吗?我使用Cudamaloc作为设备指针。我是否也应该将malloc用于主机指针?@TanmayAgrawal:您希望使用malloc在堆上分配内存,而不是在堆栈上。您应该阅读以下答案:。请注意,您的问题与CUDA无关,这实际上是一个C问题。使用malloc或cudaMalloc为a、b和C分配如此大的对象。。。并确保sizeof int*1024*1024不会溢出size\t,否则您将得到比您想要的小得多的对象…@BenC完全正确,我知道了。谢谢@没有定义你的权利!从现在起我会记住这一点。谢谢你,伙计!