2012-02-18 4 views
2

私はCで大きなプロジェクトを持っています。私はCudaカーネルをその中に統合しようとしています。 "gcc -c main.c"と私の.cuファイルを "nvcc -c cuda_GMRES.cu"でコンパイルして、2つのオブジェクトファイルをnvcc: "nvcc -o main"とリンクしようとしています。 o cuda_GMRES.o "と表示され、次のエラーが表示されます。Cuda Cプロジェクトのリンクがありません

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o:機能では _start': (.text+0x20): undefined reference toメイン collect2は:ldはそれは私がCファイルでCUDAを結合しようとしている最初の時間だと私は、誰かが私を助けてくださいwrong.Can何かをやっている場合があります1、終了ステータス

を返しました。私は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

と呼ばれるデフォルトリンクされたプログラムを放出する

nvcc main.o cuda_GMRES.o 

はあなたが

nvcc -o executable main.o cuda_GMRES.o 

を'nvcc -o main.o cuda_GMRES.o'は本当にあなたが使っているリンクコマンドですか? – talonmies

+0

ええ..それはエラーなしで動作するはずだと思いますか? –

+0

これは問題ではありません – talonmies

答えて

4

リンクコマンドに致命的なエラーが含まれているようです。あなたは2つのオブジェクト・ファイルmain.ocuda_GMRES.oを持っている必要があり

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

:あなたが最初にこのような2つのオブジェクトをコンパイルすると仮定すると。その後、次の操作を行います。

nvcc -o main.o cuda_GMRES.o 

このコマンドは言いすなわち、「cuda_GMRES.oを使用してmain.oと呼ばれるプログラムファイルをリンクします」。 main.oを上書きします。この理由から、リンカはメインサブルーチンの欠落について不平を言っています。あなたはそれらを提供していません(同時にオブジェクトファイルを含むオブジェクトファイルを破壊しています)。

あなたはこのような何かしたい:executableは、最終的なリンクされたプログラムの名前である、またはa.out

関連する問題