-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;
}
@M欧姆我试着用你的修改。现在我没有得到这样的错误。但是当我编译这个我得到'分段错误(核心转储)'。 ..帮我解决这个问题 – Intern
分段错误是在有效内存之外访问的。您应该尝试在调试器中找到原因。 (但是看看你的代码,你试图从'h_arr'复制'n * n' ints到'd_arr',但是你的内存不是连续的ints。在你的情况下,你必须分配一个'n *或者在循环中复制子阵列。) –
并且您将三次分配给相同的数组'h_arr1'。当然,这是一个错字。 –