2012-05-14 44 views
3

ここでは私のコードです:CUDA cudaMemcpy:無効な引数

struct S { 
    int a, b; 
    float c, d; 
}; 
class A { 
private: 
    S* d; 
    S h[3]; 
public: 
    A() { 
     cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3)); 
    } 
void Init(); 
}; 

void A::Init() { 
    for (int i=0;i<3;i++) { 
     h[i].a = 0; 
     h[i].b = 1; 
     h[i].c = 2; 
     h[i].d = 3; 
    } 
    cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice)); 
} 

A a; 

実際にはCUDAとOpenGLを含んで複雑なプログラムです。このプログラムをデバッグすると、エラー情報でcudaMemcpyを実行すると失敗します。

cudaSafeCall()ランタイムAPIエラー11:無効な引数です。

実際には、このプログラムは正しく動作する別のプログラムから変換されます。しかし、その中では、クラスではなく、メイン関数で2つの変数S * dとS h [3]を使用しました。私がこのクラスAを小さなプログラムに実装するのは、よりうまくいくことです。うまくいきます。 ドライバを更新しましたが、まだエラーがあります。

誰も私に、なぜこれが起こり、どのように解決するかについてのヒントを与えることができますか?ありがとう。

+0

ところで、cudaMemcpyはcudaErrorInvalidValueを戻します。 – TonyLic

+2

'A a;'はどこにありますか?それは機能の中にあるのか、それともグローバルなのでしょうか?グローバルであれば、有効なデバイスコンテキストを取得する前にコンストラクタを呼び出すことができます(これについてはわかりませんが、可能です)。その場合、cudaMemcpyに渡されたdポインタは無効になります。 – harrism

+0

あなたが使っているCUDA設定を投稿できますか?古いGeForce 9400mおよびCUDA 5.0プレビューでエラーを再現することはできません。 – jopasserat

答えて

3

CUDAのメモリ操作はブロックされているため、同期ポイントが作成されます。他のエラーは、cudaThreadSynchonizeでチェックされていないとメモリ呼び出しのエラーのように見えます。

メモリ操作でエラーが発生した場合は、その前にcudaThreadSynchronizeを配置して結果を確認してください。


最初のmalloc文が実行されていることを確認してください。 @ハリスムのようにCUDAの初期化に関する問題がある場合、このステートメントでは失敗しますか? printfステートメントを配置して、適切な初期化が実行されていることを確認してください。私は一般的に無効な引数エラーは、非初期化メモリ領域を使用するために生成されると思います。

  1. cudaMalloc'edメモリ領域のアドレス

    A() 
    { 
        d = NULL; 
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3)); 
        printf("D: %p\n", d); 
    } 
    
  2. すなわちにcudaMallocを移動し、ローカルに割り当てられた領域のためのメモリコピーを作成するようにしてくださいを示すあなたのコンストラクタにprintf関数を書きます上記のcudaMemcopy(テスト用)

    void A::Init() 
    { 
        for (int i=0;i<3;i++) 
        { 
         h[i].a = 0; 
         h[i].b = 1; 
         h[i].c = 2; 
         h[i].d = 3; 
        } 
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3)); // here!.. 
        cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice)); 
    } 
    

幸運。