3

256 bit YMMそれぞれの長さが 1 バイトの 32 個の値を持つレジスタをロードしたいと考えています。私が調べたすべての組み込み関数はdouble word4 byte整数または値のいずれかをロードquad word8 byteます。これらよりも小さいサイズのデータ​​をロードする方法は? これを行うニーモニックはありますが、同等の組み込み関数はありませんか?

4

5 に答える 5

1

バイトだけを集める方法はないと思います。しかし、問題を再考する必要があるように私には聞こえます。これはピクセルデータですか?たとえばRGBA値?もしそうなら、多分あなたはそれが例えばRRRRGGGGBBBB(SSE)を読み書きするようにあなたのアプリケーションを変えることができます。その後、バイトを収集する必要はありません。一度に128/256ビットで読み取ることができ、それがSIMDの最も効率的な使用法になります。

短いint演算を使用すると、効率が上がる可能性があることに注意してください。私は16ビットまでの範囲を意味し、16ビット整数SSE/AVX命令を使用します。

これは、4バイトの整数(RGBA)を読み取り、それらを16ビットに拡張するSSEを使用した双一次内挿の例です。これは、32ビットに拡張するよりも高速です。SSE3の例では、RGBARGBARGBARGBAをRRRRGGGGGBBBBBに変換します。 http://fastcpp.blogspot.no/2011/06/bilinear-pixel-interpolation-using-sse.html

于 2013-03-19T10:14:15.820 に答える
1

これはかなり古い質問ですが、入力パラメーターとして 32 文字を受け取るAVX組み込み関数が必要な場合があると思います。__m256i _mm256_set_epi8

于 2016-03-11T20:53:10.263 に答える
0

シングルバイトをブロードキャストする命令はありませんが、_mm256_set1_epi8組み込みを使用してこの効果を実現できます。

于 2013-02-01T13:35:00.060 に答える
0

_mm256_load_si256組み込み関数をキャストで使用するだけです。この組み込み関数は VMOVDQA 命令に対応します。

以下は、メモリからバイトを読み取り、メモリに格納するコードです。

char raw[32] __attribute__ ((aligned (32)));
__v32qi foo = _mm256_loadu_si256( (__m256i*) raw ); // read raw bytes from memory into avx register
_mm256_store_si256( (__m256i*) raw, foo ); // store contents of avx register into memory

必要に応じて、_mm256_loadu_si256 を使用して、アライメントされていないバイトをロードすることもできます。

于 2013-06-07T17:39:16.803 に答える