矢量添加库达

vector addition CUDA

本文关键字:添加      更新时间:2023-10-16

我是 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;
}

编译成功,但在运行代码时,我得到:"分段错误(核心转储(。我看不出问题出在哪里。我尝试使用 nvprof,但它没有任何帮助。 谁能帮我找出我在哪里犯了错误?

这些陈述不正确:

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 个字节的分配(无论它指向什么(,您将溢出它并得到一个 seg 错误。

这与 CUDA 关系不大。

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

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

最后,它对这个特定问题没有多大帮助,但我总是建议您在使用 CUDA 代码时遇到问题时,使用正确的 CUDA 错误检查并使用cuda-memcheck运行您的代码。