1

C++ ソース コードと CUDA の両方を使用するサンプル プログラムを使用しています。これは、私の 4 つのソース ファイルの重要な内容です。

matrixmul.cu (メインの CUDA ソース コード):

#include <stdlib.h>
#include <cutil.h>
#include "assist.h"
#include "matrixmul.h"

int main (int argc, char ** argv)
{
    ...
    computeGold(reference, hostM, hostN, Mh, Mw, Nw);  //reference to .cpp file
    ...
}

matrixmul_gold.cpp (C++ ソース コード、単一関数、メイン メソッドなし):

void computeGold(float * P, const float * M, const float * N, int Mh, int Mw, int Nw)
{

    ...
}

matrixmul.h (matrixmul_gold.cpp ファイルのヘッダー)

#ifndef matrixmul_h
#define matrixmul_h

extern "C"
void computeGold(float * P, const float * M, const float * N, int Mh, int Mw, int Nw);
#endif

assist.h (ヘルパー関数)

これらのファイルをコンパイルしてリンクして、うまく機能するようにしています。これまでのところ、次を使用してコンパイルされた matrixmul_gold.cpp を取得できます。

g++ -c matrixmul_gold.cpp

そして、次を使用して、エラーなしで CUDA ソース コードをコンパイルできます。

nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib matrixmul.cu -c -lcutil_x86_64

しかし、2 つの .O ファイルができてしまいます。2 つの .O ファイルをリンクするさまざまな方法を試しましたが、今のところうまくいきません。適切なアプローチは何ですか?

更新: 要求に応じて、次の出力があります。

nm matrixmul_gold.o matrixmul.o | grep computeGold

nm: 'matrixmul.o': No such file
0000000000000000 T _Z11computeGoldPfPKfS1_iii

「matrixmul.o」が見つからないというエラーは、提案されたコンパイル コマンドを実行したときに実際にコンパイルが成功していないためだと思います。

nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib -o matrixmul matrixmul.cu matrixmul_gold.o -lcutil_x86_64

更新 2: extern "C"matrixmul_gold.cpp の最初から がありませんでした。私はそれを追加し、提案されたコンパイルコマンドはうまく機能します。ありがとうございました!

4

1 に答える 1

4

通常、メイン サブルーチンを含むコードをコンパイルしてアプリケーションをリンクするために使用しているコンパイラを使用します。この場合、メインは にある.cuので、nvcc を使用してリンクを行います。このようなもの:

$ g++ -c matrixmul_gold.cpp
$ nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc \
-L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib \
-o matrixmul matrixmul.cu matrixmul_gold.o -lcutil_x86_64

これにより、matrimulから呼び出された実行可能バイナリとcutil ライブラリがリンクされます (暗黙的に nvcc は CUDA ランタイム ライブラリと CUDA ドライバ ライブラリもリンクします)。matrixmul.cumatrixmul_gold.o

于 2012-09-05T19:54:18.763 に答える