首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GHC与NVCC

使用GHC与NVCC
EN

Stack Overflow用户
提问于 2013-11-13 15:02:54
回答 2查看 265关注 0票数 4

作为加速的另一种选择,我试图用Haskell的FFI调用CUDA代码。

下面是一个无法编译的简单程序:

cuda_code.cu:

代码语言:javascript
复制
void cuda_init() {
    cudaFree (0);
    cudaThreadSynchronize ();
}

Test.hs:

代码语言:javascript
复制
foreign import ccall unsafe "cuda_init" cuda_init :: IO ()
main = cuda_init

我用

代码语言:javascript
复制
$> nvcc -c -o cuda_code.o cuda_code.cu
$> ghc Test cuda_code.o

并得到了几个链接错误(对cudaFree的未定义引用等)。这并不令人惊讶,最明显的解决方案(对我来说)是使用-pgml nvcc与NVCC进行链接。(当我在C代码中使用Intel CILK+时,这是可行的:我只是将链接器更改为ICC,一切都很好。)

但是,使用NVCC链接会导致链接错误:

代码语言:javascript
复制
ghc Test -pgml nvcc cuda_code.o
[1 of 1] Compiling Main             ( Test.hs, Test.o )
Linking Test ...
nvcc fatal   : Unknown option 'u'

正在运行

代码语言:javascript
复制
strace -v -f -e execve ghc Test -pgml nvcc cuda_code.o

(有更简单的方法吗?)我发现ghc正在用

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

我假设-u选项是针对带有未定义符号的gcc (显然是icc)的,而nvcc显然不喜欢这样的东西。

我不知道GHC如何链接文件。关于如何让GHC链接到我的CUDA代码的想法?

--------EDIT-----------------

有人建议我试着和GCC联系(和往常一样),但是向gcc传递必要的链接选项,这样它就可以链接到CUDA库了。如果有人知道这些可能是什么,这可能是可行的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 02:38:06

我想出了如何让这件事成功的方法。

cudaTest.cu:

代码语言:javascript
复制
// 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

代码语言:javascript
复制
foreign import ccall unsafe "cudafunc" cudaFunc :: IO ()
main = cudaFunc

用下列方法汇编:

代码语言:javascript
复制
>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"显式地标记每个函数了。

票数 2
EN

Stack Overflow用户

发布于 2013-11-13 16:08:23

GHC使用/usr/lib/ghc/settings来确定编译器和链接器选项,并使用每个包文件(如/var/lib/ghc/package.conf.d/builtin_rts.conf )来确定包特定的链接器选项。(自定义目录安装将分别在${GHC}/lib/ghc-${VERSION}/settings${GHC}/lib/ghc-${VERSION}/package.conf.d中安装。)

这是我为RTS找到的:

代码语言:javascript
复制
ld-options: -u ghczmprim_GHCziTypes_Izh_static_info -u
            ghczmprim_GHCziTypes_Czh_static_info -u
            ghczmprim_GHCziTypes_Fzh_static_info -u
            ghczmprim_GHCziTypes_Dzh_static_info
            ...

根据ld手册页,-u选项将符号定义为必须在其他地方定义的未定义的extern

据我所知,这是唯一在-uld-options:部分中具有这些自定义package.conf.d选项的包。

不幸的是,对于使用不同选项接口的编译器/链接器,必须对它们进行翻译。

做得好,并让人们在哈斯克尔咖啡馆@haskell.org上发布这方面的信息。我敢肯定还有其他人也在尝试这样的东西!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19957104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档