2015-01-10 89 views
1

我最近设置了Ubuntu 14.04.1 LTS。我正在编写一个我写的矩阵加法程序,matrixAddition.cu。我编译这样的代码:nvcc matrixAddition.cu -o matAdd。 生成的矩阵应显示7 7 7 ...因为我添加了一个数组为5的数组2.但是,它为我打印了5 5 5 ...。内核因为某种原因失败了吗?我是否缺少一些代码?谢谢阅读。C++ Cuda代码不运行内核

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; 
} 
+1

无论何时您遇到CUDA代码问题,最好使用[适当的cuda错误检查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-方式对检查换错误 - 使用最CUDA的运行时API)。 (但我相信袁的答案是正确的。) –

回答

1

bug是C.可变 “长度” 共同未初始化。在将数据复制到地址之前,您忘记了malloc的内存空间作为点变量。

如果使用类型“int *”,则必须为它做cudaMalloc作为d_arra/d_arrb。但最好在CUDA Samples中使用类型“int”而不是“int *”作为示例vectorAdd,因为只有一个int传递给CUDA设备。

另一个小问题是在你的cout部分。由于数组索引从0开始,所以当“(itr + 1)%10 == 0 & & 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;