Страницы

Поиск по вопросам

вторник, 23 апреля 2019 г.

Скалярное произведение векторов, SSE

Помогите с примером скалярного произведения двух векторов, заданных массивами типа double, при помощи SSE инструкций. Все найденные мной примеры почему-то написаны для типа float Например, вот такая функция
float inner(int n, float* x, float* y) { __m128 *xx = (__m128*)x; __m128 *yy = (__m128*)y; __m128 s = _mm_setzero_ps();
for(int i=0; i

Ответ

А здесь ничего сложного нет. Просто нужно поменять команды на другие. Double вдвое больше по размеру, чем float, поэтому цикл нужно вести до n/2, а не до n/4, далее, ищите справочник и команды работы с double. Например, _mm_mul_pd - это умножение double, аналогично, скорее всего, _mm_add_pd будет для сложения. Аналогично можно отыскать в гугле остальные команды, у меня на это ушло 5 минут.
UPD: лучше после цикла не делать эту ерунду, что написана в примере, а лучше командой _mm_store_pd сохранить два double из xmm регистра в две переменные и спокойно вернуть их сумму.

Комментариев нет:

Отправить комментарий