Haskell与OpenACC混合二进制程序为何触发SEGV错误?
GCC+OpenACC混合程序正常运行,但Haskell+OpenACC混合程序触发SEGV错误
我最近碰到个棘手的问题:用GCC搭配OpenACC构建的混合二进制程序能正常跑起来,但换成Haskell和OpenACC组合的混合程序时,一运行就触发段错误(SEGV)。下面给大家梳理下两种场景的具体情况:
正常运行的GCC+OpenACC场景
这个场景下,构建和运行流程全程顺畅,没有任何异常:
- 执行构建命令:
$ make gcc main.c -ldl /opt/pgi/linux86-64/17.10/bin/pgcc -shared -fpic -fast -acc -ta=tesla,cc60 -o libtestacc.so acc.c - 运行程序的命令及输出:
$ make run LD_LIBRARY_PATH=./ ACC_DEVICE_TYPE=NVIDIA ACC_DEVICE_NUM=1 PGI_ACC_NOTIFY=1 ./a.out *** acc_init called!
可以看到OpenACC初始化正常完成,程序没有崩溃。
触发SEGV的Haskell+OpenACC场景
但用Haskell与OpenACC构建的混合二进制程序,运行时直接触发段错误。目前我初步怀疑几个排查方向:
- Haskell的FFI(Foreign Function Interface)在调用OpenACC共享库时,是否正确处理了OpenACC的运行时上下文初始化?
- OpenACC运行时库在Haskell环境下的加载顺序,是否和GCC场景存在差异,导致初始化不完整?
- Haskell的内存管理模型和OpenACC的设备内存交互是否存在冲突,比如内存释放时机不匹配?
有没有遇到过类似问题的朋友,能给点排查思路或者解决方案?
内容的提问来源于stack exchange,提问作者masterq
相关产品推荐
相关产品推荐

