5

次のプログラム(main.cu)をnvcc(CUDA 5.0 RC)でコンパイルしようとしました:

#include <Eigen/Core>
#include <iostream>

int main( int argc, char** argv )
{
    std::cout << "Pure CUDA" << std::endl;
}

残念ながら、Microsoftコンパイルの代わりにnvccを使用してしか説明できない警告やエラーがたくさん表示されます。

この仮定は正しいですか?nvccでEigenをコンパイルする方法はありますか?(実際には、EigenマトリックスをGPUに転送するのではなく、メンバーにアクセスするだけです)?

Eigenをnvccでコンパイルすることがうまくいかない場合は、ホストとデバイスのコードを分離するための賢い方法についての優れたガイド/チュートリアルがありますか?

CUDA 5.0 RC、Visual Studio 2008、Eigen3.0.5を使用しています。両方を使用した.cuファイル、CUDAに含まれているルールファイル、およびCMakeによって生成されたカスタムビルドステップをコンパイルします。CUDAルールファイルを使用して、ビルドをコンピューティング機能3.0でターゲットにしました。

アドバイスありがとうございます。

PS:ホストコンパイラで同じコードをコンパイルすると、完全に機能します。

4

3 に答える 3

3

NVCCは通常のホストコンパイラを呼び出しますが、前処理を行う前ではないため、NVCCがEigenコードを正しく解析するのに苦労している可能性があります(特にC ++ 11機能を使用している場合、VS2008が機能すると言っているのでそうはなりません)。

私は通常、デバイスコードとラッパーをファイルに分割し、.cuアプリケーションの残りの部分を通常のファイルに残して.c.cppホストコンパイラによって直接処理されるようにすることをお勧めします。VS2008でこれを設定するためのヒントについては、この回答を参照してください。

于 2012-10-12T16:34:51.110 に答える
2

Eigenの主要な貢献者の1人が、CUDAと互換性があるように移植しているようです。アイデアは、カーネルコードから呼び出すことです。

于 2013-02-09T00:26:23.810 に答える
2

Eigen 3.3以降、nvcc(7.5)はEigenコードをcl(MSVC 2013)に(ほぼ?)正しく渡すことに成功しています。たとえば、次のコードは11個の警告のみを生成します。

#include <Eigen/Core>
#include <iostream>

int main()
{
    std::cout << "Hello Eigen\t";
    std::cout << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << "\n";
    std::cout << "Hello nvcc\t";
    std::cout << __CUDACC_VER_MAJOR__ << "." << __CUDACC_VER_MINOR__ << "." << __CUDACC_VER_BUILD__ << "\n";
    return 0;
}

期待どおりの出力(Eigen 3.3rc1):

こんにちはEigen3.2.94
こんにちはnvcc7.5.17

ただし、警告の長いリスト(実際に表示したい場合は、投稿履歴を参照してください)。

アップデート:

残念ながら、CUDA 8.0とVS2015(Eigen3.2.9とEigen3.3rc1の両方)を使用すると、コンパイルエラーが再び発生します。

"operator="は現在のスコープですでに宣言されていますeigen\src \ Core \ Block.h 111
"operator="は現在のスコープですでに宣言されていますeigen\src \ Core \ Ref.h 89

とても近い...

アップデート2:

これはコミット59db051で修正されており、開発ブランチを使用するか、v3.3(または3.3rc2)が実際にリリースされるのを待つことで利用できます。

于 2016-09-28T10:55:46.793 に答える