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;
}

如果我将选项生成可重定位设备代码设置为否,由于未解析的外部函数 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。

4

1 回答 1

1

如果您避免使用 Visual Studio 2010 IDE,您可以按照@njuffa 的步骤进行操作,如

如何使用 cuda 5.0 为设备功能创建静态库?

于 2013-09-12T13:34:52.803 回答