Нераспределенный доступ намного медленнее, чем выровненный доступ (по крайней мере, до Nehalem);
Вы можете добиться большей скорости, загрузив выровненные 128-битные слова, которые содержат желаемые невыровненные 64-битные слова, а затем перемешайте их, чтобы получить желаемый результат.
Предполагает:
- у вас есть доступ к памяти для чтения всего 128 слов
- 64-битные слова выровнены по крайней мере на 32-битных границах
например. (не проверено)
int aoff = ptra & 15;
int boff = ptrb & 15;
__m128 va = _mm_load_ps( (char*)ptra - aoff );
__m128 vb = _mm_load_ps( (char*)ptrb - boff );
switch ( (aoff<<4) | boff )
{
case 0: _mm_shuffle_ps(va,vb, ...
Количество случаев зависит от того, можно ли принять 64-битное выравнивание