2017-07-09 2 views
0

私は、CUDAカーネル内でLAPACKE関数を使用して、小さな方程式系を解くことを試みています。私は呼び出したいカーネル関数を含むメインソースファイルを持っています。そのカーネル関数の中で、別のソースファイルで定義されているLAPACKE関数LAPACKE_dgesv()を呼び出したいと思います。PyCuda SourceModuleを入手してデバイスコードを含む複数のソースファイルをコンパイルするには?

私のメインソースファイルには、LAPACKE_dgesv()の宣言を含むlapacke.hというヘッダーファイルが含まれています。さらに、lapacke.hを編集して、__device__の前に、LAPACKE_dgesv()の関数宣言を追加しました。

LAPACKE_dgesv()の定義を含むソースファイルのディレクトリをPythonコードのSourceModule呼び出しのinclude_dirs引数に追加しました。私は、コードを実行したときしかし、私はこのエラーを取得する:

ptxas fatal : Unresolved extern function 'LAPACKE_dgesv' 

私の推測では、LAPACKE_dgesv()の定義を含むソースファイルをコンパイルされていないことです。

PyCudaにデバイスコードを含む複数のソースファイルをコンパイルする方法はありますか? --relocatable-device-code=trueフラグを持つCUDAコンパイラをPyCudaが実行する方法が必要になると思われます。

答えて

1

いいえ、SourceModuleでこれを行うことはできません。

非常に最近にMasterブランチに追加された実験的なDynamicSourceModuleがあります。これは文書化されていないものの、これまで使用したことはありませんが、そうしないと、静的にPyCUDAの外部にあるコードを静的にコンパイルしてデバイスをcubinファイルにリンクし、標準のAPIを介して結果のデバイスコードをロードすることができます。

+0

もし私が手動でPyCudaの外にあるcubinファイルを作成したら、それをPythonコードの 'module_from_file' PyCuda関数を使ってロードすることができましたか? – Thomas

+0

はい。また、デバイスコードにC++リンケージがある場合に、シンボル名を取得するために、先験的にキューインテンの内容を調べることができるという利点があります – talonmies

関連する問題