Помогите с примером скалярного произведения двух векторов, заданных массивами типа double, при помощи SSE инструкций. Все найденные мной примеры почему-то написаны для типа float
Например, вот такая функция
А здесь ничего сложного нет. Просто нужно поменять команды на другие. Double вдвое больше по размеру, чем float, поэтому цикл нужно вести до n/2, а не до n/4, далее, ищите справочник и команды работы с double. Например, _mm_mul_pd - это умножение double, аналогично, скорее всего, _mm_add_pd будет для сложения. Аналогично можно отыскать в гугле остальные команды, у меня на это ушло 5 минут.
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Ответ
UPD: лучше после цикла не делать эту ерунду, что написана в примере, а лучше командой _mm_store_pd сохранить два double из xmm регистра в две переменные и спокойно вернуть их сумму.
вторник, 23 апреля 2019 г.
Скалярное произведение векторов, SSE
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий