我是CUDA编程的新手。我刚开始一个简单的vector-Add程序,但它的输出是异常的。
我的代码附在下面:
__global__
void vecAddKernel(float* A, float* B, float* C, int n){
int i = threadIdx.x + blockDim.x * blockIdx.x;
if(i < n){
C[i] = A[i] + B[i];
}
}
void vecAdd(float* A, float* B, float* C, int n){
int size = n * sizeof(float);
float *d_A, *d_B, *d_C;
cudaMalloc((void**)&d_A, size);
cudaMemcpy(d_A, A, size, cudaMemcpyHostToDevice);
cudaMalloc((void**)&d_B, size);
cudaMemcpy(d_B, B, size, cudaMemcpyHostToDevice);
cudaMalloc((void**)&d_C, size);
vecAddKernel<<<ceil(n/256.0), 256>>>(d_A, d_B, d_C, n);
cudaMemcpy(C, d_C, size, cudaMemcpyDeviceToHost);
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
}
int main(int argc, const char *argv[])
{
float A[10] = {1,2,3,4,5,6,7,8,9,10};
float B[10] = {10,20,30,40,50,60,70,80,90,100};
float* C;
C = (float*)malloc(10);
memset(C, 0, 10*sizeof(float));
vecAdd(A, B, C, 10);
for (int i = 0; i < 10; i++) {
printf("%f, ", C[i]);
}
printf("\n");
return 0;
}
我的CUDA为cuda-6.5
,gcc
为gcc49
。输出如下:
-9087809423414278337673035776.000000, 1.836612, -28609169409429209088.000000, 1.795911, 0.000000, 0.777735, -125923819520.000000, 1.807979, 585061501691794292736.000000, 1.826568
有没有办法调试这个程序?怎么了?提前感谢任何帮助。
答案 0 :(得分:4)
我现在没有测试环境,但我认为问题在于你的主要功能:
C = (float*)malloc(10);
应该是
C = (float*)malloc(10 * sizeof(float));
不确定是否还有其他问题。
要调试CUDA程序,我通常会定义一个错误检查函数和包装器宏,如下所示:
#define checkCudaErrors(err) { __checkCudaErrors((err), __FILE__, __LINE__); }
inline void __checkCudaErrors(cudaError_t err, const char *file, int line)
{
if (err != cudaSuccess)
{
fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n", file, line, (int)err, cudaGetErrorString(err));
exit(-1);
}
}
使用checkCudaErrors
宏包装每个CUDA API调用:
checkCudaErrors( cudaMalloc((void**)&d_A, size) );
我不是使用CUDA的专家,但希望这有帮助: - )
修改强>
另请参阅:What is the canonical way to check for errors using the CUDA runtime API?
最好not casting the result of malloc in C:
C = malloc(10 * sizeof(float));