我在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;
}
答案 0 :(得分:4)
您的链接命令似乎包含致命错误。假设您首先编译两个这样的对象:
gcc -c main.c
nvcc -c cuda_GMRES.cu
您应该有两个目标文件main.o
和cuda_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