2

ここで説明するには長すぎる理由から、Python内で呼び出し可能な共有ライブラリ(libAと呼びます)を「C」で作成する必要があります。この共有ライブラリは、別のカスタム共有ライブラリを呼び出す必要があります(libCudaという名前を付けます)。さらに、libAは、MySQLなどの他の多くの外部共有ライブラリを呼び出します。

libCudaを含める前は、Python内で呼び出されたすべてのC関数は問題なく機能し、MySQLサブ呼び出しは正常に機能していました。ただし、libCudaがlibAに追加されると、Pythonは次のように文句を言います。

caughtError c process - [directory]/libA.so: undefined symbol: cudaFunction1

ご想像のとおり、libCudaはnvccでコンパイルされたnVidia Cudaコードであり、Cリンク可能に設定されています(つまり、関数プロトコルで「C」をエクスポートします)。この共有ライブラリ(libCuda)をスタンドアロンのテストベンチ(記述)でテストしました。 C)で、すべてが期待どおりに機能します。これは、Cudaライブラリをコンパイルするために使用される命令です。

nvcc -arch=sm_30 -shared -o libCuda.so *.cu -Xcompiler -fPIC

私が使用する場合:

$ ldd libA

libAがlibCuda(またはMySQL)をロードする必要があることを示す情報が表示されません

libAのコンパイルに使用されるコマンドは次のとおりです(libCudaはローカルディレクトリにあります)。

gcc *.c -c -L. -lCuda -lmysqlclient [many other shared libraries] -fPIC
gcc -shared -Wl,-soname,libA.so -lCuda -lmysqlclient [many other shared libraries] -o libA.so *.o

両方のライブラリファイルを/usr/ libに配置し、LD_LIBRARY_PATHを明示的にエクスポートしてみました。運がない。どんな助けでも大歓迎です!

4

2 に答える 2

0

さて、勝てませんでしたが、ルールを変更することができました。

これを参考にして、最初にnvccでCUDAコードをコンパイルし、いくつかのオブジェクト(* .o)ファイルを作成しました。これらのオブジェクトファイルは、ライブラリlibAの作成時にgccによってリンクされたオブジェクトファイルのリストに追加されました。さらに、次のリンカー引数がgccコマンド「-L / usr / local / cuda / lib64-lcudart」に追加されました(私はx64マシンを使用しています)。

ライブラリの依存関係は、それを必要とするオブジェクトファイルの後に配置する必要があることを指摘することが非常に重要です。そうしないと、gccは未定義の参照について文句を言います。経験則として、すべてのライブラリをgcc行の最後に配置することです。詳細については、以下を参照してください。

一言で言えば、これがうまくいったことです:

CUDA:

nvcc -arch=sm_30 -c *.cu -Xcompiler -fPIC

C:

gcc *.c -c -fPIC -L/usr/local/cuda/lib64 -lcudart -lmysqlclient [many other shared libraries]
gcc -shared -Wl,-soname,libA.so -o libA.so *.o [cuda_obj_file_dir]/*.o -L/usr/local/cuda/lib64 -lcudart -lmysqlclient [many other shared libraries]

アドバイスをくれたAntonKovalenkoに感謝します。残念ながら、私は自分の最終的な目標を解決することができませんでしたが、おそらくこれは、現在私のために行っているように、他の誰かの中間体として役立つでしょう。

于 2013-01-15T21:27:32.747 に答える
0

libA.soをリンクするときは、使用する共有ライブラリを依存関係(-L$somedirectory -lCuda)として指定する必要があります。次に、依存関係がで表示さldd ./libA.soれるようになり、必要に応じて、それLD_LIBRARY_PATHが役立ちます。

共有ライブラリでは未定義のシンボルが許可されているため、シンボルを構築するときに十分な依存関係を提供するのはあなた次第です。で同じことが起こらない場合は、他の依存関係のために(または動的libmysqlclient)がロードされていることが原因である可能性があります。問題がすぐには見えない場合でも、それはおそらくあなたが望むものではありません。libmysqlclientRTLD_GLOBAL libA.so

PS

  1. sonames(?から始まる)で何かを読んで、man ld本当にリンクしたいかどうかを判断することをお勧めします(私が好むようにlibCuda.so反対ではありません)。libCuda.so.N
  2. 迅速で汚い回避策(この場所でまだ私と一緒にいる場合:)については、を試してくださいLD_PRELOAD=/full/path/to/libCuda.so your-program
于 2013-01-09T21:07:03.547 に答える