我正在研究一个使用C ++源代码和CUDA的示例程序。这是我的四个源文件中的基本内容。
matrixmul.cu(主要CUDA源代码):
#include <stdlib.h>
#include <cutil.h>
#include "assist.h"
#include "matrixmul.h"
int main (int argc, char ** argv)
{
...
computeGold(reference, hostM, hostN, Mh, Mw, Nw); //reference to .cpp file
...
}
matrixmul_gold.cpp(C ++源代码,单一函数,无主方法):
void computeGold(float * P, const float * M, const float * N, int Mh, int Mw, int Nw)
{
...
}
matrixmul.h(matrixmul_gold.cpp文件的标题)
#ifndef matrixmul_h
#define matrixmul_h
extern "C"
void computeGold(float * P, const float * M, const float * N, int Mh, int Mw, int Nw);
#endif
assist.h(帮助函数)
我正在尝试编译和链接这些文件,以便它们正常工作。到目前为止,我可以使用以下方法编译matrixmul_gold.cpp:
g++ -c matrixmul_gold.cpp
我可以使用以下方法编译CUDA源代码,但没有错误:
nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib matrixmul.cu -c -lcutil_x86_64
但我最终得到了两个.O文件。我已经尝试了很多不同的方法来链接这两个.O文件,但到目前为止它是不行的。什么是正确的方法?
更新:根据要求,这是输出:
nm matrixmul_gold.o matrixmul.o | grep computeGold
nm: 'matrixmul.o': No such file
0000000000000000 T _Z11computeGoldPfPKfS1_iii
我认为'matrixmul.o'缺少错误是因为我在运行建议的编译命令时实际上没有成功编译:
nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib -o matrixmul matrixmul.cu matrixmul_gold.o -lcutil_x86_64
更新2:我在matrixmul_gold.cpp的开头缺少extern "C"
。我补充说,建议的编译命令工作得很好。谢谢!
答案 0 :(得分:4)
传统上,您可以使用您使用的任何编译器来编译包含主子例程的代码来链接应用程序。在这种情况下,您拥有.cu
中的main,因此请使用nvcc进行链接。像这样:
$ g++ -c matrixmul_gold.cpp
$ nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc \
-L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib \
-o matrixmul matrixmul.cu matrixmul_gold.o -lcutil_x86_64
这将链接一个名为matrimul
的可执行二进制文件,来自matrixmul.cu
,matrixmul_gold.o
和cutil库(隐式nvcc也会链接CUDA运行时库和CUDA驱动程序库)。