#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++ с циклами и сравните производительность. Я не думаю, что на такой ерунде, как скалярное произведение, вы окажетесь умнее компилятора.* *Если вашему компилятору не вторая пятилетка от релиза пошла, разумеется.
Комментариев нет:
Отправить комментарий