學(xué)習(xí)Metal中的GPU編程基礎(chǔ)刚夺。
概覽
Metal提供了對(duì)GPU的低層級(jí)和低能耗的訪問(wèn)入口首有。開(kāi)發(fā)高效使用GPU的Metal應(yīng)用的關(guān)鍵是理解底層軟件和硬件的整體交互卡辰。
GPU 編程基礎(chǔ)
GPU是強(qiáng)大的硬件單元,它包含很多處理核心(遠(yuǎn)多于CPU)誓篱。單獨(dú)來(lái)說(shuō)嗦明,每個(gè)GPU核心的處理能力小于CPU核心。但是蚪燕,GPU可以通過(guò)把大量的數(shù)據(jù)分配到它的多個(gè)核心中進(jìn)行整體處理娶牌。
這些基礎(chǔ)硬件的差異使得每個(gè)處理器適合于不同的任務(wù)。GPU特別適合于大量的平行處理任務(wù)馆纳,例如在一個(gè)frame中渲染成千上萬(wàn)的的像素诗良,或者執(zhí)行一個(gè)有成千上萬(wàn)元素的數(shù)組的相同計(jì)算。
下面的例子展示了一個(gè)簡(jiǎn)單的GPU函數(shù)(compute_function)鲁驶。該函數(shù)添加兩個(gè)輸入緩存元素(inputA鉴裹、inputB),并用一個(gè)輸出緩存(outputC)來(lái)存儲(chǔ)結(jié)果钥弯。
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中径荔,這個(gè)操作被聲明在循環(huán)中并順序執(zhí)行。在GPU中脆霎,這個(gè)操作被分配到它的多個(gè)核心中并平行計(jì)算总处。
基礎(chǔ)Metal概念
前面的這個(gè)例子代碼是一個(gè)完成的Metal GPU函數(shù)。你只需要Metal繪制語(yǔ)言來(lái)寫(xiě)GPU-可執(zhí)行函數(shù)睛蛛,但是你需要Metal框架來(lái)指定GPU可訪問(wèn)資源和以GPU為中心的命令鹦马。
下面的簡(jiǎn)單的Metal系統(tǒng)框圖闡述了進(jìn)出GPU的數(shù)據(jù)流。函數(shù)和資源被編碼進(jìn)合并命令忆肾,然后它被發(fā)送到GPU執(zhí)行荸频。來(lái)自GPU的記過(guò)被渲染或?qū)懭氲搅硪唤M資源,它被選擇的發(fā)送給顯示器客冈。
更多信息旭从,參看 基礎(chǔ)概念(Fundamental Components)。