Страницы

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

четверг, 13 февраля 2020 г.

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

#cpp


Помогите с примером скалярного произведения двух векторов, заданных массивами типа
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


Ответы

Ответ 1



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

Ответ 2



А теперь напишите это на обычном дубовом C++ с циклами и сравните производительность. Я не думаю, что на такой ерунде, как скалярное произведение, вы окажетесь умнее компилятора.* *Если вашему компилятору не вторая пятилетка от релиза пошла, разумеется.

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

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