Как скопировать нижнюю часть дорожек регистра XMM с помощью libsimdpp - PullRequest
0 голосов
/ 21 сентября 2018

Я использую libsimdpp для написания векторизованного кода.Кажется, я не могу найти способ переместить меньше, чем все дорожки из памяти или из регистра в другой регистр.

Например, с помощью встроенных _mm_move_sd или _ mm_move_ss (кодов операций movsd или movss) можно копировать одну или две нижние полосы между регистрами, оставляя другие полосы нетронутыми.

Как вы поступаете так же с libsimdpp?

1 Ответ

0 голосов
/ 21 сентября 2018

Я незнаком с библиотекой libsimdpp, но, насколько я вижу, вы можете использовать simdpp::shuffle2x2 с подходящими индексами перестановки в качестве альтернативы _mm_move_sd.Из файла https://github.com/p12tic/libsimdpp/blob/master/simdpp/detail/insn/shuffle2x2.h, видно, что таким образом используется _mm_shuffle_pd или _mm_blend_pd, в зависимости от выбранных индексов перестановки.Эти встроенные функции Intel можно использовать в качестве альтернативы _mm_move_sd.

. На странице руководства кажется, что для эмуляции необходимо выбрать индексы перестановки s0 = 2 и s1 = 1_mm_move_sd.Это соответствует строкам 156 и 157 shuffle2x2.h, то есть: if (s0 == 2 && s1 == 1) {return _mm_blend_pd(b.native(), a.native(), 0x2);}.

Альтернативой для _mm_move_ss является _mm_blend_ps с подходящей маской.С simdpp::shuffle4x2 библиотека libsimdpp выбирает _mm_blend_ps для архитектуры x86, если для индексов перестановки верно следующее (s0==0 || s0==4) && (s1==1 || s1==5) && (s2==2 || s2==6) && (s3==3 || s3==7), см. sse_float32_4x2.h , строки 40 и 155.

Обратите внимание, что, например, GCC может компилировать как _mm_blend_ps(a, b, 1), так и _mm_move_ss в инструкцию movss.См. эту ссылку Годболта .Таким образом, с помощью libsimdpp и умного компилятора действительно возможно генерировать код операции movss.Но обратите внимание, что GCC распознает только _mm_blend_pd(a, b, 1);, а не _mm_blend_pd(a, b, 2);, созданный libsimdpp.

Обратите внимание, что инструкция blendpd/ps с операндами регистров имеет лучшую пропускную способность, чем movsd/ss, на процессорах Intelначиная с процессора Intel Haswell, как заметил Питер Кордес в своем комментарии.

...