矢量加CUDA

问题描述 投票:-1回答:1

我是CUDA的新手并且正在进行第一个练习,即矢量添加

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

// Compute vector sum C = A+B
//CUDA kernel. Each thread performes one pair-wise addition

__global__ void vecAddKernel(float *A, float *B, float *C, int n)
{
//Get our global thread ID
int i = blockDim.x*blockIdx.x+threadIdx.x;

if (i<n) C[i] = A[i] + B[i];
}

int main(int argc, char* argv[])
{

//Size of vectors
int n = 100000;

int size = n * sizeof(float);


//Host input vectors
float *h_A, *h_B;
//Host output vector
float *h_C;

//Device input vectors
float *d_A, *d_B;
//Device output vector
float *d_C;

//Allocate memory for each vector on host
h_A = (float*)malloc(sizeof(size));
h_B = (float*)malloc(sizeof(size));
h_C = (float*)malloc(sizeof(size));

//Allocate memory for each vector on GPU
cudaMalloc( (void **) &d_A, size);
cudaMalloc( (void **) &d_B, size);
cudaMalloc( (void **) &d_C, size);

//Copy host vectors to device
cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

int blockSize, gridSize;

//Number of threads in each block
blockSize = 1024;//Execute the kernel
vecAddKernel<<<gridSize,blockSize>>>(d_A, d_B, d_C, n);

//Synchronize threads
cudaThreadSynchronize();

//Copy array back to host
cudaMemcpy( h_C, d_C, size, cudaMemcpyDeviceToHost );


//Release device memory
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);

//Release host memory
free(h_A);
free(h_B);
free(h_C);

return 0;
}

编译成功了,但在运行代码时我得到:`Segmentation fault(core dumped)。我不知道问题出在哪里。我试过使用nvprof,但它无论如何都没用。任何人都可以帮我弄清楚我犯了什么错误吗?

c++ cuda
1个回答
1
投票

这些陈述不正确:

h_A = (float*)malloc(sizeof(size));
h_B = (float*)malloc(sizeof(size));
h_C = (float*)malloc(sizeof(size));

他们应该是:

h_A = (float*)malloc(size);
h_B = (float*)malloc(size);
h_C = (float*)malloc(size);

malloc获取一个参数,该参数是要分配的字节大小。因此,当您传递size的值时,您传递的值为400000,这是正确的。当你传递sizeof(size)的值时,你传递的值是size变量的大小(以字节为单位)(即size变量本身占用多少空间来存储它的数字)。这是值4(int是4个字节)。

因此,当你执行cudaMemcpy操作目标时,h_A并要求将400000字节传输到/从任何h_A指向,并且你只提供了4个字节的分配(无论它指向的是什么)你将超出它并且得到一个段错误。

这与CUDA没什么关系。

顺便说一句,nvprof不是解决这个问题的正确工具。 nvprof是一个分析器,它期望要分析的代码在功能上是正确的。你不使用nvprof来调试这样的问题。它不是调试器。

由于这纯粹是一个主机代码问题(因为所有的seg故障,即使在CUDA中),您也可以使用像gdb这样的主机调试器来调试它。当然你可以类似地使用像cuda-gdb这样的工具来调试它。同样,如果你在Windows上,也有内置的调试器。视觉工作室。

最后,它不会对这个特定问题有多大帮助,但我总是建议您在使用CUDA代码时遇到问题,使用proper CUDA error checking并使用cuda-memcheck运行代码。

© www.soinside.com 2019 - 2024. All rights reserved.