2012-04-30 23 views
0

CUDA関数をいくつか起動するために、C++ファイルがextern "C"関数を呼び出すプログラムを記述しています。コードのデバッグ中に、extern関数を入力すると、私のポインタの1つのターゲットアドレスが変わることがわかりました。ここで extern関数呼び出し時にポインタアドレスが変更される

は(私の.cppファイル内の)問題のあるコードです:

extern "C" void launch_kernel(int numParticles, float4* positions, float4* velocities, 
    float4* embedded, float4* forces, 
#ifndef USE_ATOMIC_FLOAT 
    int4* externalForces, 
#endif 
    float* masses, int* knnIndices, float dt) 
{ 
    std::cout << "knnIndices at launch start: " << knnIndices << std::endl; 

これからの出力は次のとおりです:

knnIndices before launch: 0x200420000 
knnIndices at launch start: 0x200321400 
knnIndices after launch complete: 0x200420000 
cout << "knnIndices before launch: " << knnIndices_d << endl; 

launch_kernel(numParticles, dptr /*positions_d*/, velocities_d, embedded_d, 
    forces_d, 
    #ifndef USE_ATOMIC_FLOAT 
    externalForces_d, 
    #endif 
    masses_d, knnIndices_d, dt); 

cout << "knnIndices after launch complete: " << knnIndices_d << endl; 

と.cuファイル内

私はこの振る舞いを説明しようとするアイデアがなくなり、助けていただければ幸いです。ありがとう!

+1

...彼らは異なるオブジェクト・ファイルにある場合、通常、記号のみの関数の名前ではなく、パラメータが含まれて、C関数の一つの側では、それは 'USE_ATOMIC_FLOAT'が定義されている可能性があります2つの場所で異なっていますか?もしそうなら、呼び出し側が 'knnIndices'と考えるものは' launch_kernel'が 'masses'と考えるものです。あなたの診断' cout << 'が' USE_ATOMIC_FLOAT'の値とポインタ値のいくつかを報告するようにしてください。あなたが得るものを私たちに教えてください。 –

+1

「const」として変更したくない変数があると宣言すると、それが役に立つかもしれません。誤って変更した場合、コンパイラはエラーを出します。 valgrindで実行して、範囲外の配列アクセスがないことを確認することもできます。 – smocking

+0

@ smockingありがとう、私はそれを考えていた。このような素晴らしい提案ですばやく対応した皆様に感謝します。私はCとC++の間のこの通信の前に多くの経験を持っていませんでしたが、これは私に多くのことを教えてくれました。 – skylz

答えて

2

USE_ATOMIC_FLOATがソースの1つにのみ定義されているようです。パラメータの実際のインデックスが間違っているので、確認のため前後のパラメータを印刷してください(あるいはコードをチェックしてみてください)。

これは

+0

私は完全なファイルの小さな部分だけを貼り付けましたが、実際にはUSE_ATOMIC_FLOATはコンパイラの引数として設定されています。私はそれが1つのファイルまたは他のファイルのために定義されていなかったら、この点に達する前にリンクエラーがあると思うでしょう...しかし、私は確かに確かに二重チェックします。 – skylz

+1

@skylz:1つのソースファイルにそれがあっても、それ以外のものがなければ、それは診断を必要としないODR違反です。 – ildjarn

+0

@skylz - それがうまくいった。これは(私の経験から)非常に迷惑なバグです – MByD

関連する問題