Cuda混合C项目链接
我有一个C语言的大型项目,我正试图在其中集成一些Cuda内核。我正在用“gcc-c main.c”编译我的c文件,用“nvcc-c cuda_GMRES.cu”编译我的.cu文件,然后我尝试用nvcc链接两个目标文件:“nvcc-o main.o cuda_GMRES.o”,并收到以下错误: /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../../../../../lib64/crt1.o:函数中Cuda混合C项目链接,c,linker,cuda,nvcc,C,Linker,Cuda,Nvcc,我有一个C语言的大型项目,我正试图在其中集成一些Cuda内核。我正在用“gcc-c main.c”编译我的c文件,用“nvcc-c cuda_GMRES.cu”编译我的.cu文件,然后我尝试用nvcc链接两个目标文件:“nvcc-o main.o cuda_GMRES.o”,并收到以下错误: /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../../../../../lib64/crt1.o:函数中 \u start': (.text+0x20)
\u start':
(.text+0x20):未定义对
main'的引用
collect2:ld返回了1个退出状态
这是我第一次尝试将cuda与C文件结合起来,我可能做错了什么。有人能帮我吗。我在一个有Rocks OS的GPU集群上
我的主.c文件:
#include <stdio.h>
#include <math.h>
#include "cuda_wrapper.h" //header containing wrapper function
//cuda_GMRES that calls the kernel cuda_dot
int main (int argc,char* argv[])
{
//content
//bla bla bla
//cuda Function call
cuda_GMRES(50);
return 0;
}
我的cuda_GMRES.cu文件,其中包含内核调用函数:
#include <stdio.h>
#include "cuda_wrapper.h"
#include "cuda_dot.cu"
//kernel declaration
__global__ void cuda_dot();
//kernel calling function
extern "C"
void cuda_GMRES(double a)
{
double b;
double *dev_a;
double *res;
cudaMemcpy(dev_a, &a, sizeof(double), cudaMemcpyHostToDevice );
cuda_dot<<< 1, 1 >>>(*dev_a, res );
cudaMemcpy(&b, res, sizeof(double), cudaMemcpyDeviceToHost );
}
您的链接命令似乎包含致命错误。假设您首先编译两个对象,如下所示:
gcc -c main.c
nvcc -c cuda_GMRES.cu
nvcc -o executable main.o cuda_GMRES.o
您应该有两个对象文件main.o
和cuda_GMRES.o
。然后执行以下操作:
nvcc -o main.o cuda_GMRES.o
此命令显示“使用cuda_GMRES.o链接名为main.o的程序文件”,即覆盖main.o。正是由于这个原因,链接器抱怨缺少一个主子例程,而您没有提供一个主子例程(并且您正在销毁同时包含一个主子例程的对象文件)
你想要这样的东西:
gcc -c main.c
nvcc -c cuda_GMRES.cu
nvcc -o executable main.o cuda_GMRES.o
其中,executable
是最终链接程序的名称,或
nvcc main.o cuda_GMRES.o
它将发出一个名为a.out的默认链接程序。您的链接命令似乎包含一个致命错误。假设您首先编译两个对象,如下所示:
gcc -c main.c
nvcc -c cuda_GMRES.cu
nvcc -o executable main.o cuda_GMRES.o
您应该有两个对象文件main.o
和cuda_GMRES.o
。然后执行以下操作:
nvcc -o main.o cuda_GMRES.o
此命令显示“使用cuda_GMRES.o链接名为main.o的程序文件”,即覆盖main.o。正是由于这个原因,链接器抱怨缺少一个主子例程,而您没有提供一个主子例程(并且您正在销毁同时包含一个主子例程的对象文件)
你想要这样的东西:
gcc -c main.c
nvcc -c cuda_GMRES.cu
nvcc -o executable main.o cuda_GMRES.o
其中,executable
是最终链接程序的名称,或
nvcc main.o cuda_GMRES.o
哪个将发出一个名为
a.out
的默认链接程序你确定nvcc-o main.o cuda_GMRES.o
真的是你正在使用的链接命令吗?是的。你认为它应该工作正常吗?我应该用“$gcc-o main.o cuda_GMRES.o-L/share/apps/cuda/lib64-lcudart”链接吗?你确定nvcc-o main.o cuda_GMRES.o
真的是你正在使用的链接命令吗?是的。你认为它应该不会出错吗?我应该用“$gcc-o main.o cuda_GMRES.o-L/share/apps/cuda/lib64-lcudart”链接吗?