2016-12-19 22 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