Каков наилучший способ загрузки 2 невыровненных 64-битных значений в регистр sse с помощью SSSE3? - PullRequest
6 голосов
/ 28 августа 2011

Для загрузки в регистр xmm имеется 2 указателя на 2 невыровненных 8-байтовых блока По возможности, используя встроенные функции. И по возможности без использования вспомогательного регистра. Без пинсрд. (SSSE Core 2)

Ответы [ 2 ]

3 голосов
/ 28 августа 2011

Из msvc спецификаций похоже, что вы можете сделать следующее:

__m128d xx;                   // an uninitialised xmm register 
xx = _mm_loadh_pd(xx, ptra);  // load the higher 64 bits from (unaligned) ptra
xx = _mm_loadl_pd(xx, ptrb);  // load the lower 64 bits from (unaligned) ptrb

Загрузка из выровненного хранилища (по моему опыту) намного медленнее, чем загрузка извыровненные указатели, так что вы не захотите выполнять операции такого типа слишком часто - если вам действительно нужна более высокая производительность.

Надеюсь, это поможет.

2 голосов
/ 30 августа 2011

Нераспределенный доступ намного медленнее, чем выровненный доступ (по крайней мере, до 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-битное выравнивание

...