【发布时间】:2013-11-13 15:02:54
【问题描述】:
作为accelerate 的替代方案,我试图通过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 的引用等)。这并不奇怪,显而易见的解决方案(对我来说)是使用-pgml nvcc 与 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 选项适用于带有未定义符号的linking gcc(显然是icc),nvcc 显然不喜欢。
我不知道 GHC 如何链接文件。关于如何让 GHC 链接到我的 CUDA 代码的想法?
--------编辑-----------------
有人建议我尝试与 GCC 链接(像往常一样),但将必要的链接器选项传递给 gcc,以便它可以链接到 CUDA 库。如果有人知道这些可能是什么,这可能会起作用!
【问题讨论】:
-
仅将 gcc 与 -lcudart 链接并不能完全解决问题:我在 cuda_code.cu 中声明的函数有未定义的符号。也许不同的 .o 格式?