12

C で書かれた GPL プログラムを変更しようとしています。私の目標は、1 つのメソッドを CUDA 実装に置き換えることです。つまり、gcc ではなく nvcc でコンパイルする必要があります。私はプロジェクトを構築するのに助けが必要です-それを実装するのではありません(助けるためにCUDA Cについて何も知る必要はありません、私は思いません)。

.configure と Makefile を含む中程度の複雑さの C プロジェクトを変更しようとするのはこれが初めてです。正直なところ、gcc や g++ を含むものを含め、C で何かをするのは久しぶりなので、かなり迷っています。

configure と Makefile の学習にはあまり興味がありません。これは実験的なものです。適切なビルド スクリプトの作成に時間を費やす前に、プロジェクトの実装がうまくいくかどうかを確認したいと思います。(必要に応じて学ぶことを嫌がるのではなく、範囲のアイデアを提供しようとしているだけです)。

そうは言っても、このプロジェクトを構築するためのオプションは何ですか? 無数の質問があります...

  • AC_PROG_CC の後に configure.in ファイルに「CC=nvcc」を追加してみました。これは機能しているように見えました-configureとmakeの実行からの出力は、コンパイラとしてnvccを示しました。ただし、make は、CUDA 固有の構文を認識せず、CUDA カーネルでソース ファイルをコンパイルできませんでした。理由はわかりませんが、これがうまくいくことを望んでいました。

  • ソース ファイルを nvcc でコンパイルし、それをメイン プログラムの make プロセスのリンク ステップに含めることはできますか? もしそうなら、どのように?(この質問は意味をなさないかもしれません - 私はこれで本当に錆びています)

  • これを行う正しい方法は何ですか?

  • テスト目的で使用できる迅速で汚い方法はありますか?

  • これらのconfigureとMakefileをセットアップして理解するために誰もが使用する秘密のツールはありますか? これは、私が慣れ親しんでいる Apache Ant スクリプトよりもさらに悪いです (ええ、私は自分の領域から外れています)。

4

1 に答える 1

20

すべてを nvcc でコンパイルする必要はありません。CUDA コードを NVCC でコンパイルするだけで、他のすべて (リンクを除く) を残すことができるというあなたの推測は正しいです。これが私が開始するために使用するアプローチです。

  1. 1 つの新しいヘッダー (例: myCudaImplementation.h) と 1 つの新しいソース ファイル (拡張子 .cu、例: myCudaImplementation.cu) を追加します。ソース ファイルには、カーネルの実装<<<>>>、適切な実行構成 (別名) と引数を使用してカーネルを呼び出す (ホスト) C ラッパー関数が含まれています。ヘッダー ファイルには、C ラッパー関数のプロトタイプが含まれています。そのラッパー関数を呼び出しましょうrunCudaImplementation()

  2. また、ソース ファイル (ヘッダーにプロトタイプを含む) に別のホスト C 関数を提供します。この関数は、存在する GPU デバイスを照会および構成し、成功した場合は true、失敗した場合は false を返します。この関数を と呼びましょうconfigureCudaDevice()

  3. これで、通常は CPU 実装を呼び出す元の C コードで、これを行うことができます。

    // must include your new header
    #include "myCudaImplementation.h"
    
    // at app initialization
    // store this variable somewhere you can access it later
    bool deviceConfigured = configureCudaDevice;          
    ...                             
    // then later, at run time
    if (deviceConfigured) 
        runCudaImplementation();
    else
        runCpuImplementation(); // run the original code
    
  4. これで、すべての CUDA コードを新しい .cu ファイルに入れたので、そのファイルを nvcc でコンパイルするだけで済みます。nvcc が出力するオブジェクト ファイルにリンクする必要があることを除いて、他のすべては同じままです。例えば

    nvcc -c -o myCudaImplementation.o myCudaImplementation.cu <other necessary arguments>
    

次に、myCudaImplementation.o をリンク行に追加します (次のように:) g++ -o myApp myCudaImplementation.o

ここで、configure を使用し、既に複雑な makefile を持っている複雑なアプリを操作する場合、上記よりも複雑になる可能性がありますが、これが一般的なアプローチです。要するに、すべてのソース ファイルを nvcc でコンパイルするのではなく、.cu ファイルだけをコンパイルする必要があるということです。他のすべてにはホスト コンパイラを使用します。

私は構成の専門家ではないので、実際には役に立ちません。configure を実行して makefile を生成し、その makefile を編集できる場合があります。これは一般的な解決策ではありませんが、作業を開始するには役立ちます。

.cu場合によっては、ファイルのコンパイルとリンクを分離する必要がある場合もあります。この場合、NVCC の個別のコンパイルおよびリンク機能を使用する必要があります。これには、このブログ投稿が役立つ場合があります

于 2012-02-20T22:31:16.000 に答える