CUDA C和C ++的说明

时间:2012-03-23 21:10:15

标签: c++ c cuda nvidia

有人能给我一个关于CUDA C和C ++本质的很好的解释吗?据我了解,CUDA应该是带有NVIDIA GPU库的C语言。截至目前,CUDA C支持一些C ++功能,但不支持其他功能。

NVIDIA的计划是什么?他们是否会在C上构建并添加与C ++相似的库(例如Thrust vs. STL)?他们最终会支持所有的C ++吗?在.cu文件中使用C ++标题是不是很糟糕?

5 个答案:

答案 0 :(得分:19)

CUDA C是一种具有C语法的编程语言。从概念上讲,它与C完全不同。

它试图解决的问题是为多个处理器编写多个(类似的)指令流。

CUDA提供的不仅仅是单指令多数据(SIMD)矢量处理,而是数据流>>指令流,或者利益少得多。

CUDA提供了一些机制来实现这一点,并隐藏了一些复杂性。

CUDA未针对多核x86等多种指令流进行优化。 CUDA不仅限于x86向量指令之类的单指令流,也不限于x86向量指令等特定数据类型。

CUDA支持'循环'可以并行执行。这是其最关键的特征。 CUDA系统将对“循环”的执行进行分区,并运行“循环”。同时跨越一系列相同的处理器,同时提供正常顺序循环的一些错觉(特别是CUDA管理循环"索引")。开发人员需要了解GPU机器结构才能编写循环'有效,但几乎所有的管理都由CUDA运行时处理。效果是数百(甚至数千)个循环'在一个循环的同时完成。

CUDA支持if分支。只有运行与if测试匹配的代码的处理器才能处于活动状态,因此处理器的一个子集将对每个分支处于活动状态。如果测试。作为一个例子,这个if... else if ... else ...有三个分支。每个处理器只执行一个分支,并且重新同步'当if完成时,准备继续使用其余的处理器。可能有些分支条件与任何处理器都不匹配。因此不需要执行该分支(对于该示例,三个分支是最坏的情况)。然后只按顺序执行一个或两个分支,更快地完成整个if

没有魔法'。程序员必须意识到代码将在CUDA设备上运行,并有意识地为其编写代码。

CUDA不会使用旧的C / C ++代码,自动神奇地在处理器阵列中运行计算。 CUDA可以顺序编译和运行普通的C和大部分C ++,但是由于它将按顺序运行,并且比现代CPU更慢,因此很少(没有?)可以获得。这意味着某些库中的代码(还)与CUDA功能不匹配。 CUDA程序可以同时对多KB的位向量进行操作。 CUDA无法自动神奇地将现有的顺序C / C ++库代码转换为可以实现的功能。

CUDA提供了一种相对简单的编写代码的方法,使用熟悉的C / C ++语法,添加了一些额外的概念,并生成将在一系列处理器上运行的代码。它有可能提供超过10倍的加速比例,例如多核x86。

编辑 - 计划:我不适用于NVIDIA

为了获得最佳性能,CUDA在编译时需要信息。

因此,模板机制最有用,因为它为开发人员提供了一种在编译时说话的方法,CUDA编译器可以使用它。举一个简单的例子,如果在编译时将矩阵定义(实例化)为2D和4 x 8,那么CUDA编译器可以使用它来跨处理器组织程序。如果该大小是动态的,并且在程序运行时发生更改,那么编译器或运行时系统执行非常有效的工作就会更加

编辑: CUDA有类和函数模板。 如果人们读到这篇文章说CUDA没有,我道歉。我同意我不清楚。

我相信模板的CUDA GPU端实现并不完整w.r.t. C ++。

用户harrism评论说我的回答是误导性的。 harrism适用于NVIDIA,所以我会等待建议。希望这已经更清楚了。

在多个处理器之间有效处理的最困难的事情是动态分支许多备用路径,因为这有效地序列化了代码;在最坏的情况下,一次只能执行一个处理器,这会浪费GPU的好处。所以虚拟功能似乎很难做得很好。

有一些非常聪明的整体程序分析工具可以推断出比开发人员可能理解的更多的类型信息。现有工具可能推断出足以消除虚函数,因此将分支分析转移到编译时。还有一些用于检测程序执行的技术,这些技术可直接反馈到程序的重新编译中,这可能会达到更好的分支决策。

AFAIK(模反馈)CUDA编译器在这些领域尚不具备最新技术水平。

(恕我直言,对于任何对CUDA或支持OpenCL的系统感兴趣的人来说,对他们进行调查并做一些实验值得花几天时间。我也认为,对于对这些领域感兴趣的人来说,这是值得的。试验Haskell,看看Data Parallel Haskell

答案 1 :(得分:19)

CUDA是一个平台(架构,编程模型,汇编虚拟机,编译工具等),而不仅仅是一种编程语言。 CUDA C只是在这个平台上构建的众多语言系统之一(CUDA C,C ++,CUDA Fortran,PyCUDA等等。)

CUDA C ++

目前,CUDA C ++支持CUDA C Programming Guide的附录D(“C / C ++语言支持”)中描述的C ++子集。

仅举几例:

  • __device__成员函数(包括构造函数和析构函数)
  • 继承/派生类
  • 虚拟功能
  • 课程和功能模板
  • 运营商和超载
  • 仿函数类

编辑:从CUDA 7.0开始,CUDA C ++在__device__代码(在GPU上运行的代码)中支持C ++ 11标准的大多数语言功能,包括auto,lambda表达式,基于范围的for循环,初始化列表,静态断言等。

示例和具体限制也在上面链接的相同附录中详述。作为CUDA使用C ++的一个非常成熟的例子,我建议您查看Thrust

未来计划

(披露:我为NVIDIA工作。)

我无法明确未来的版本和时间,但我可以说明几乎每个CUDA版本都添加了其他语言功能以获得CUDA C ++支持其当前(在我看来非常有用)状态的趋势。我们计划在改进对C ++的支持方面继续这一趋势,但我们自然会优先考虑在大规模并行计算架构(GPU)上有用且高效的功能。

答案 2 :(得分:5)

很多人都没有意识到,CUDA实际上是两种新的编程语言,都源自C ++。一种是编写在GPU上运行的代码,是C ++的一个子集。它的功能类似于HLSL(DirectX)或Cg(OpenGL),但具有更多功能和与C ++的兼容性。我不需要提及各种与GPGPU / SIMT /性能相关的问题。另一种是所谓的“运行时API”,它几乎不是传统意义上的“API”。 Runtime API用于编写在主机CPU上运行的代码。它是C ++的超集,使链接和启动GPU代码变得更加容易。它需要NVCC预编译器,然后调用平台的C ++编译器。相比之下,Driver API(和OpenCL)是一个纯粹的标准C库,使用起来要冗长得多(虽然提供的附加功能很少)。

创建一种新的主​​机端编程语言是NVIDIA的一个大胆举措。它使CUDA入门更容易,编写代码更优雅。然而,真正的辉煌并不是将它作为一种新语言进行营销。

答案 3 :(得分:2)

有时你会听到CUDA会是C和C ++,但我认为不是这样,因为这是不可能的。引用他们的编程指南:

  

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

     

对于设备代码,nvcc支持Section中说明的功能   D.1具有D.2节中描述的一些限制;它不是   支持运行时类型信息(RTTI),异常处理和   C ++标准库。

正如我所看到的,它只涉及C ++,并且只支持C,恰好在C和C ++的交集中。因此,最好将其视为带有设备部分扩展而不是C的C ++。如果您习惯使用C,那么可以避免很多麻烦。

答案 4 :(得分:1)

  

NVIDIA的计划是什么?

我认为总体趋势是CUDA和OpenCL被认为是许多应用程序的过低技术。目前,Nvidia正在大力投资OpenACC,这大致可以说是针对GPU的OpenMP。它遵循声明性方法,并在更高层次上解决GPU并行化的问题。所以这是我对Nvidia计划的完全主观印象。