有没有人能够对CUDA C和C++的本质给我一个很好的解释?据我所知,CUDA应该是带有NVIDIA GPU库的C语言。目前为止,CUDA C支持一些C++功能,但不支持其他功能。
NVIDIA的计划是什么?他们会在C语言基础上构建并添加自己的库(例如Thrust与STL),使其与C++的库平行吗?他们最终会支持所有的C++功能吗?在.cu
文件中使用C++头文件是否不好?
有没有人能够对CUDA C和C++的本质给我一个很好的解释?据我所知,CUDA应该是带有NVIDIA GPU库的C语言。目前为止,CUDA C支持一些C++功能,但不支持其他功能。
NVIDIA的计划是什么?他们会在C语言基础上构建并添加自己的库(例如Thrust与STL),使其与C++的库平行吗?他们最终会支持所有的C++功能吗?在.cu
文件中使用C++头文件是否不好?
CUDA C是一种具有C语法的编程语言。概念上与C有很大不同。
它试图解决的问题是为多个处理器编码多个(相似的)指令流。
CUDA不仅支持单指令多数据(SIMD)向量处理,还支持数据流>>指令流,否则受益较少。
CUDA提供了一些机制来实现这一点,并隐藏了一些复杂性。
CUDA并不针对多样化的多个指令流进行优化,如多核x86。
CUDA不仅限于像x86向量指令那样的单指令流,也不仅限于特定数据类型。
CUDA支持可以并行执行的“循环”。这是其最重要的特性。CUDA系统将“循环”的执行划分,并在一组相同的处理器中同时运行“循环”体,同时提供正常顺序循环的某些幻象(具体来说,CUDA管理循环“索引”)。开发人员需要了解GPU机器结构以有效地编写“循环”,但几乎所有管理都由CUDA运行时处理。效果是数百(甚至数千)个“循环”完成与一个“循环”相同的时间。
CUDA支持类似于if
分支的语法。只有运行与if测试匹配的代码的处理器才能活动,因此每个if测试“分支”都有一部分处理器活动。例如,这个 if... else if ... else ...
有三个分支。每个处理器只会执行一个分支,并在完成if后重新同步,准备移动到其他处理器。可能某些分支条件不被任何处理器匹配。因此没有必要执行该分支(对于该示例,三个分支是最坏情况)。然后仅顺序执行一个或两个分支,更快地完成整个if
。
没有“魔术”。程序员必须意识到代码将在CUDA设备上运行,并有意识地编写代码。
CUDA不能自动地将旧的C/C++代码并行运算到一个处理器数组上。CUDA可以顺序编译和运行普通的C和大部分C++代码,但是这样做几乎没有什么好处,因为它会按照顺序运行,并且比现代CPU慢得多。这意味着某些库中的代码(尚)与CUDA的能力不太匹配。CUDA程序可以同时操作多千字节位向量。CUDA不能自动地将现有的顺序C/C++库代码转换成能够实现这一点的代码。
CUDA提供了一种相对简单的方法来编写代码,使用熟悉的C/C++语法,添加了几个额外的概念,并生成可以在处理器数组上运行的代码。它有可能比例如多核x86要快10倍以上。
编辑-计划:我不为NVIDIA工作
对于最佳性能,CUDA希望在编译时获取信息。
因此,模板机制是最有用的,因为它给开发人员提供了一种在编译时表达的方式,CUDA编译器可以使用。作为一个简单的例子,如果一个矩阵被定义(实例化)为2D和4 x 8,则CUDA编译器可以使用它来组织程序跨处理器运行。如果该大小是动态的,并且在程序运行时发生变化,那么编译器或运行时系统要做一个非常高效的工作就会困难得多。
编辑: CUDA具有类和函数模板。 如果人们认为我在说CUDA不支持这个,我很抱歉。我同意我表达得不够清楚。
我认为CUDA GPU端对C++的模板实现尚不完整。
用户harrism曾评论过我的回答是误导性的。harrism为NVIDIA工作,所以我会等待他的建议。希望现在已经更加清晰了。
跨多个处理器高效地完成动态分支的最困难的部分是因为它有效地使代码串行化;在最坏的情况下,只有一个处理器可以执行,这浪费了GPU的好处。因此,虚函数似乎很难做得很好。
有一些非常聪明的整体程序分析工具,可以推断出比开发人员更多的类型信息。现有工具可能已经推断出足够的信息来消除虚拟函数,从而将分支的分析移动到编译时。还有一些技术可以对程序执行进行仪器化,并直接反馈回重新编译程序,从而可能达到更好的分支决策。
据我所知(除了反馈),CUDA编译器在这些领域还没有最先进的水平。
我认为,任何对CUDA或OpenCL系统有兴趣的人,在几天内研究并进行一些实验是值得的。我也认为,对于那些对这些领域感兴趣的人来说,尝试使用Haskell,并查看Data Parallel Haskell也很值得努力。
CUDA是一个平台(架构、编程模型、虚拟机、编译工具等),而不仅仅是一种编程语言。CUDA C只是建立在此平台上的众多语言系统之一(其他还有CUDA C ++,CUDA Fortran,PyCUDA等)。
目前,CUDA C++支持附录D(“C/C ++语言支持”)中描述的C++子集,该附录包含在CUDA C编程指南中。
例如:
__device__
成员函数(包括构造函数和析构函数)编辑:自CUDA 7.0以来,CUDA C++在__device__
代码(在GPU上运行的代码)中包括对C ++ 11标准的大多数语言特性的支持,包括auto
,lambda表达式,基于范围的for循环,初始化列表,静态断言等。
示例和特定限制也在上面链接的同一附录中详细说明。作为CUDA中使用C ++的非常成熟的示例,我建议查看Thrust。
(声明:我在NVIDIA工作。)
我不能明确提及未来发布和时间安排,但我可以说明一个趋势,即几乎每个CUDA版本的发布都会添加其他语言特性,以将CUDA C++支持提高到其当前(在我看来非常有用的)状态。我们计划继续这种趋势,以改进对C ++的支持,但自然地,我们优先考虑在大规模并行计算架构(GPU)上有用且高效的特性。