0

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

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

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ファイル内:

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

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

4

1 に答える 1

2

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

これはC関数の片側であり、通常、それらが異なるオブジェクトファイルにある場合、シンボルには関数の名前のみが含まれ、パラメーターは含まれません。

于 2012-04-30T20:38:24.723 に答える