Хранение отдельных двойников из упакованного двойного вектора с помощью Intel AVX - PullRequest
5 голосов
/ 09 декабря 2011

Я пишу код с использованием встроенных функций C для инструкций Intel AVX. Если у меня есть упакованный двойной вектор (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 типами, используя _mm_storel_pi и _mm_storeh_pi. Я не смог найти ничего похожего для AVX, которое позволило бы мне сохранять отдельные 64-битные фрагменты в памяти. Один существует?

1 Ответ

7 голосов
/ 09 декабря 2011

Вы можете сделать это с помощью нескольких экстрактов: (предупреждение: не проверено)

 __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 ... Но это еще несколько лет спустядорога.

...