2017-03-10 9 views
0

これは私の最小の動作しないテストケースです。私はStampedeクラスタ(CUDA /環境の残りの部分)で自動的に設定されているので、そこに問題はないはずです。CUDAベーシックな構造体テストが動作しない

実行すると、出力ホストbの配列は決して変更されません(デバイスからもコピーされません)。私の出力は0.00.0です - それは明らかに100.0100.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と罰金コンパイルします。

実行中にエラーまたはセグメンテーションが報告されません。それは間違った出力を与えます。コードに問題があるのですか、それとも間違って実行していますか?

+0

は、なぜあなたは '' cudaDeviceSynchronize()を呼び出すのですか? – pSoLT

+0

@pSoLT必要かどうか分からない。私は、 'global'関数を呼び出す前にGPUにデータが完全にロードされていることを確認し、データをホストにコピーしようとする前に' global'関数で完全に完了したかったのです。 – NoseKnowsAll

+0

'cudaMemcpy'呼び出しは同期的なので、心配する必要はありません。 – pSoLT

答えて

0

実際、コメントで説明したように、(idevを使用する)GPUノード上の対話的な環境は期待通りに動作しませんでした。私の質問には真の "答え"はありませんが、私は今、回避策を考え出しました。この質問を見て、私の元のセットアップがうまくいかなかった理由を説明しようとする人を歓迎します。

コードは実際には正しく、@ pSoLTで確認されているので、問題はありませんでした。後で私はコメントを読んだだけで、cudaエラーチェックコードも動作します。問題は、対話型環境では計算ノード上のアクセラレータと通信できないということです。この問題を解決するには、CUDAコードを実行するために対話的に計算ノードにログを記録する代わりに、デフォルトのログインノードからsbatchスクリプトを送信しました。次のような何かが私の仕事:

#!/bin/bash 
#SBATCH -A XXXXXXX 
#SBATCH -J testRun 
#SBTACH -o output/testOutput 
#SBATCH -n 1 
#SBATCH -p projectName 
#SBATCH -t 00:01:00 

ibrun ./test 
+0

CUDAタグの未回答の質問キューから落ちるように、数日後にこれを受け入れることを覚えておいてください – talonmies

関連する問題