加速する代わりに、Haskell の FFI を介して CUDA コードを呼び出そうとしています。
コンパイルに失敗する簡単なプログラムを次に示します。
cuda_code.cu:
void cuda_init() {
cudaFree (0);
cudaThreadSynchronize ();
}
Test.hs:
foreign import ccall unsafe "cuda_init" cuda_init :: IO ()
main = cuda_init
でコンパイルしました
$> nvcc -c -o cuda_code.o cuda_code.cu
$> ghc Test cuda_code.o
いくつかのリンク エラーが発生しました (cudaFree への未定義の参照など)。これはそれほど驚くべきことではなく、(私にとって) 明らかな解決策は、 を使用して NVCC とリンクすること-pgml nvcc
です。(これは、C コードで Intel CILK+ を使用していたときに機能しました。リンカを ICC に変更しただけで、すべて正常に機能しました。)
ただし、NVCC を使用してリンクすると、リンク エラーが発生します。
ghc Test -pgml nvcc cuda_code.o
[1 of 1] Compiling Main ( Test.hs, Test.o )
Linking Test ...
nvcc fatal : Unknown option 'u'
ランニング
strace -v -f -e execve ghc Test -pgml nvcc cuda_code.o
(もっと簡単な方法はありますか?ghc
)nvcc
nvcc ... -L~/ghc... -L... -l... -l... -u ghczmprim_GHC... -u ghc...
オプションは、未定義のシンボルとのリンク(および明らかに)を-u
目的としていると思いますが、明らかに気に入らないことがあります。gcc
icc
nvcc
GHC がどのようにファイルをリンクするかについての知識はありません。GHC を私の CUDA コードにリンクさせる方法について考えてみませんか?
- - - - 編集 - - - - - - - - -
(いつものように)GCCとリンクしてみることを誰かが提案しましたが、必要なリンカーオプションを渡しgcc
てCUDAライブラリにリンクできるようにします。誰かがこれらが何であるかを知っていれば、これはおそらくうまくいくでしょう!