5

IntelのAVX命令用のC組み込み関数を使用してコードを書いています。パックされた二重ベクトル(a __m256d)がある場合、それぞれをメモリ内の異なる場所に格納するための最も効率的な方法(つまり、操作の数が最も少ない)は何でしょうか(つまり、次のような異なる場所にファンアウトする必要があります)彼らはもう詰め込まれていません)?擬似コード:

__m256d *src;
double *dst;
int dst_dist;
dst[0] = src[0];
dst[dst_dist] = src[1];
dst[2 * dst_dist] = src[2];
dst[3 * dst_dist] = src[3];

SSEを使用すると、および組み込み関数__m128を使用する型でこれを行うことができます。個々の64ビット部分をメモリに保存できるAVXに類似したものを見つけることができませんでした。存在しますか?_mm_storel_pi_mm_storeh_pi

4

1 に答える 1

7

あなたはいくつかの抽出物の本能でそれを行うことができます:(警告:テストされていません)

 __m256d src = ...  //  data

__m128d a = _mm256_extractf128_pd(src, 0);
__m128d b = _mm256_extractf128_pd(src, 1);

_mm_storel_pd(dst + 0*dst_dist, a);
_mm_storeh_pd(dst + 1*dst_dist, a);
_mm_storel_pd(dst + 2*dst_dist, b);
_mm_storeh_pd(dst + 3*dst_dist, b);

必要なのはAVX2の収集/分散命令です...しかし、それはまだ数年先です。

于 2011-12-09T04:15:05.747 に答える