2016-04-13 7 views
2

私は次のコードを書いて、2つの4x4行列を合計しました。このほかのクーダ行列の追加

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 

__global__ void Matrix_add(double* a, double* b, double* c,int n) 
{ 
    int row = blockIdx.x * blockDim.x + threadIdx.x; 
    int col = blockIdx.y * blockDim.y + threadIdx.y; 
    int index = row * n + col; 
    if(col<n && row <n) 
     c[index] = a[index] + b[index]; 
} 
int main() 
{ 

int n=4; 

double **h_a; 
double **h_b; 
double **h_c; 
double *d_a, *d_b, *d_c; 

int size = n*n*sizeof(double); 

h_a = (double **) malloc(n*sizeof(double*)); 
h_b = (double **) malloc(n*sizeof(double*)); 
h_c = (double **) malloc(n*sizeof(double*)); 

cudaMalloc((void**)&d_a,size); 
cudaMalloc((void**)&d_b,size); 
cudaMalloc((void**)&d_c,size); 

int t=0; 
for (t=0;t<n;t++) 
{ 
     h_a[t]= (double *)malloc(n*sizeof(double)); 
     h_b[t]= (double *)malloc(n*sizeof(double)); 
     h_c[t]= (double *)malloc(n*sizeof(double)); 
} 

int i=0,j=0; 

for(i=0;i<n;i++) 
{ 
for(j=0;j<n;j++) 
    { 
     h_a[i][j]=sin(i)*sin(i); 
     h_b[i][j]=cos(i)*cos(i); 
    } 
} 

cudaMemcpy(d_a,h_a+n,size,cudaMemcpyHostToDevice); 
cudaMemcpy(d_b,h_b+n,size,cudaMemcpyHostToDevice); 

dim3 dimBlock(4,4); 
dim3 dimGrid(1,1); 
Matrix_add<<<dimGrid, dimBlock>>>(d_a,d_b,d_c,n); 
cudaMemcpy(h_c+n,d_c,size,cudaMemcpyDeviceToHost); 

for(i=0;i<n;i++) 
{ 
    for(j=0;j<n;j++) 
     { 
      printf("%f",h_c[i][j]); 
      printf("\t"); 
     } 
    printf("\n"); 
} 

for(i=0;i<n;i++) 
    { 
     free(h_a[i]); 
     free(h_b[i]); 
     free(h_c[i]); 
} 
free(h_a); 
free(h_b); 
free(h_c); 
cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); 
return 0; 

} 

結果は、2x2のすべてのものの行列でなければなりませんが、結果には行列のすべての要素は0です。また、私は結果を取得した後、このメッセージが表示されますされています

セグメンテーションフォールト(コアをダンプされた)

誰でも問題を見つけるのに手伝ってください。

はあなたに

答えて

5

あなたのホスト配列をありがとう(H_A、H_B、h_c))ので、あなたの最初のcudaMemcpy(、メモリ内に連続していないGPUのメモリ(あなたのケースでは明らかにゼロ)にゴミを読み込みます呼び出します。

なぜなら、ホスト配列は実際にはフラットではなく、代わりにポインタの配列として表されているからです。私はCで2次元配列を偽造すると思いますか?いずれにしても、cudaMemcpy()をより注意深くして、ホスト配列を行単位でコピーするか、ホスト上でフラット表現を使用する必要があります。

+0

適切な解決策は、フラット表現を使用することです。個別に割り当てられた行の配列は面倒で、エラーが発生しやすく、非効率的です。あなたは 'h [i * row_stride + j]'に慣れる(またはマクロの後ろに隠す)と、あなたの簿記コードは劇的に縮小します。 – Peter

関連する問題