Metal语法

Metal Syntax

Metal语法从C++14派生而来 支持其中的大部分特效(部分特性如lambda等不支持) 同时在C++的基础上增加了部分的矩阵等GPU编程常用特性的支持。

Vector向量类型
基础类型+数字后缀: 1. float4 四维向量 假设用float4向量来表示rgba的一个像素 float4 pixel(1.0,2.0,3.0,4.0) pixel.a = 1.0 pixel.r = 2.0 pixel.g = 3.0 pixel.b = 4.0 pixel.ar = float2(1.0, 2.0); 2.

Metal函数类型
函数前缀声明关键字表明metal函数的类型 Metal框架的支持功能有两个 并行计算compute和渲染 vertex和fragment都是渲染函数 1. kernel 并行计算函数 2. vertex 顶点渲染函数 3. fragment 线段渲染函数

计算Metal线程id
为什么异构计算的速度远远超过cpu执行呢 因为GPU运行时是以多线程在执行任务 以图像为例 异构计算处理一张宽高都为100的图片 GPU会生成10000个线程 每个线程负责处理一个像素 CPU则不太可能这样做 这是由他们不同的构造决定的Metal的线程分为不同的group 每个group中有一定数目的线程 要计算出当前线程的操作对象在整个图中的坐标 可以用以下公式 gid是group在整个grid中的坐标 tid是线程在当前group中的坐标 threads_per_group 是每个group中线程的数目 kernel void fusionTest(texture2d input [[texture(0)]], uint2 gid [[threadgroup_position_in_grid]], uint2 tid [[thread_position_in_threadgroup]], uint2 threads_per_group [[threads_per_threadgroup]]) { // 计算线程id uint2 pos = (uint2)((gid * threads_per_group) + tid); float4 data(0.0, 0.5, 2.0, 3.0); input.write(data ,pos); }

    推荐阅读