0

私はCとCUDAコードのセットをコンパイルしようとしてきました。問題は、ファイルを作成するときのコンパイルのリンク段階にあります。ホストで実行されるラッパー関数を作成して、デバイスにメモリを割り当て、デバイスにデータをコピーして、カーネルコードを実行しました。また、ラッパーコードはカーネルコードと同じファイルに含まれています。ラッパー。コードが関数を呼び出す方法は次のとおりです。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "LAMMPS.h"

...

main(int argc, char **argv)
{
    ...
tortuosityTotal = gradient(nbAtoms, topAtoms, bottomAtoms, nTop, nBottom, allConnections, atomlist, ysize);

これが私が作ったヘッダーファイル「LAMMPS.h」の関数定義です:

float gradient(unsigned short nbAtoms, unsigned short *topAtoms,unsigned short
              *bottomAtoms, unsigned short nTop, unsigned short nBottom, struct connection
              **allConnections,struct atoms *atomlist, double *ysize);

そして、これが私が使用しているmakefileです:

all: tortGPU

tortGPU: gradient_kernel.o buildNeighborList.o dumpRead.o tortuosityGPU.c
    nvcc tortuosityGPU.c buildNeighborList.o dumpRead.o gradient_kernel.o -lm -o tortGPU
buildNeighborList.o: dumpRead.o buildNeighborList.c
    gcc -c buildNeighborList.c
dumpRead.o: dumpRead.c
    gcc -c dumpRead.c
gradient_kernel.o:
    nvcc -c gradient_kernel.cu -arch=sm_20
clean: rm -rf *.o program

最後に、コンパイル手順は正常に機能しますが、それらをすべてリンクしようとすると(tortGPUを使用した最後の手順で、次のエラーメッセージが表示されます)。

/tmp/tmpxft_000068c7_00000000-1_tortuosityGPU.o: In function `main':
tortuosityGPU.c:(.text+0x520): undefined reference to `gradient'
collect2: ld returned 1 exit status
make: *** [tortGPU] Error 1

-Lを追加してgccを使用してみたところ、まったく同じエラーコードが表示されました。ありがとう!

4

1 に答える 1

3

この言語はよく呼ばれますが、C++コンパイラのようcuda-Cに呼び出す方が適切です。指定された関数は、C ++の名前マングリングを受けています(より正確には、マングルされた名前を探しています)。宣言をC++でラップするか、コードをC++としてコンパイルすることができます。cuda-C++nvccgradientnvccextern "C"

于 2012-08-10T22:34:53.490 に答える