简单 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);
我在 运行 这段代码后遇到了 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);