2

私は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 tomain'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;
}
4

1 に答える 1

4

リンク コマンドに致命的なエラーが含まれているようです。最初に次のように 2 つのオブジェクトをコンパイルするとします。

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

2 つのオブジェクト ファイル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 に答える