2

私は、VS2010 を使用して CUDA Toolkit 5.0 RC で最初の段階を踏んでいます。

別のコンパイルは私を混乱させます。

プロジェクトをスタティック ライブラリ (.lib) としてセットアップしようとしましたが、ビルドしようとすると、device-link.obj が作成されず、理由がわかりません。

たとえば、次の 2 つのファイルがあります。

関数 f を使用する呼び出し元関数

#include "thrust\host_vector.h"
#include "thrust\device_vector.h"
using namespace thrust::placeholders;

extern __device__ double f(double x);

struct f_func 
{
__device__ double operator()(const double& x) const
{
    return f(x);
}
};

void test(const int len, double * data, double * res)
{
thrust::device_vector<double> d_data(data, data + len);
thrust::transform(d_data.begin(), d_data.end(), d_data.begin(), f_func());
thrust::copy(d_data.begin(),d_data.end(), res);
}

そして f を定義するライブラリファイル

__device__ double f(double x)
{
return x+2.0;
}

オプションを生成するリロケータブル デバイス コードをいいえに設定すると、未解決の extern 関数 f が原因で最初のファイルがコンパイルされません。

-rdc に設定すると、コンパイルは行われますが、device-link.obj ファイルが生成されないため、リンカーは失敗します。

f の定義を最初のファイルに入れ、2 番目のファイルを削除すると、正常にビルドされますが、個別のコンパイルではなくなりました。

個別のソース ファイルを使用して、このような静的ライブラリを構築するにはどうすればよいですか?


【こちら更新しました】

最初の呼び出し元ファイルを「caller.cu」、2 番目のファイルを「libfn.cu」と呼びました。VS2010が出力するコンパイラ行(完全には理解していません)は(呼び出し元用):

nvcc.exe 
-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"  
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include"  
-G   
--keep-dir "Debug" 
-maxrregcount=0  
--machine 32 
--compile  
-g   
-D_MBCS 
-Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " 
-o "Debug\caller.cu.obj" "G:\Test_Linking\caller.cu" 
-clean

libfn についても同じで、次のようになります。

nvcc.exe 
-gencode=arch=compute_20,code=\"sm_20,compute_20\" 
--use-local-env 
--cl-version 2010 
-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin" 
-rdc=true 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include"  
-G   
--keep-dir "Debug" 
-maxrregcount=0  
--machine 32 
--compile  
-g   
-D_MBCS 
-Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " 
-o "Debug\caller.cu.obj" "G:\Test_Linking\caller.cu"

そして再びlibfnのために。

4

1 に答える 1

1

Visual Studio 2010 IDE を使用しない場合は、@njuffa の手順に従うことができます。

cuda 5.0 を使用してデバイス関数の静的ライブラリを作成するには?

于 2013-09-12T13:34:52.803 に答える