14

2つのファイルだけで構成される単純なcudaプログラムをコンパイルするのに苦労しています。

main.cは次のようになります。

#include "my_cuda.h"

int main(int argc, char** argv){
   dummy_gpu();
}

cuda.hは次のようになります。

#ifndef MY_DUMMY
#define MY_DUMMY

void dummy_gpu();

#endif

そして、my_cuda.cuファイルは次のようになります。

#include <cuda_runtime.h>
#include "my_cuda.h"

__global__ void dummy_gpu_kernel(){
   //do something
}

void dummy_gpu(){
   dummy_gpu_kernel<<<128,128>>>();
}

ただし、コンパイルすると、常に次のエラーが発生します。

gcc  -I/usr/local/cuda/5.0.35/include/ -c main.c
nvcc  -c my_cuda.cu
gcc  -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -lcuda -lcudart -o md.exe main.o my_cuda.o 
main.o: In function `main':
main.c:(.text+0x15): undefined reference to `dummy_gpu'
collect2: ld returned 1 exit status

ご協力ありがとうございました。

4

2 に答える 2

26

シンボル名のマングリングに問題があります。nvccホストC++コンパイラを使用してホストコードをコンパイルします。これは、シンボル名のマングリングがCUDAツールチェーンによって発行されたコードに適用されることを意味します。

この問題には2つの解決策があります。dummy_gpu1つ目は、Cリンケージを使用して定義するmy_cuda.cuことなので、次のように変更します。

extern "C" {
#include "my_cuda.h"
}

.....


extern "C"
void dummy_gpu(){
   dummy_gpu_kernel<<<128,128>>>();
}

リンケージコマンドを次のように変更する必要があることに注意してください。

gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -o md.exe main.o my_cuda.o -lcuda -lcudart 

CUDA共有ライブラリは、それらを使用するオブジェクトファイルのに指定する必要があるためです。

2番目の方法は、いずれg++かを使用するかnvcc、リンクを実行することです。この場合、問題全体が解消されます。

于 2012-11-25T16:42:02.937 に答える
8

C /C++リンケージの問題があります。nvccはC++方式で物事を装飾していますが、gccコンパイラーはCスタイルのリンケージを使用して物事を処理しています。これを修正する簡単な方法は、main.cの名前をmain.cppに変更してから、gccの代わりにg++を使用してコマンドを繰り返すことです。

于 2012-11-25T16:44:55.433 に答える