私はCで大規模なプロジェクトを持っており、それにいくつかのCudaカーネルを統合しようとしています。cファイルを「gcc-cmain.c」でコンパイルし、.cuファイルを「nvcc-c cuda_GMRES.cu」でコンパイルしてから、2つのオブジェクトファイルをnvcc:「nvcc-omain」でリンクしようとしています。 o cuda_GMRES.o "とすると、次のエラーが発生します。
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o:関数
_start':
(.text+0x20): undefined reference to
main'collect2:ldが1つの終了ステータスを返しました
cudaとCファイルを組み合わせるのは初めてで、何か間違ったことをした可能性があります。誰か助けてくれませんか。RocksOSを搭載した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;
}