2.6 The Brook+ Runtiem API
现在版本的Brook+的特性都是完全改写了runtime引擎后的。为了提高性能和稳定性,新的C++ API提供给开发者以便能在低层用更有弹性的方式操纵GPU。
2.6.1 C++ API和之前编程模型之间的差异
差异表现在一下几个方面:
.动态流管理
.错误处理
.运行域控制
.基于异步API的显式控制
.内存阻塞
.多GPU支持
.DX互操作性
.与C++代码兼容性
接下来几节讨论这些不同之处。
2.6.1.1 动态流管理
Brook,BrookGPU和之前版本的Brook+使用静态方式分配流并且禁止为了同时读和写而对流绑定。在这个C++ API层上,没有这样的限制:
流是GPU内存的代理,可以动态分配,可以在函数之间像任何其它C++对象一样传递。
2.6.1.2 错误处理
在运行时错误被捕获并被传回客户端。在GPU端,错误相对host端的控制流可以是异步的,错误也不是直接传回host而是和流绑定并通过流图像传递。应用程序检查最后的输出来确定运行过程中是否有错误发生。
2.6.1.3 运行域控制
当使用分散流作为输出时,没有必要在输出流布局和运行域布局(运行于kernel上的虚拟“SIMD”数组)之间强行作简单的一对一映射。
2.6.1.4 基于异步API的显示控制
Brook+现在可以让你显式地让一个特定的流操作为异步的。一个API可以用来检查异步请求的状态。这样可以更好地同时使用CPU和GPU,从而提高整个系统的效率。
2.6.1.5 内存阻塞
内存阻塞利用系统允许CPU-to-GPU和GPU-to-CPU内存和用户内存之间的传递这一特性。一般情况下,数据传递时在复制到GPU或者用户内存之前,在CPU的特定内存空间会产生一个副本。内存阻塞会尽可能地提升数据传递的性能。
对内存阻塞的使用有一些开发者必须注意的限制。关于怎样在你的流操作中使用内存阻塞的详情见2.14节。
2.6.1.6 多GPU支持
多系统可以被配置为两个或更多GPU。Brook+支持开发者使用单个Brook+程序利用一个系统中所有兼容的GPU。一组例行的程序可以使用户选择程序运行的设备。关于在你的程序中怎样利用多GPU特性的详情,见2.16节。
2.6.1.7 DX互操作性
DX互操作性支持Brook+程序员很容易地、高效地将他们的计算结果用自己熟悉的图形API显示在屏幕上。这对于图形和视频处理程序特别重要。互用性使程序员在渲染和提升所有应用程序的特性之前避免产生复制回CPU端的副本。
2.6.1.8 与C++代码的兼容性
Kernel代码仍然是C的一个严格子集,但是将所有其它的代码从.br文件中移出意味着开发者可以用C++写应用程序。