Форум программистов, компьютерный форум CyberForum.ru

Оптимизация кода с использование SIMD - C++

Восстановить пароль Регистрация
 
Heisenberg
44 / 45 / 3
Регистрация: 11.08.2010
Сообщений: 226
28.02.2014, 19:59     Оптимизация кода с использование SIMD #1
Есть код

C++
1
2
3
4
inline double dot(const float* v1, const float* v2)
{
    return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
}
Переписал его вот так

C++
1
2
3
4
5
6
7
8
#define GET(res, i) _res.m128_f32[i]
inline double dot(const float* v1, const float* v2)
{
__m128 _one = {v1[0], v1[1], v1[2], 0.0f };
__m128 _two = {v2[0], v2[1], v2[2], 0.0f };
__m128 _res = _mm_mul_ps(_one, _two);
return GET(_res, 0) + GET(_res, 1) + GET(_res, 2);
}
По скорости получилось примерно одно и то же, по результатам этот вариант даже на пару % медленнее. Возможно ли его как-то оптимизировать еще?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 19:59     Оптимизация кода с использование SIMD
Посмотрите здесь:

Оптимизация кода C++
C++ Оптимизация кода
оптимизация кода! C++
Оптимизация кода C++
C++ Оптимизация кода
C++ оптимизация кода
Оптимизация программного кода C++
оптимизация кода C++
Оптимизация кода C++
C++ Оптимизация кода (C++)
Оптимизация кода C++
C++ Оптимизация кода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
murderer
3178 / 1401 / 70
Регистрация: 06.10.2010
Сообщений: 3,021
28.07.2014, 15:50     Оптимизация кода с использование SIMD #2
На SSE 4.1 это вычисляется одной инструкцией dpps, вектора нужно выравнивать по границе 16 байт.

Добавлено через 1 час 44 минуты
Что-то вроде
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <smmintrin.h>
 
void main(){
    #define dot(x,y)_mm_dp_ps(x,y,0x71).m128_f32[0]
 
    __m128 a={1.0f, 2.0f, 3.0f, 4.0f};
    __m128 b={2.0f, 2.0f, 3.0f, 4.0f};
 
    printf("%f",dot(a,b));
}
На выходе у MSVC вполне кошерный код
Assembler
1
2
3
movaps xmm0,[a]
movaps xmm1,[b]
dpps   xmm1,xmm0,71h
Хотя руками можно и проще записать
Assembler
1
2
movaps xmm0,[a]
dpps   xmm0,[b],71h
Yandex
Объявления
28.07.2014, 15:50     Оптимизация кода с использование SIMD
Ответ Создать тему
Опции темы

Текущее время: 04:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru