2017-04-25 70 views
1

什麼是實現金屬實現TF在金屬性能着色器轉

inputs_transposed = tf.transpose(inputs,(2,0,1))

感謝hollemans以下的最佳方式,我知道這需要一個計算內核,但我不知道如何寫下來。當輸入超過4個特徵頻道時,是否有人嘗試在金屬中轉置?

回答

0

您想轉換您的數據嗎?那麼你將不得不編寫一個計算內核。

這將是這個樣子的金屬着色語言:

half4 inColor = inTexture.read(gid); 
half4 outColor = half4(inColor[2], inColor[0], inColor[1], 0.0h); 
outTexture.write(outColor, gid); 

凡在這個特殊的內核工作的像素gid點。

要做到這一點對於超過4個通道,它幾乎是相同的東西,但現在你必須讀/寫/寫入內核中的不同紋理片。

上面的例子顯示了你的(2, 0, 1)轉置,但硬編碼到內核中。當你想以任意方式進行轉置時,它會變得更加複雜。在這種情況下,您需要使用MTLBuffer將新通道順序傳遞到內核中,並且需要確定哪個通道索引對應於哪個紋理片等等。

我知道這仍然是一個模糊的答案。我會看看我是否可以爲此提供一個示例內核,並將其添加到我的Forge開源庫中。 https://github.com/hollance/Forge

編輯:我添加了一個簡單的轉置內核鍛造:https://github.com/hollance/Forge/blob/master/Forge/Forge/TransposeChannels.swift

你使用這樣的:

let channels = 8 
let perm: [UInt16] = [2, 4, 0, 5, 1, 7, 6, 3] 
transposeKernel = TransposeChannelsKernel(device: device, 
          featureChannels: channels, permute: perm) 

然後你編碼它像任何其他MPSCNN內核:

transposeKernel.encode(commandBuffer: commandBuffer, 
         sourceImage: img0, destinationImage: img1) 

因爲它是Forge的一部分,所以它使用了一堆來自該庫的輔助代碼。如果您想將其添加到您自己的項目中而不使用Forge,則還必須複製該幫助程序代碼。

編輯2:從您的評論下面,你似乎不只是想交換通道,但整個軸,所以這TransposeChannels對象不會對你很有用。嘿,至少我要添加一些代碼到我的圖書館。 :-D

+0

非常感謝!是的,這是爲了更多的功能頻道[1024是精確]。我會殺死一個例子。 – user3208799

+0

本質上,我試圖將7 * 7 * 1024 MPSImage更改爲1024 * 7 * 7。如果這可以成爲僞造的示例,我們將非常感激。 – user3208799

+0

轉置後[不知道如果我做對了],我們得到這個錯誤/ BuildRoot/Library/Caches/com.apple.xbs/Sources/MetalImage/MetalImage-61.5/MetalPerformanceShaders/Utility/MPSLibrary.mm:357:failed assertion 'MPS內部錯誤:無法創建名稱爲cnnConvGenF的專用功能'。你見過這個 – user3208799