使用 CUDA 和犰狳

Tho*_*oth 2 cuda visual-studio-2010 armadillo

.cu在 64x VS2010 项目中有一个文件。此项目配置为提取.mexw64文件。下面是我运行的示例。在 mex 函数中,我想使用 Armadillo 线性代数库的一些函数。所以当#include "armaMex.hpp"使用时,编译器会返回一些错误:

  1. 错误 C3203:“fixed”:未特化的类模板不能用作模板参数“T1”的模板参数,应为真实类型 c:....\armadillo-4.200.0\include\armadillo_bits\Mat_meat.hpp
  2. 错误 C2955:“arma::Mat::fixed”:使用类模板需要模板参数列表 c:\ ....\armadillo-4.200.0\include\armadillo_bits\Mat_meat.hpp
  3. 错误 C1903:无法从之前的错误中恢复;停止编译 c:\ ....\armadillo-4.200.0\include\armadillo_bits\Mat_meat.hpp

我无法弄清楚是什么导致了这些错误。你能解释一下吗?

#include "mex.h" 
#include "armaMex.hpp"
void
    mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mexPrintf("hello!\n");
}
Run Code Online (Sandbox Code Playgroud)

PS:CUDA SDK 5.5 64x,VS2010

tal*_*ies 5

这是 nvcc 的一个已知限制(我认为技术上是 cudafe++)。nvcc 使用文件扩展名来确定是否应该为设备代码处理给定的源文件,或者传递给 CUDA 预处理器,然后传递给设备编译器。看起来编译轨迹无法正确解析Armadillo包含的一些非常复杂的声明,编译失败。众所周知,Boost、Eigen 和 QT 会发生这种情况。我猜犰狳也在同一条船上。

解决方案是不在 .cu 文件中导入犰狳头文件。将您的主机提升代码放在 .cc 文件中,设备代码和内核在单独的 .cu 文件中启动,并制作一些薄包装器以访问 .cc 文件中的内核调用。您仍然可以将所有源代码传递给 nvcc 以编译为单个目标文件,但是将 Armadillo 导入与设备代码分开可以消除前端因 Armadillo 包含的复杂模板声明而窒息的问题。