我正在尝试修改用C编写的GPL程序.我的目标是用CUDA实现替换一个方法,这意味着我需要用nvcc而不是gcc编译.我需要帮助构建项目 - 不实现它(你不需要了解CUDA C的任何帮助,我不认为).
这是我第一次尝试更改涉及.configure和Makefile的中等复杂度的C项目.老实说,这是我第一次在C中做很长时间的事情,包括gcc或g ++的任何事情,所以我很丢失.
我对学习configure和Makefiles并不感兴趣 - 这更像是一个实验.我想在花费时间创建正确的构建脚本之前看看项目实现是否顺利.(并不是不愿意在必要时学习,只是试图了解范围).
话虽如此,我有什么选择来构建这个项目?我有很多问题......
我尝试在AC_PROG_CC之后将"CC = nvcc"添加到configure.in文件中.这似乎工作 - 从运行configure和make输出显示nvcc作为编译器.但是,无法使用CUDA内核编译源文件,而无法识别CUDA特定语法.我不知道为什么,希望这会有效.
是否可以使用nvcc编译源文件,然后将其包含在主程序的make过程的链接步骤中?如果是这样,怎么样?(这个问题可能没有意义 - 我真的生气了)
这样做的正确方法是什么?
我可以使用快速而肮脏的方式进行测试吗?
每个人都使用一些秘密工具来设置和理解这些配置和Makefile吗?这比我习惯的Apache Ant脚本更糟糕(是的,我不在我的境界)
我创建了一个静态库,其中包含一些CUDA代码和一些常规C ++代码。此静态库的CMakeLists.txt如下所示:
SET(TARGET_H some_header.h)
SET(CUDA_SRC cudaclass1.cu cudaclass2.cu)
SET(TARGET_SRC cppclass1.cpp cppclass2.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_LIBRARY(somestatic ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
Run Code Online (Sandbox Code Playgroud)
这将产生libsomestatic.a。
现在,我想将此静态库与可执行文件链接,该可执行文件本身由CUDA代码和C ++代码组成。
在这个可执行文件的CUDA代码,我需要实例化并使用CudaClass1从libsomestatic.a。
这是CMakeLists.txt可执行文件:
SET(TARGET_H some_header.h)
SET(CUDA_SRC cudafile.cu)
SET(TARGET_SRC main.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_EXECUTABLE(some_exe ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
TARGET_LINK_LIBRARIES(some_exe somestatic)
Run Code Online (Sandbox Code Playgroud)
但是在构建时出现以下错误:
nvlink error: Undefined reference to '_ZN10test7CudaClass1C1EPKNS_11intE' in ...
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
CUDA文档说明(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples)
“可以在单个主机可执行文件中进行多个设备链接,只要每个设备链接彼此独立(它们不能跨设备可执行文件共享代码)”
听起来我无法做我想做的事,对吧?
我使用CUDA 5.5和GCC 4.8。