Cuda混合C项目链接

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)

我有一个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):未定义对
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”链接吗?