В качестве альтернативы accelerate, я пытаюсь вызвать код CUDA через FFI Haskell.Использование GHC с NVCC
Вот простая программа, которая не компилировать:
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
. (Это работает, когда я использую Intel Cilk + в моем коде C:. Я просто изменил компоновщик ICC, и все работало просто отлично)
Howver, используя 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
варианты предназначены для linking gcc
(и по-видимому icc
) с неопределенными символами, что-то nvcc
явно не нравится.
У меня нет знаний о том, как файлы ссылок GHC. Мысли о том, как я могу заставить GHC связать мой код CUDA?
-------- EDIT -----------------
Кто-то предложил мне попробовать связь с GCC (как обычно), но передайте необходимые параметры компоновщика в gcc
, чтобы он мог ссылаться на библиотеки CUDA. Если кто-нибудь знает, что это может быть, это, вероятно, сработает!
Просто связывание gcc с -lcudart не совсем разрезает: я получаю неопределенные символы для своих функций, объявленных в cuda_code.cu. Возможно, разные форматы .o? – crockeea