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);
}

你可能感兴趣的:(OpenCL)