首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以在Windows7x64和Linux64的.cu文件(CUDA5.5)中使用C++11吗?

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

Stack Overflow用户
提问于 2014-01-30 21:34:10
回答 2查看 6.1K关注 0票数 16

当我在Windows7x64 (MSVS2012 +Nsit2.0+ CUDA5.5)中编译以下包含设计C++11的代码时,我没有得到错误,并且一切都编译得很好:

代码语言:javascript
复制
#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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-10 00:17:15

您可能需要像这样将main.cpp从others.cu中剥离出来:

others.hpp:

代码语言:javascript
复制
void others();

others.cu:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#include "others.hpp"

int main() {
    others();

    return 0;
}

This particular answer表明,使用官方支持的gcc版本(正如Robert Crovella正确声明的那样)进行编译,至少应该适用于main.cpp文件中的c++11代码:

代码语言:javascript
复制
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中。

票数 9
EN

Stack Overflow用户

发布于 2014-08-29 22:49:18

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21457974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档