Cuda混合C项目链接

时间:2012-02-18 12:26:02

标签: c linker cuda nvcc

我在C中有一个大型项目,我正在尝试将一些Cuda内核集成到其中。我用“gcc -c main.c”编译我的c文件,用“nvcc -c cuda_GMRES.cu”编译我的.cu文件然后我尝试用nvcc链接2个目标文件:“nvcc -o main。 o cuda_GMRES.o“并收到以下错误:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2 /../../../../ lib64 / crt1.o:在功能中 _start': (.text+0x20): undefined reference to主 collect2:ld返回1退出状态

这是我第一次尝试将cuda和C文件结合起来,我可能做错了什么。有人可以帮帮我。我在使用Rocks OS的GPU集群上。

我的main.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_wrapper.h文件:

#ifndef Cuda_GMRES_cuda_wrapper_h
#define Cuda_GMRES_cuda_wrapper_h
//wrapper function declaration

void cuda_GMRES(double a);
#endif

我的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 );
}    

我的包含内核的cuda_dot.cu文件:

__global__ void cuda_dot(double a, double *help)
{
   *help=2*a;
}

1 个答案:

答案 0 :(得分:4)

您的链接命令似乎包含致命错误。假设您首先编译两个这样的对象:

gcc -c main.c
nvcc -c cuda_GMRES.cu 

您应该有两个目标文件main.ocuda_GMRES.o。然后你这样做:

nvcc -o main.o cuda_GMRES.o

这个命令说“使用cuda_GMRES.o链接一个名为main.o的程序文件”,即。覆盖main.o.正是由于这个原因,链接器抱怨缺少主子例程,你没有提供一个(并且你正在销毁同时包含一个的目标文件)。

你想要这样的东西:

nvcc -o executable main.o cuda_GMRES.o

其中executable是最终链接程序的名称,或

nvcc main.o cuda_GMRES.o

将发出名为a.out

的默认链接程序