当我在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(来自CUDA5.5的Debian 7 Wheezey + Nsight Eclipse)下进行编译时,出现错误:


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

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

“推力::详细信息:: normal_iterator>”转换为“ int”
存在

在编译中发现2个错误
“ /tmp/tmpxft_00001520_00000000-6_CudaCpp11.cpp1.ii”。制作:*
[src / CudaCpp11.o]错误2


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

在“属性”->“构建”->“设置”->“工具设置”->“构建阶段”->“预处理器”选项中(-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):错误:预期为
“>”

nvcc错误:“ cudafe”由于信号11而死(无效的内存
参考):* [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吗?

最佳答案

您可能需要像这样将main.cpp与other.cu分开:

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代码有效:

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的示例在下面正确地整理了MSVC)。我什至对constexpr支持提出了功能请求,该请求仍未解决。

CUDA 5.5的CUDA programming指南指出:


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

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


无论如何,有可能使用某些C ++ 11功能,例如在内核中使用auto,例如使用boost :: auto。
展望未来,其他C ++ 11功能(例如线程)可能不太可能最终在CUDA中使用,而且我还没有关于它们的正式计划(自supercomputing 2013开始)。

无耻的插件:如果您对这两个星期感兴趣,请随时访问我们的库libPMacc,该库提供了用于仿真的多GPU网格和粒子抽象。我们实现了lambda,这是一种类似于STL的访问概念,用于1-3D矩阵和其他有用的内容。

祝一切顺利,
阿克塞尔



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

关于gcc - 我可以在Windows7x64(MSVC)和Linux64(GCC4.8.2)的.cu文件(CUDA5.5)中使用C++ 11吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21457974/

10-16 04:50