2

ホスト コードとデバイス コードの両方を含む .cu ファイルがあります。

// device code
__global__ void
myKernel() { ... }

// host code
#include <boost/thread/mutex.hpp>

boost::mutex myMutex;

int main() { ... }

ご覧のとおり、ブーストのミューテックス機能をインクルードします。ファイルをコンパイルすると、次の警告のためにエラーが発生します。

warning C4005: 'BOOST_COMPILER': Macro-Redefinition c:\boost\include\boost-1_49_0\boost\config\compiler\visualc.hpp

したがって、nvcc がデバイス コードとホスト コードの両方の前処理をすべて処理すると仮定します。はいの場合、どうすればそれを回避し、前処理も cl.exe (MSVC 2010、Win7) に渡すことができますか?

ホストコードを別のhpp/cppファイルに入れ、このファイルをcuファイルに含めようとしました-同じ問題です。ホスト コードでは、デバイス コードで使用されるサーフェス参照を定義します。これが、cu-file と host-code にインクルードして、それぞれデバイス コードで認識されるようにする必要がある理由です。

4

1 に答える 1

2

これはnvcc(技術的cudafeには だと思います) の既知の制限です。nvcc は、ファイル拡張子を使用して、特定のソース ファイルをデバイス コード用に処理するか、CUDA プリプロセッサに渡してからデバイス コンパイラに渡すかを決定します。そのコンパイルの軌跡は、ブーストに含まれる非常に複雑な宣言の一部を正しく解析できず、コンパイルは失敗します。

解決策は、ブースト ヘッダーを.cuファイル内にインポートしないことです。ホストブーストコードを.ccファイルに入れ、デバイスコードとカーネル起動を別.cuのファイルに入れ、ファイルからカーネル呼び出しにアクセスするためのいくつかの薄いラッパーを作成し.ccます。すべてのソースを渡しnvccてコンパイルすることはできますが、boost インポートをデバイス コードから分離することで、boost 宣言でフロント エンドが詰まる問題が解消されます。

于 2012-07-18T13:26:53.993 に答える