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