2017-09-13 121 views
-2

我已经编写了一个程序来在cuda编程中进行矩阵乘法,但是我得到了一些错误。我提到了r =错误,我收到了。尝试编译cuda编程时出现错误

expected an identifier代码行int a=0,b=0

expression must be a modifiable lvalue行代码b=arr2[(a*b)+row]

我刚才提到的代码below.I感到非常乞讨CUDA programming.please帮我解决这个问题。

#include<stdio.h> 

    #define n 512 
    #define r 512 
    #define t 512 
    #define b 512 

    __global__ void metrimul(int *arr,int *arr2,int *arr3){ 

int row=threadIdx.x; 
int column=threadIdx.y; 

int result=0,i; 
int a=0,b=0; 

for(i=0;i<n;i++){ 
    a=arr[(column * n) + i]; 
    b=arr2[(i * n) + row]; 
    result=(a * b)+result ; 
} 

arr3[(column*n) + row]=result; 


} 

int main(){ 

int **h_arr1=(int **)malloc(sizeof(int *)* n); 
int **h_arr2=(int **)malloc(sizeof(int *)* n); 
int **h_arr3=(int **)malloc(sizeof(int *)* n); 

int *d_arr1; 
int *d_arr2; 
int *d_arr3; 

int i,j,k; 

cudaMalloc((void **)&d_arr1,sizeof(int) * n); 
cudaMalloc((void **)&d_arr2,sizeof(int) * n); 
cudaMalloc((void **)&d_arr3,sizeof(int) * n); 

for(i=0;i<n;i++){ 
    h_arr1[i]=(int *)malloc(sizeof(int) * n); 
    h_arr1[i]=(int *)malloc(sizeof(int) * n); 
    h_arr1[i]=(int *)malloc(sizeof(int) * n); 
} 

for(j=0;j<n;j++){ 
    for(k=0;k<n*n;k++){ 
     h_arr1[j][k]=1; 
     h_arr2[j][k]=1; 
    } 
} 

cudaMemcpy(d_arr1,h_arr1,n * n * sizeof(int),cudaMemcpyHostToDevice); 
cudaMemcpy(d_arr2,h_arr2,n * n * sizeof(int),cudaMemcpyHostToDevice); 

metrimul<<<b,t>>>(d_arr1,d_arr2,d_arr3); 

cudaMemcpy(h_arr3,d_arr3,n * n * sizeof(int),cudaMemcpyDeviceToHost); 

for(j=0;j<n;j++){ 
    for(k=0;k<n*n;k++){ 
    printf("%d",h_arr3[j][k]); 
    } 
} 

return 0; 

} 

回答

3

你有一个宏观b

#define b 512 

请记住,宏实际上只是文本替换:中b所有事件作为一个整体词将与512被替换。现在,编译器看到这一行

int a=0,b=0; 

为:

int a=0,512=0; 

而这显然是一个语法错误。 (因为这是错误的常见原因,对宏使用全大写名称是一个好习惯,宏被替换的阶段称为预处理,您的编译器可以显示源代码看起来像预处理后,例如gcc -E ...cl /E ..。)

+0

@M欧姆我试着用你的修改。现在我没有得到这样的错误。但是当我编译这个我得到'分段错误(核心转储)'。 ..帮我解决这个问题 – Intern

+0

分段错误是在有效内存之外访问的。您应该尝试在调试器中找到原因。 (但是看看你的代码,你试图从'h_arr'复制'n * n' ints到'd_arr',但是你的内存不是连续的ints。在你的情况下,你必须分配一个'n *或者在循环中复制子阵列。) –

+1

并且您将三次分配给相同的数组'h_arr1'。当然,这是一个错字。 –