2016-12-19 53 views
0

我剛剛發現AMD相當於CUDA的__byte_perm內在; amdgcn_ds_swizzle(或者至少我認爲它相當於一個字節排列函數)。我的問題是這樣的:CUDA的字節perm取兩個無符號的32位整數,然後根據選擇器參數的值(作爲十六進制值提供)進行置換。但是,AMD的swizzle函數只需要一個無符號的32位整數,而一個int被稱爲「模式」。我如何利用AMD的Swizzle內在功能?AMD HCC Swizzle Intrinsic

+0

你看過手冊嗎? – user3528438

+0

[This](http://scchan.github.io/hcc/hc_8hpp.html)是我擁有的唯一手冊。它沒有提供太多的信息。我已經在互聯網上搜索過,沒有發現任何東西(除非我找錯了地方)。所以我已經轉向了stackoverflow作爲我的最後的手段。 – ligosan

+0

http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – user3528438

回答

0

ds_swizzle and __byte_perm do有點不同。一個整個寄存器跨越整個寄存器,後面的兩個32位寄存器中的任何四個字節排列。

AMD的ds_swizzle_b32 GCN指令實際上是與其他通道交換數值。您可以在要讀取的通道中指定32位寄存器,並指定要將其放入的32位寄存器。還有一個硬編碼值指定如何交換這些值。用戶3528438指出ds_swizzle_b32的一個很好的解釋是here

__byte_perm不會與其他通道交換數據。它只收集來自其自己通道中的兩個32位寄存器的任何4個字節並將其存儲到寄存器中。沒有跨線交通。

我猜接下來的問題是如何在AMD GCN硬件上進行「字節置換」。該指令是v_perm_b32。 (見第12-152頁here)它基本上從兩個指定的32位寄存器中選擇任意四個字節。

+0

感謝您提供此信息。 v_perm_b32函數似乎沒有用HCC編譯器實現。有沒有辦法使用原始彙編指令手動實現它?我正考慮使用「asm」函數在設備代碼中調用「v_perm_b32」指令,但顯然這對於​​HCC是非法的。 – ligosan

+0

對不起,我不太瞭解HCC編譯器,因爲它沒有Windows Visual Studio支持。我知道它可能在C#(__asm4GCN)中,但這可能不是你正在尋找的。如果HCC或OpenCL支持內聯asm,那將會非常棒!順便說一下,也許你可以要求將v_perm_b32支持添加到HCC編譯器。 (或者更好的支持) – Sunsetquest