我可以在Windows7x64(MSVC)和Linux64(GCC4.8.2)的.cu文件(CUDA5.5)中使用C ++ 11吗?

时间:2014-01-30 13:34:10

标签: gcc c++11 cuda nvidia nvcc

当我在Windows7x64(MSVS2012 + Nsight 2.0 + CUDA5.5)中编译包含设计C ++ 11的以下代码时,我没有收到错误,并且所有内容都编译并运行良好:

#include <thrust/device_vector.h>

int main() {
    thrust::device_vector<int> dv(10);
    auto iter = dv.begin();

    return 0;
}

但是当我尝试在Linux64(Debian 7 Wheezey + Nsight Eclipse,来自CUDA5.5)下编译它时,我收到错误:

  

../ src / CudaCpp11.cu(5):错误:缺少显式类型(“int”   假定)

     

../ src / CudaCpp11.cu(5):错误:没有合适的转换函数

     

“推力::详细:: normal_iterator&gt;” 中到“int”   存在

     

在编译中检测到2个错误   “/tmp/tmpxft_00001520_00000000-6_CudaCpp11.cpp1.ii”。 make: *   [src / CudaCpp11.o]错误2

当我添加行时: -stdc ++ 11

in Properties-&gt;建设 - &GT;设置 - &GT;工具设置 - &gt;构建阶段 - &gt;预处理程序选项(-Xcompiler)

我收到更多错误:

  

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误:   标识符“nullptr”未定义

     

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误:   期待一个“;”

...

  

/ usr / include / c ++ / 4.8 / bits / cpp_type_traits.h(314):错误:命名空间   “std :: __ gnu_cxx”没有成员

     

“__ normal_iterator”

     

/ usr / include / c ++ / 4.8 / bits / cpp_type_traits.h(314):错误:预期的a   “&gt;” 中

     

nvcc错误:'cudafe'因信号11(内存无效)而死亡   参考)make: * [src / CudaCpp11.o]错误11

只有在Linux-GCC中使用thrust::device_vector<int>::iterator iter = dv.begin();时才会出现错误。但在Windows MSVS2012中,所有c ++ 11功能都可以正常工作!

我可以在Windows7x64(MSVC)和Linux64(GCC4.8.2)的.cu文件(CUDA5.5)中使用C ++ 11吗?

2 个答案:

答案 0 :(得分:9)

您可能需要分割 others.pp 中的 main.cpp ,如下所示:

others.hpp:

void others();

others.cu:

#include "others.hpp"
#include <boost/typeof/std/utility.hpp>
#include <thrust/device_vector.h>

void others() {
    thrust::device_vector<int> dv(10);
    BOOST_AUTO(iter, dv.begin()); // regular C++
}

main.cpp中:

#include "others.hpp"

int main() {
    others();

    return 0;
}

This particular answer表明使用官方支持的gcc版本进行编译(正如Robert Crovella所说的那样)至少可以解决 main.cpp 文件中的c ++ 11代码: / p>

g++ -std=c++0x -c main.cpp
nvcc -arch=sm_20 -c others.cu 
nvcc -lcudart -o test main.o others.o

(在Debian 8上用nvcc 5.5和gcc 4.7.3测试)。

回答你的基本问题:我不知道在Linux中使用CUDA 5.5的.cu文件中可以使用C ++ 11(我不知道主机端C ++ 11的显示示例是否正确de - 在MSVC下混乱)。我甚至提交了 constexpr 支持的功能请求,该功能仍处于打开状态。

CUDA 5.5的CUDA programming指南声明:

  

对于主机代码,nvcc支持C ++ ISO / IEC的任何部分   主机c ++编译器支持的14882:2003规范。

     

对于设备代码,nvcc支持Code中说明的功能   限制中描述的具有某些限制的样本;它不是   支持运行时类型信息(RTTI),异常处理和   C ++标准库。

无论如何,可以在内核中使用一些 C ++ 11功能,例如 auto ,例如使用boost :: auto。 作为展望,其他C ++ 11功能如线程可能不太可能在CUDA中结束,我听说还没有关于它们的官方计划(截至supercomputing 2013)。

无耻插件:如果您对更多这些tweek感兴趣,请随意查看我们的库libPMacc,它为模拟提供多GPU网格和粒子抽象。我们实现了 lambda ,这是一种类似STL的访问概念,适用于1-3D矩阵和其他有用的东西。

一切顺利, 阿克塞尔


更新:由于正式添加了CUDA 7.0 C++11支持 in kernels 。正如BenC正确指出的那样,此功能的部分内容已经在CUDA 6.5中静默添加。

答案 1 :(得分:3)

According to Jared HoberockThrust开发人员),似乎已将C ++ 11支持添加到CUDA 6.5中(尽管它仍然是实验性的和未记录的)。在非常大的C ++ / CUDA项目中开始使用C ++ 11时,这可能会使事情变得更容易,因为当您使用CMake时,拆分所有内容对于大型项目来说可能非常麻烦。