简单 C++ CUDA 代码中运行时的分段错误

Segmentation Fault at runtime in a simple C++ CUDA code

我在 运行 这段代码后遇到了 cuda 分段错误。

这段代码的原因: 我想知道 ian 数组可以在寄存器内存中声明的最大大小,每个块每个线程的最大数组:

#include "common.h"
#include <cuda_runtime.h>
#include "stdio.h"

#define N 10
#define Nblock 10

__global__ void add(int *c)
{
   int X[N];
   int tID = blockIdx.x * blockDim.x + threadIdx.x;
   for(int o = 0; o < N;o++) {
      X[o]=1;
      c[tID] +=X[o];
 }
}
int main(int argc, char **argv)
{

 // set up device
 int dev = 0;
 cudaDeviceProp deviceProp;
 CHECK(cudaGetDeviceProperties(&deviceProp, dev));
 printf("%s test struct of array at ", argv[0]);
 printf("device %d: %s \n", dev, deviceProp.name);
 CHECK(cudaSetDevice(dev));

 int c[N*Nblock];
 int *dev_c;

 cudaMalloc((void **) &dev_c, N*Nblock*sizeof(int));

 add<<<Nblock,N>>>(dev_c);
 cudaMemcpy(c, dev_c, N*Nblock*sizeof(int), cudaMemcpyDeviceToHost);
 int sum = 0 ;
 for (int i = 0; i < N*Nblock; i++)
 {
 sum +=c[i];
 }
 printf("sum= %d\n", sum);
 free(dev_c);
    // reset device
    CHECK(cudaDeviceReset());
    return EXIT_SUCCESS;
}

在 运行 代码后收到此消息:

第 4 行:18244 分段错误(内存堆栈刷新到磁盘)

段错误发生在这一行:

free(dev_c);

您不会以这种方式释放设备指针(分配给 cudaMalloc)。

正确的是:

cudaFree(dev_c);