14

AVX2 組み込みドキュメントを見ると、次のようなロード命令が集められていますVPGATHERDD

__m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale);

ドキュメントから明確でないのは、計算されたロード アドレスが 要素アドレスかバイトアドレスか、つまり要素のロード アドレスかどうかiです。

load_addr = base + index[i] * scale;               // (1) element addressing ?

また:

load_addr = (char *)base + index[i] * scale;       // (2) byte addressing ?

Intel ドキュメントからは(2) のように見えますが、収集されたロードの最小要素サイズが 32 ビットであることを考えると、これはあまり意味がありません。 ) ?

4

3 に答える 3

11

Gather 命令にはアライメント要件はありません。したがって、バイト アドレッシングを許可しないのは制限が厳しすぎるでしょう。

他の理由は一貫性です。SIB アドレッシングでは、明らかにバイトアドレスがあります。

MOV eax, [rcx + rdx * 2]

VPGATHERDDはこの命令のベクトル化されたバリアントにすぎないためMOV、VSIB アドレッシングとの違いは期待できません。

VPGATHERDD ymm0, [rcx + ymm2 * 2], ymm3

バイトアドレッシングの実際の使用に関しては、各ピクセルが 3 バイトで整列された 24 ビット カラー イメージを使用できます。単一の VPGATHERDD 命令で 8 ピクセルをロードできますが、これは、VSIB の「スケール」フィールドが「1」で、バイトアドレッシングをVPGATHERDD使用する場合のみです。

于 2013-04-24T15:13:17.857 に答える