《Metal》官方文檔翻譯008--數(shù)據(jù)并行計算處理:計算命令編碼器

本章介紹如何創(chuàng)建和使用MTLComputeCommandEncoder對象來對數(shù)據(jù)并行計算處理狀態(tài)和命令進行編碼并提交它們以便在設備上執(zhí)行档冬。

要執(zhí)行數(shù)據(jù)并行計算视哑,請按照以下主要步驟操作:

1:使用一種MTLDevice方法創(chuàng)建一個MTLComputePipelineState包含來自MTLFunction對象的編譯代碼的計算狀態(tài)()硼瓣,如創(chuàng)建計算狀態(tài)中所述。該MTLFunction對象表示與Metal著色語言編寫的compute函數(shù)命爬,如在描述的功能和庫

2:指定MTLComputePipelineState計算命令編碼器要使用的對象,如為計算命令編碼器指定計算狀態(tài)和資源所述灌灾。

3:指定資源和相關的對象(MTLBufferMTLTexture以及可能的MTLSamplerState)悲柱,其可以包含要處理的數(shù)據(jù)锋喜,并通過計算返回的狀態(tài),如在討論指定計算狀態(tài)和參考資料中的計算命令編碼器豌鸡。還設置參數(shù)表索引嘿般,以便Metal框架代碼可以在著色器代碼中找到相應的資源。在任何給定的時刻涯冠,MTLComputeCommandEncoder都可以與多個資源對象相關聯(lián)炉奴。

4:調(diào)度計算函數(shù)指定的次數(shù),如執(zhí)行計算命令中所述蛇更。

創(chuàng)建計算流水線狀態(tài)

一個MTLFunction對象表示可以由MTLComputePipelineState對象執(zhí)行的數(shù)據(jù)并行代碼瞻赶。該MTLComputeCommandEncoder對象編碼設置參數(shù)并執(zhí)行compute函數(shù)命令。因為創(chuàng)建計算流水線狀態(tài)可能需要昂貴的Metal shading語言代碼的編譯派任,您可以使用阻塞或異步方法來以最適合您的應用程序設計的方式安排此類工作砸逊。

創(chuàng)建MTLComputePipelineState對象時员辩,您還可以選擇創(chuàng)建反映數(shù)據(jù),以顯示計算函數(shù)及其參數(shù)的詳細信息鸵鸥。該newComputePipelineStateWithFunction:options:reflection:error:newComputePipelineStateWithFunction:options:completionHandler:方法提供這些數(shù)據(jù)奠滑。如果不使用反射數(shù)據(jù),請避免使用。有關如何分析反射數(shù)據(jù)的更多信息养叛,請參閱在運行時確定功能詳細信息种呐。

為計算命令編碼器指定計算狀態(tài)和資源

對象的setComputePipelineState:方法MTLComputeCommandEncoder指定用于數(shù)據(jù)并行計算通過的狀態(tài),包括編譯的計算著色器函數(shù)弃甥。在任何給定的時刻爽室,計算命令編碼器可以僅與一個計算功能相關聯(lián)。

以下MTLComputeCommandEncoder方法指定用作MTLComputePipelineState對象所表示的計算函數(shù)的參數(shù)的資源(即緩沖區(qū)淆攻,紋理阔墩,采樣器狀態(tài)或線程組內(nèi)存)。

圖6-1 計算命令編碼器的參數(shù)表

緩沖區(qū),紋理或采樣器狀態(tài)參數(shù)表中最大條目數(shù)的限制列在“ 實現(xiàn)限制”表中伞芹。

最大總線程組內(nèi)存分配的限制也列在實施限制表中忘苛。

執(zhí)行計算命令

要編碼執(zhí)行計算函數(shù)的命令,請調(diào)用dispatchThreadgroups:threadsPerThreadgroup:方法MTLComputeCommandEncoder并指定線程組維度和線程組數(shù)唱较。您可以查詢threadExecutionWidthmaxTotalThreadsPerThreadgroup屬性MTLComputePipelineState來優(yōu)化此設備上計算功能的執(zhí)行扎唾。

線程組中的線程總數(shù)是threadsPerThreadgroup:的組成部分的乘積threadsPerThreadgroup.width *threadsPerThreadgroup.height *threadsPerThreadgroup.depth。該
maxTotalThreadsPerThreadgroup屬性指定在單個線程組中可以在設備上執(zhí)行此計算功能的最大線程數(shù)南缓。

計算命令按照編碼到命令緩沖區(qū)的順序執(zhí)行胸遇。當與命令關聯(lián)的所有線程組完成執(zhí)行并將所有結(jié)果寫入內(nèi)存時,計算命令將完成執(zhí)行汉形。由于這種排序纸镊,計算命令的結(jié)果可用于在命令緩沖區(qū)中編碼的任何命令。

要結(jié)束計算命令編碼器的編碼命令概疆,請調(diào)用其endEncoding方法MTLComputeCommandEncoder逗威。在結(jié)束上一個命令編碼器之后,您可以創(chuàng)建任何類型的新命令編碼器届案,以將其他命令編碼到命令緩沖區(qū)中庵楷。

代碼示例:執(zhí)行數(shù)據(jù)并行函數(shù)

清單6-1顯示了創(chuàng)建和使用MTLComputeCommandEncoder對象執(zhí)行指定數(shù)據(jù)上的圖像轉(zhuǎn)換并行計算的示例。(此示例不顯示如何創(chuàng)建和初始化設備楣颠,庫,命令隊列和資源對象咐蚯。)示例創(chuàng)建命令緩沖區(qū)童漩,然后使用它來創(chuàng)建MTLComputeCommandEncoder對象。接下來春锋,MTLFunction
創(chuàng)建一個對象filter_main矫膨,該MTLLibrary對象表示從對象加載的入口點,如清單6-2所示。然后使用函數(shù)對象來創(chuàng)建一個MTLComputePipelineState被調(diào)用的對象filterState侧馅。

計算函數(shù)對inputImage返回的結(jié)果對圖像執(zhí)行圖像變換和過濾操作outputImage危尿。首先setTexture:atIndex:setBuffer:offset:atIndex:方法將紋理和緩沖區(qū)對象分配給指定參數(shù)表中的索引馁痴。paramsBuffer指定用于執(zhí)行圖像變換的值谊娇,并inputTableData指定過濾器權(quán)重。計算功能在每個維度中被執(zhí)行為尺寸為16 x 16像素的2D線程組罗晕。該dispatchThreadgroups:threadsPerThreadgroup:方法排隊命令來分派執(zhí)行計算函數(shù)的線程济欢,該endEncoding方法終止MTLComputeCommandEncoder。最后小渊,盡快執(zhí)行命令的commit方法MTLCommandBuffer法褥。

清單6-1 在計算狀態(tài)中指定和運行函數(shù)

id <MTLDevice> device;
id <MTLLibrary> library;
id <MTLCommandQueue> commandQueue;

id <MTLTexture> inputImage;
id <MTLTexture> outputImage;
id <MTLTexture> inputTableData;
id <MTLBuffer> paramsBuffer;

// ... Create and initialize device, library, queue, resources

// Obtain a new command buffer
id <MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];

// Create a compute command encoder
id <MTLComputeCommandEncoder> computeCE = [commandBuffer computeCommandEncoder];

NSError *errors;
id <MTLFunction> func = [library newFunctionWithName:@"filter_main"];
id <MTLComputePipelineState> filterState
          = [device newComputePipelineStateWithFunction:func error:&errors];
[computeCE setComputePipelineState:filterState];
[computeCE setTexture:inputImage atIndex:0];
[computeCE setTexture:outputImage atIndex:1];
[computeCE setTexture:inputTableData atIndex:2];
[computeCE setBuffer:paramsBuffer offset:0 atIndex:0];

MTLSize threadsPerGroup = {16, 16, 1};
MTLSize numThreadgroups = {inputImage.width/threadsPerGroup.width,
                       inputImage.height/threadsPerGroup.height, 1};

[computeCE dispatchThreadgroups:numThreadgroups
                            threadsPerThreadgroup:threadsPerGroup];
[computeCE endEncoding];

// Commit the command buffer
[commandBuffer commit];

清單6-2顯示了上述示例的相應著色器代碼。(功能read_and_transform和filter_table用戶定義代碼的占位符)酬屉。

清單6-2 著色語言計算功能聲明

kernel void filter_main(
  texture2d<float,access::read>   inputImage   [[ texture(0) ]],
  texture2d<float,access::write>  outputImage  [[ texture(1) ]],
  uint2 gid                                    [[ thread_position_in_grid ]],
  texture2d<float,access::sample> table        [[ texture(2) ]],
   constant Parameters* params                  [[ buffer(0) ]]
 )
{
  float2 p0          = static_cast<float2>(gid);
  float3x3 transform = params->transform;
  float4   dims      = params->dims;

  float4 v0 = read_and_transform(inputImage, p0, transform);
  float4 v1 = filter_table(v0,table, dims);

  outputImage.write(v1,gid);
}

下一頁

上一頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末半等,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呐萨,更是在濱河造成了極大的恐慌酱鸭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垛吗,死亡現(xiàn)場離奇詭異凹髓,居然都是意外死亡,警方通過查閱死者的電腦和手機怯屉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門蔚舀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锨络,你說我怎么就攤上這事赌躺。” “怎么了羡儿?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵礼患,是天一觀的道長。 經(jīng)常有香客問我掠归,道長缅叠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任虏冻,我火速辦了婚禮肤粱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厨相。我一直安慰自己领曼,他們只是感情好鸥鹉,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庶骄,像睡著了一般毁渗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上单刁,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天灸异,我揣著相機與錄音,去河邊找鬼幻碱。 笑死绎狭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的褥傍。 我是一名探鬼主播儡嘶,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恍风!你這毒婦竟也來了蹦狂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朋贬,失蹤者是張志新(化名)和其女友劉穎凯楔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦募,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摆屯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糠亩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐骑。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赎线,靈堂內(nèi)的尸體忽然破棺而出廷没,到底是詐尸還是另有隱情,我是刑警寧澤垂寥,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布颠黎,位于F島的核電站,受9級特大地震影響滞项,放射性物質(zhì)發(fā)生泄漏狭归。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一蓖扑、第九天 我趴在偏房一處隱蔽的房頂上張望唉铜。 院中可真熱鬧,春花似錦律杠、人聲如沸潭流。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灰嫉。三九已至,卻和暖如春嗓奢,著一層夾襖步出監(jiān)牢的瞬間讼撒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工股耽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留根盒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓物蝙,卻偏偏與公主長得像炎滞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诬乞,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容