【问题标题】:Alglib with CudaAlglib 与 Cuda
【发布时间】:2014-08-24 15:44:36
【问题描述】:

我对 alglib 和 Cuda 很陌生。我正在尝试使用 Alglib 进行非线性列表平方拟合。当我在 VC++ (.cpp) 中编译它时,代码正在工作,但是当我尝试编译相同的代码但在 cuda 文件 (.cu) 中时,它给了我这个错误:

Error   6   error C2668: 'round' : ambiguous call to overloaded function    
Error   7   error C2668: 'round' : ambiguous call to overloaded function    
Error   8   error C2668: 'round' : ambiguous call to overloaded function    
Error   9   error C2668: 'trunc' : ambiguous call to overloaded function    

Error   10  error MSB3721:

命令 ""D:\NVIDIA\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2012 -ccbin " D:\Programme (x86)\Microsoft Visual Studio 11.0\VC\bin" -ID:\NVIDIA\include -ID:\NVIDIA\include --keep-dir Release -maxrregcount=0 --machine 32 --compile -cudart static -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MD " -o Release\min.cu.obj "...\min.cu"" 以代码 2 退出。C:\Program Files (x86 )\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\CUDA 6.0.targets 597 9 Cuda_lsfit

这是我的代码:

# include <iostream>
# include "cuda_runtime.h"
# include "device_launch_parameters.h"
# include <cuda.h>
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "interpolation.h"

using namespace alglib;

void function_cx_1_func(const real_1d_array &c, const real_1d_array &x, double &func,      void *ptr) 
{
  // main function
   func = abs(c[0]*(1-exp(-x[0]/c[1])));;
}

int main(int argc, char **argv)
{
real_2d_array x = "[[50],[400],[550],[750],[1200],[2000]]";
real_1d_array y = "[1384,792,642,258,91,868]";
real_1d_array c = "[0.5,500]";
double epsf = 0; //minimum of step size difference
double epsx = 0.000001;  //minimum of function changes
ae_int_t maxits = 0; //maximum iteration 0 = unlimitted number
ae_int_t info;
lsfitstate state; // structure contains information about algoritm
lsfitreport rep;
double diffstep = 0.0001;

// Fitting 

lsfitcreatef(x, y, c, diffstep, state);
lsfitsetcond(state, epsf, epsx, maxits);
alglib::lsfitfit(state, function_cx_1_func);
lsfitresults(state, info, c, rep);
printf("%d\n", int(info)); 
printf("%s\n", c.tostring(1).c_str()); 

return 0;
}

任何解决方案将不胜感激。

谢谢, 莫森

【问题讨论】:

  • 如果你想问一个“为什么这段代码不能编译”的问题,你需要发布最短的代码来证明这个问题。
  • 我解决了它,但老实说我不确定它是否是最好的解决方案。我刚刚定义了 round 函数,并且 trunc 应该从 alglib 库中使用。现在它编译并给了我正确的结果。
  • 我在发布的代码中没有看到对 trunc() 或 round() 的任何调用。这些函数在 CUDA 设备代码中受支持,并且它们针对 float 和 double 的参数类型进行了重载。使用任何其他类型的参数调用可能会导致您看到的那种错误消息。但是,您显示的错误消息似乎是 MSVC 错误消息,因此问题似乎出在 .cu 文件的主机代码部分。检查主机头文件中的原型(是否包括所有必要的头文件?)并比较应用程序代码中传递的参数类型。
  • @njuffa:不知道这是不是using namespace alglib;引起的命名空间冲突
  • @talonmies:我对 .cu 文件中命名空间的使用没有任何经验或洞察力。当主机代码出现问题时(这里似乎就是这种情况),我的标准建议是将受影响的代码移出 .cu 并移至 .cpp 文件中。

标签: c++ visual-studio-2012 cuda math.h alglib


【解决方案1】:

这似乎是 CUDA 在编译期间添加的数学函数定义之间的命名空间冲突,并将整个 alglib 命名空间包含到翻译单元中。删除

using namespace alglib;

从代码显然解决了问题。

一般来说,在 C++ 中无条件地将一个大的命名空间导入另一个命名空间是一种非常糟糕的设计实践,因为它会导致非常难以诊断此类冲突,并且会减慢编译速度。

【讨论】:

  • round() 和 trunc() 是标准的 C/C++ 数学函数,并且由于 CUDA 依赖于主机头文件 math.h 的原型,我认为这是符号所在的位置介绍了。这些函数本身在 CUDA 中可以完美运行,不知道为什么 alglib 要重新定义它们。
  • @njuffa:标准 C++ 数学函数默认定义在 std 命名空间中。您可以在不需要显式命名空间的情况下引用它们的事实意味着它们正在被 CUDA 编译轨迹导入。它们可能也被导入alglib 命名空间。然后将其导入默认翻译单元时,会导致冲突,或者至少在这种情况下这似乎是根本原因。
  • 好点。我想知道 CUDA 从 C 到 C++ 语言的无缝转换是否需要(事实上人们可以在没有显式命名空间的情况下引用数学函数)。
  • @njuffa:这是我的猜测。只是一个温和的提示,如果您不介意对答案进行投票(它是一个社区 wiki,因此不涉及和代表),这个问题将从 CUDA 标签的未回答队列中消失,这就是我添加它的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
相关资源
最近更新 更多