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

我可以使用C++;11在Windows7x64(MSVC)和Linux64(GCC4.8.2)中的.cu文件(CUDA5.5)中?,gcc,c++11,cuda,nvidia,nvcc,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; } #包括 int main(){ 推力:装置_矢量

当我在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;
}
#包括
int main(){
推力:装置_矢量dv(10);
自动iter=dv.begin();
返回0;
}
但是,当我尝试在Linux64(来自CUDA5.5的Debian 7 Wheeze+Nsight Eclipse)下编译它时,我得到了错误:

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

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

“推力::细节::正常迭代器>”到“int” 存在

在汇编过程中检测到2个错误 “/tmp/tmpxft_00001520_00000000-6_CudaCpp11.ii”。制作:* [src/cudacp11.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”没有成员

“\uuu普通\u迭代器”

/usr/include/c++/4.8/bits/cpp_type_traits.h(314):错误:预期为a “>”

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

仅当我使用
推力::设备_向量::迭代器iter=dv.begin()时在LinuxGCC中,我没有得到一个错误。但在Windows MSVS2012中,所有c++11功能都可以正常工作


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

您可能需要将main.cpp与其他.cu分开,如下所示:

其他.水电站:

其他.cu:

显示了使用官方支持的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
(在具有nvcc 5.5和gcc 4.7.3的Debian 8上测试)

回答您的潜在问题:我不知道可以在Linux中使用CUDA 5.5的.cu文件中的C++11(我也不知道所示的主机端C++11示例在MSVC下得到了正确的消除)。我甚至提出了一项功能请求,要求提供constexpr支持,但该请求仍在进行中

CUDA 5.5指南规定:

<>对于主机代码,NVCC支持C++ ISO/IEC的任何部分 148:2003规范:主机C++编译器支持.</P> 对于设备代码,nvcc支持代码中说明的功能 带有限制条件中描述的某些限制条件的样品;事实并非如此 支持运行时类型信息(RTTI)、异常处理和 C++标准库 无论如何,可以在内核中使用一些C++11特性,如auto,例如boost::auto。 展望未来,其他C++11功能(如线程)可能不太可能最终出现在CUDA中,我还没有听到关于它们的官方计划(截至)

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

祝你一切顺利, 阿克塞尔



更新:自从正式添加内核支持以来。正如BenC正确指出的那样,CUDA6.5中已经悄悄地添加了此功能的一部分。

(开发人员),似乎CUDA6.5中已经添加了对C++11的支持(尽管它仍然是实验性的,没有文档记录)。在非常大的C++/CUDA项目中开始使用C++11时,这可能会使事情变得更容易,因为在使用CMake的大型项目中,拆分所有内容可能会非常麻烦。

gcc 4.8.x不是linux下的版本。@Robert Crovella gcc 4.7.2具有相同的效果-无法在nvcc+gcc中编译C++11。不管怎样,我怎样才能做到这一点,或者我可以在nvcc+icc(英特尔编译器)中使用C++11吗?我只是发自内心:去年5月我参加了一个关于GPU编程的讲座。只有1.5小时。从那里我记得我们在幻灯片上看到的所有代码都是基于C99的GPU专用语言。不确定是不是库达,我记不清了。但如果是,那就意味着语言不是C或C++,它只是基于C99的。也许新的特征将从C或C++的新标准中获得,也许不是。您必须跟踪特定语言的发展。但如果是其他原因,请忽略此评论。稍后我将尝试查找有关此主题的更多信息。请查看我的解决方案:非常感谢!好消息是:“我们的想法是,nvcc将支持主机编译器支持的任何c++11构造。他们将在将来的某个时候发布说明警告的文档。最大的限制是lambda不能从主机传递到全局函数启动。根据我的经验,您提到的所有构造都受g++作为主机编译器的支持。更新:CUDA7.0增加了对内核c++11的支持。我更新了答案以反映这一点。
#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++
}
#include "others.hpp"

int main() {
    others();

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