5

256ビットベクトルの要素に効率的にアクセスするにはどうすればよいですか?たとえば、ドット積を次のように計算しました

c = _mm256_dp_ps(a, b, 0xff);

それでは、cの値にアクセスするにはどうすればよいですか?上位部分と下位部分の両方を取得する必要があります。最初に次のように128ビット部分を抽出する必要があることを正しく理解していますか。

r0 = _mm256_extractf128_ps(c,0);
r1 = _mm256_extractf128_ps(c,1);

そして、フロートを抽出します。

_MM_EXTRACT_FLOAT(fr0, r0, 0);
_MM_EXTRACT_FLOAT(fr1, r1, 0);

return fr0 + fr1;
4

2 に答える 2

4

さて、あなたはただメモリに保存してからスカラーで作業することができます:

float v[8];
*(__m256)(v) = _mm256_dp_ps(a, b, 0xff);
float result = v[0] + v[4];

次のように、256ビットレジスタの上半分を下半分に入れ替えて追加することもできます。

__m256 c = _mm256_dp_ps(a, b, 0xff);
__m256 d = _mm256_permute2f128_ps(c, c, 1);
__m256 result = _mm256_add_ps(c, d);

どちらのオプションよりもはるかに高速である可能性が高いのは、一度に4x 8幅のドット積を実行し、それらを一緒に減らすことです。スケッチ:

d0 = _mm256_dp_ps(a[0], b[0], 0xff);
d1 = _mm256_dp_ps(a[1], b[1], 0xff);
d2 = _mm256_dp_ps(a[2], b[2], 0xff);
d3 = _mm256_dp_ps(a[3], b[3], 0xff);

d01 = _mm256_permute_ps(d0, d1, ...);
d23 = _mm256_permute_ps(d2, d3, ...);
d0123 = _mm256_permute_ps(d01, d23, ...);

d0123upper = _mm256_permute2f128_ps(d0123, d0123, 1);
d = _mm256_add_ps(d0123upper, d0123); // lower 128 bits contain the results of 4 8-wide dot products
于 2012-11-30T08:59:47.930 に答える
-1

これを行う効率的な方法はありません。dp_ps 操作自体が遅く、その後の抽出も遅いです。バッチでより多くのデータを処理できない限り、SSE4 命令を使用して内積を計算し、256 ビットよりも 128 ビットで操作する方が高速です。

于 2012-11-30T09:36:06.150 に答える