4

加速する代わりに、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

(もっと簡単な方法はありますか?ghcnvcc

nvcc ... -L~/ghc... -L... -l... -l... -u ghczmprim_GHC... -u ghc...

オプションは、未定義のシンボルとのリンク(および明らかに)を-u目的としていると思いますが、明らかに気に入らないことがあります。gcciccnvcc

GHC がどのようにファイルをリンクするかについての知識はありません。GHC を私の CUDA コードにリンクさせる方法について考えてみませんか?

- - - - 編集 - - - - - - - - -

(いつものように)GCCとリンクしてみることを誰かが提案しましたが、必要なリンカーオプションを渡しgccてCUDAライブラリにリンクできるようにします。誰かがこれらが何であるかを知っていれば、これはおそらくうまくいくでしょう!

4

2 に答える 2

2

これを機能させる方法を見つけました。

cudaTest.cu:

// the `extern "C"` is important! It tells nvcc to not 
// mangle the name, since nvcc assumes C++ code by default
extern "C" 
void cudafunc() {
  cudaFree(0);
  cudaThreadSynchronize();
}

Test.hs

foreign import ccall unsafe "cudafunc" cudaFunc :: IO ()
main = cudaFunc

コンパイル:

>nvcc -c -o cudaTest.o cudaTest.cu
>ghc --make Test.hs -o Test cudaTest.o -optl-lcudart

また、GHC にオプション-pgmc g++を指定して削除しようとしましたがextern "C"(動作すると予想していました)、一部の CUDA ヘッダー ファイルでコンパイル エラーが発生しました。これを修正する簡単な方法がおそらくあるので、すべての関数に明示的にextern "C".

于 2013-12-05T02:38:06.213 に答える