当我在Windows7x64 (MSVS2012 +Nsit2.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 (Debian7Wheezey+ Nsight Eclipse from CUDA5.5)下编译它时,我得到了错误:
../src/CudaCpp11.cu(5):错误:缺少显式类型(假设为“int”)
../src/CudaCpp11.cu(5):错误:没有合适的转换函数
"thrust::detail::normal_iterator>“到"int”存在
2在"/tmp/tmpxft_00001520_00000000-6_CudaCpp11.cpp1.ii".的编译过程中检测到错误make:* src/CudaCpp11.o错误2
当我添加line:-stdc++11时
在属性->构建->设置->工具设置->构建阶段->预处理器选项(-Xcompiler)中
我得到了更多的错误:
nullptr /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误:标识符“
”未定义
/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 (无效的内存引用) make:* src/CudaCpp11.o错误11
只有当我在Linux-GCC中使用thrust::device_vector<int>::iterator iter = dv.begin();
时,我才不会得到错误。但在Windows MSVS2012中,c++11的所有功能都工作得很好!
我可以在Windows7x64和Linux64的.cu文件(CUDA5.5)中使用C++11吗?
发布于 2014-02-10 00:17:15
您可能需要像这样将main.cpp从others.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
(在装有NVCC5.5和gcc 4.7.3的Debian 8上测试)。
回答你的基本问题:我不知道在LinuxCUDA5.5中可以在.cu文件中使用C++11 (我也不知道显示的主机端C++11的示例在MSVC下得到了适当的整理)。我甚至提交了一个功能请求,要求constexpr支持,该请求仍在进行中。
CUDA5.5的CUDA programming指南说明:
对于主机代码,
支持主机C++编译器支持的ISO/IEC2003:14882规范的任何部分。
对于设备代码,nvcc支持代码示例中说明的功能,但有一些限制在限制中描述;它不支持运行时类型信息(RTTI)、异常处理和C++标准库。
无论如何,在内核中使用像auto这样的C++11特性是可能的,例如通过boost::auto。展望一下,其他C++11特性,如线程,可能不太可能出现在CUDA中,而且我还没有听说过关于它们的官方计划(截至supercomputing 2013)。
无耻插件:如果你对更多的tweeks感兴趣,请随时查看我们的库libPMacc,它为模拟提供了多GPU网格和粒子抽象。我们实现了STL,一个类似的访问概念,用于1-3D矩阵和其他有用的东西。
万事如意,埃克塞尔
更新:自从正式添加内核中的CUDA 7.0 C++11支持以来。正如BenC正确指出的那样,这个特性的一部分已经悄悄地添加到了CUDA6.5中。
发布于 2014-08-29 22:49:18
According to Jared Hoberock (Thrust开发人员),似乎C++11支持已经添加到CUDA6.5(尽管它仍然是试验性的和未记录的)。当你开始在非常大的C++/CUDA项目中使用C++11时,这可能会让事情变得更容易,因为当你使用CMake时,拆分所有东西对于大型项目来说可能是相当麻烦的。
https://stackoverflow.com/questions/21457974
复制相似问题