私は、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のために。