これは私の最小の動作しないテストケースです。私はStampedeクラスタ(CUDA /環境の残りの部分)で自動的に設定されているので、そこに問題はないはずです。CUDAベーシックな構造体テストが動作しない
実行すると、出力ホストb
の配列は決して変更されません(デバイスからもコピーされません)。私の出力は0.0
、0.0
です - それは明らかに100.0
、100.0
です。
nvcc -c -O3 -arch=compute_35 -code=sm_35 test.cu
それは対話型端末セッション(idev -n 1 -N 1
)にibrun ./test
コマンドを使用して行うことができます実行:
#include <cuda.h>
#include <stdio.h>
struct point {
double x,y;
};
__global__ void MyFunc(point* d_a) {
d_a->x = 100.0;
d_a->y = 100.0;
}
int main(void) {
point * a = (point*)malloc(sizeof(point));
a->x=10.0;
a->y=10.0;
point * d_a;
cudaMalloc((void**)&d_a,sizeof(point));
cudaMemcpy(d_a,a,sizeof(point),cudaMemcpyHostToDevice);
cudaDeviceSynchronize();
MyFunc<<<1,1>>>(d_a);
cudaDeviceSynchronize();
point * b = (point*)malloc(sizeof(point));
cudaMemcpy(b,d_a,sizeof(point),cudaMemcpyDeviceToHost);
printf("%lf %lf\n",b->x,b->y);
cudaFree(d_a);
free(a);
free(b);
return 0;
}
コードを使ってCUDA 6.5.12と罰金コンパイルします。
実行中にエラーまたはセグメンテーションが報告されません。それは間違った出力を与えます。コードに問題があるのですか、それとも間違って実行していますか?
は、なぜあなたは '' cudaDeviceSynchronize()を呼び出すのですか? – pSoLT
@pSoLT必要かどうか分からない。私は、 'global'関数を呼び出す前にGPUにデータが完全にロードされていることを確認し、データをホストにコピーしようとする前に' global'関数で完全に完了したかったのです。 – NoseKnowsAll
'cudaMemcpy'呼び出しは同期的なので、心配する必要はありません。 – pSoLT