2016-12-19 20 views
0

私は最近、CUDAの__byte_perm組み込み関数に相当するAMDを発見しました。 amdgcn_ds_swizzle(または、少なくとも私はそのバイト置換関数と同等だと思います)。私の問題はこれです:CUDAのバイトパーマは2つの符号なし32ビット整数を取り込み、セレクタ引数の値に基づいてそれを置換します(16進値として供給されます)。しかし、AMDのswizzle関数は、単一の符号なし32ビット整数と、「パターン」という名前の1つのintを取り入れます。 AMDのSwizzle組み込み関数をどのように活用すればよいですか?AMD HCC Swizzle組み込み関数

+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および__byte_permは少し異なります。 1つはレーン全体でレジスタ全体を置換し、後で2つの32ビットregから4バイトを置換します。

AMDのds_swizzle_b32 GCN命令は実際には他のレーンと値を入れ替えています。 32ビットレジスタは、読み込みたいレーンとそれを配置する32ビットレジスタに指定します。また、これらをスワップする方法を指定するハードコード値もあります。 ds_swizzle_b32の大きな説明は、ユーザー3528438が指摘しているようにhereです。

__byte_permは、他のレーンとデータをスワップしません。これは、2つの32ビットレジスタから4バイトを収集し、それをレジスタに格納するだけです。クロスレーンのトラフィックはありません。

私はAMD GCNハードウェアで「バイト置換」を行う方法があると思います。その指示はv_perm_b32です。 (12-152ページを参照してください)基本的に2つの指定された32ビットレジスタから4バイトを選択します。

+0

この情報をありがとうございます。 v_perm_b32関数は、HCCコンパイラでは実装されていないようです。生のアセンブリ命令を使用して手動で実装する方法はありますか?私は "asm"関数を使ってデバイスコードの中で "v_perm_b32"命令を呼び出すことを考えていましたが、明らかにこれはHCCでは違法です。 – ligosan

+0

申し訳ありませんが、Windows Visual Studioのサポートがないため、HCCコンパイラについて詳しくは分かりません。私はC#(__asm4GCN)の可能性を知っていますが、それはおそらくあなたが探しているものではありません。 HCCやOpenCLがインラインasmをサポートしていれば素晴らしいだろう!ちなみに、おそらくv_perm_b32サポートをHCCコンパイラに追加するように要求することができます。 (またはより良いasmサポート) – Sunsetquest

関連する問題