2

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

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o:在函数 _start': (.text+0x20): undefined reference tomain'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;
}
4

1 回答 1

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

于 2012-02-18T12:43:20.103 回答