我最近设置了Ubuntu 14.04.1 LTS。我正在编写一个我写的小矩阵添加程序matrixAddition.cu。我编译代码如下:nvcc matrixAddition.cu -o matAdd。 生成的矩阵应该显示7 7 7 ...因为我添加了一个5的数组,数组为2.但是,它打印5 5 5 ...对我来说。内核由于某种原因无法正常工作吗?我错过了一些代码吗?谢谢你的阅读。
matrixAddition.cu
#include <iostream>
#include <stdio.h>
__global__ void matAdd(int * d_arra, int * d_arrb, int * length)
{
int id = threadIdx.x;
if(id<*length)
{
d_arra[id]=d_arra[id]+d_arrb[id];
}
}
int main () {
//cpu varriables
int arra[100];
int arrb[100];
int leng = 100;
//gpu varriables
int * d_arra;
int * d_arrb;
int * length;
//-std=c++11
for(int itr=0;itr<100;itr++){arra[itr]=5;arrb[itr]=2;}
cudaMalloc( (void**)&d_arra, 100*sizeof(int));
cudaMalloc( (void**)&d_arrb, 100*sizeof(int));
cudaMemcpy( d_arra, arra, 100*sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( d_arrb, arrb, 100*sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( length, &leng, sizeof(int), cudaMemcpyHostToDevice );
//max thread per block 1024
matAdd<<<1, 1024>>>(d_arra, d_arrb, length);
cudaMemcpy( arra, d_arra, 100*sizeof(int), cudaMemcpyDeviceToHost );
cudaFree( d_arra );
cudaFree( d_arrb );
cudaFree( length );
std::cout << " our data \n";
for(int itr=0;itr<100;itr++){std::cout << arra[itr]; if(itr%10==0&&itr!=0){std::cout <<"\n";}}
std::cout<<std::endl;
return 0;
}
答案 0 :(得分:1)
该错误在C中很常见。变量“length”未初始化。在将数据复制到地址之前,您忘记了为一个点变量设置malloc内存空间。
如果使用类型“int *”,则必须为d_arra / d_arrb执行cudaMalloc。但最好使用类型“int”而不是“int *”作为CUDA Samples中的示例vectorAdd,因为只有一个int传递给您的CUDA设备。
另一个小问题是在你的cout部分。由于数组索引从0开始,因此当“(itr + 1)%10 == 0&amp;&amp; itr!= 0”时需要输出换行符。
//cpu varriables
int arra[100];
int arrb[100];
int leng = 100;
//gpu varriables
int * d_arra;
int * d_arrb;
int * length;
//-std=c++11
for (int itr=0; itr<100; itr++)
{
arra[itr]=5;
arrb[itr]=2;
}
cudaMalloc( (void**)&d_arra, 100*sizeof(int));
cudaMalloc( (void**)&d_arrb, 100*sizeof(int));
cudaMalloc( (void**)&length, 1*sizeof(int)); // Add this line
cudaMemcpy( d_arra, arra, 100*sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( d_arrb, arrb, 100*sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( length, &leng, sizeof(int), cudaMemcpyHostToDevice );
//max thread per block 1024
matAdd<<<1, 1024>>>(d_arra, d_arrb, length);
cudaMemcpy( arra, d_arra, 100*sizeof(int), cudaMemcpyDeviceToHost );
cudaFree( d_arra );
cudaFree( d_arrb );
cudaFree( length );
std::cout << " our data \n";
for (int itr=0; itr<100; itr++)
{
std::cout << arra[itr];
if((itr+1)%10==0 && itr!=0)
{
std::cout <<"\n";
}
}
std::cout<<std::endl;