2017-09-13 110 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'。當然,這是一個錯字。 –