我正在使用 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;
}
如果我将选项生成可重定位设备代码设置为否,由于未解析的外部函数 f,第一个文件将无法编译。
如果我将它设置为 -rdc,它将编译,但不会生成 device-link.obj 文件,因此链接器会失败。
如果我将 f 的定义放入第一个文件并删除第二个文件,它会成功构建,但现在它不再是单独编译了。
如何使用单独的源文件构建这样的静态库?
[此处更新]
我称第一个调用者文件为“caller.cu”,第二个为“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。