• 締切済み

CUDAプログラムが実行できません。

行列の加算プログラムを作成したいのですが、どうもGPUとのやり取りがうまくいってないみたいです。 コンパイルは通るのですが、ホスト側で0を渡して計算結果をデバイス側から返すはずなのですが、計算結果ではなく0が返ってきます。 なので、GPUとのやり取りの部分だけを抜粋したプログラムを載せるので、ご指摘よろしくお願いします。 環境はUbuntu12.04.、CUDA5.0、GPUはtesla k20です。 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <cublas.h> #define N 64 #define BLOCK 16 __global__ void matrixMul(int* inMatA); int main(int argc,char** argv){ //cudaError_t CuErr; int matrixSize=sizeof(unsigned int)*N*N; int* hMatA; hMatA=(int*)malloc(matrixSize); int x,y; for(x=0;x<N;x++){ for(y=0;y<N;y++){ hMatA[x*N+y]=1; } } printf("hMatA \n"); for(x=0;x<N;x++){ for(y=0;y<N;y++){ printf("%d ",hMatA[x*N+y]); } printf("\n"); } int* dMatA; cudaMalloc((void**)&dMatA, matrixSize); cudaMemcpy(dMatA, hMatA, matrixSize, cudaMemcpyHostToDevice); dim3 block(BLOCK,BLOCK); dim3 grid(N/BLOCK,N/BLOCK); matrixMul<<<grid,block>>>(dMatA); cudaThreadSynchronize(); cudaMemcpy(hMatA, dMatA, matrixSize, cudaMemcpyDeviceToHost); printf("hMatA \n"); for(x=0;x<N;x++){ for(y=0;y<N;y++){ printf("%d ",hMatA[x*N+y]); } printf("\n"); } free(hMatA); cudaFree(hMatA); cudaThreadExit(); } __global__ void matrixMul(int* inMatA){ int x,y; for(y=0;y<N;y++){ for(x=0;x<N;x++){ inMatA[x+y*N]=0; } } }

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

No.1,2です。 >inMatA[x+y*N]=0; >はループを逆にするか、xyを入れ替える方が良いです 勘違いです。質問欄のプログラムが正解です。コンパイルするときに私自身が少し書き換えたのでその時に間違えたのが原因でした。 すみませんでした。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

こちらはtesla k20ではなく普通のGPUですが、質問欄のプログラムをそのままnvccでコンパイルしましたが、正常に動きますよ。 最初は1だけの出力、その次に0だけの出力になります。 tesla k20でのバグの報告もあるようです。CUDA5.5が出ていますので、それにされてはいかがでしょうか? http://on-demand.gputechconf.com/gtc/2013/jp/sessions/4006.pdf 余談ですが、最後の inMatA[x+y*N]=0; はループを逆にするか、xyを入れ替える方が良いです。他はちゃんとなっていますので気がつかれているとは思いますが。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

openACCしか使っていないので、完全に理解していませんが、 質問欄のプログラムは正しく動いているように見えます。 プログラム自体は1を配列に入れ、device側で0を埋めていますので、当然そうなります。

taiti_023
質問者

補足

補足です。 ホスト側で0をを渡して0が返ってくると書きましたが、 ホスト側で1を渡す→デバイス側で0に変更→ホスト側に0を返す→ホスト側を表示するが1のまま の間違いでしたすみません。

関連するQ&A