ここでは私のコードです: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を小さなプログラムに実装するのは、よりうまくいくことです。うまくいきます。 ドライバを更新しましたが、まだエラーがあります。
誰も私に、なぜこれが起こり、どのように解決するかについてのヒントを与えることができますか?ありがとう。
ところで、cudaMemcpyはcudaErrorInvalidValueを戻します。 – TonyLic
'A a;'はどこにありますか?それは機能の中にあるのか、それともグローバルなのでしょうか?グローバルであれば、有効なデバイスコンテキストを取得する前にコンストラクタを呼び出すことができます(これについてはわかりませんが、可能です)。その場合、cudaMemcpyに渡されたdポインタは無効になります。 – harrism
あなたが使っているCUDA設定を投稿できますか?古いGeForce 9400mおよびCUDA 5.0プレビューでエラーを再現することはできません。 – jopasserat