学习Metal中的GPU编程基础。
概览
Metal提供了对GPU的低层级和低能耗的访问入口。开发高效使用GPU的Metal应用的关键是理解底层软件和硬件的整体交互。
GPU 编程基础
GPU是强大的硬件单元,它包含很多处理核心(远多于CPU)。单独来说,每个GPU核心的处理能力小于CPU核心。但是,GPU可以通过把大量的数据分配到它的多个核心中进行整体处理。
这些基础硬件的差异使得每个处理器适合于不同的任务。GPU特别适合于大量的平行处理任务,例如在一个frame中渲染成千上万的的像素,或者执行一个有成千上万元素的数组的相同计算。
下面的例子展示了一个简单的GPU函数(compute_function)。该函数添加两个输入缓存元素(inputA、inputB),并用一个输出缓存(outputC)来存储结果。
using namespace metal;
kernel void
compute_function(constant float *inputA [[buffer(0)]],
constant float *inputB [[buffer(1)]],
device float *outputC [[buffer(2)]],
uint index [[thread_position_in_grid]])
{
outputC[index] = inputA[index] + inputB[index];
}
在CPU中,这个操作被声明在循环中并顺序执行。在GPU中,这个操作被分配到它的多个核心中并平行计算。
基础Metal概念
前面的这个例子代码是一个完成的Metal GPU函数。你只需要Metal绘制语言来写GPU-可执行函数,但是你需要Metal框架来指定GPU可访问资源和以GPU为中心的命令。
下面的简单的Metal系统框图阐述了进出GPU的数据流。函数和资源被编码进合并命令,然后它被发送到GPU执行。来自GPU的记过被渲染或写入到另一组资源,它被选择的发送给显示器。
更多信息,参看 基础概念(Fundamental Components)。