Есть ли более эффективный способ транслировать 4 смежных дубли в 4 регистра YMM?

В фрагменте кода C ++, который выполняет что-то похожее (но не совсем) умножение матриц, я загружаю 4 смежных двойных числа в 4 регистра YMM следующим образом:

# a is a 64-byte aligned array of double
__m256d b0 = _mm256_broadcast_sd(&b[4*k+0]);
__m256d b1 = _mm256_broadcast_sd(&b[4*k+1]);
__m256d b2 = _mm256_broadcast_sd(&b[4*k+2]);
__m256d b3 = _mm256_broadcast_sd(&b[4*k+3]);

Я скомпилировал код с помощью gcc-4.8.2 на машине Sandy Bridge. Счетчики аппаратных событий (Intel PMU) показывают, что ЦП фактически выдает 4 отдельных нагрузки из кэша L1. Хотя на данный момент я не ограничен задержкой L1 или пропускной способностью, мне очень интересно знать, есть ли способ загрузить 4 двойных с одной 256-битной загрузкой (или двумя 128-битными загрузками) и перетасовать их в 4 регистра YMM. Я посмотрел черезIntel Intrinsics Guide но не смог найти способ выполнить требуемые тасования. Это возможно?

(Если предположение, что процессор не объединяет 4 последовательные нагрузки, на самом деле неверно, пожалуйста, дайте мне знать.)

Ответы на вопрос(3)

Ваш ответ на вопрос