Войти
ПрограммированиеФорумОбщее

C++, низкий уровень, оптимизация быстродействия. (4 стр)

Страницы: 13 4 5 612 Следующая »
#45
18:32, 13 фев. 2019

Так лучше?
https://rextester.com/YDYP92256

#46
18:48, 13 фев. 2019

FordPerfect
> А можно подробнее?

Да и без меня справились )))

#47
19:34, 13 фев. 2019

AVX2 и разные спрайты:
https://rextester.com/AZH89242

#48
(Правка: 20:37) 20:06, 13 фев. 2019

FordPerfect
Мне кажется там ошибка. ((X>>8) & M) * 255 это корректная маска переполнения. X=007f=>0000, X=0103=>00FF. То есть во втором случае будет 007F|0000=007F - верно. 0103|00FF = 01FF. 01 лишняя. D=L|(H<<8) надо заменить на D=(L&mask)|(H<<8). H<<8 убирает лишние старшие байты из H. А вообще очень интересный алгоритм.

Вот это
__m128i S=_mm_loadu_si128((const __m128i*)s);
__m128i D=_mm_loadu_si128((const __m128i*)d);
__m128i C=_mm_adds_epu8(S,D);
_mm_storeu_si128((__m128i*)d,C);

вообще можно легко заменить на это, вообще s,d должны быть уже __m128i и инкрементироваться через ++.

*(__m128i*)d=_mm_adds_epu8(*(const __m128i*)s,*(const __m128i*)d);

#49
(Правка: 21:54) 21:53, 13 фев. 2019

Truthfinder
> Мне кажется там ошибка.
Походу да, косячу.
> 01 лишняя.
Да.
> H<<8 убирает лишние старшие байты из H.
Вроде же нет. Она же над всем словом работает, а не над 16-битными блоками.
Но там, по идее, что-то выиграть таки можно.

> вообще можно легко заменить
Нет же.
Дело даже не в том, что в твоей версии strict aliasing violation, а в исходной - якобы нет (хотя фиг там).
А в том, что с *(__m128i*) компилятор безапелляционно генерирует movdqa/movaps.
https://godbolt.org/z/Q9NtOi

#50
22:03, 13 фев. 2019

FordPerfect
Так это и надо. Данные выравниваешь и макс профит получаешь с movaps.

#51
(Правка: 22:15) 22:13, 13 фев. 2019

Truthfinder
Ну нафиг.
В исходной постановке задачи явно сказано, что данные могут быть не выровненными.
Требуется ли padding спрайту 65x65 - решать пользователю функции.

Зачем на ровном месте вводить требование выровненности данных, если с этого нет никакого профита?
Благо для выровненных данных - скорость одинакова (кроме процессоров эпохи Pentium 2, что ли).
И код одинаковый по сложности, т. е. для невыровненных данных дополнительных телодвижений не требуется.

#52
22:15, 13 фев. 2019

FordPerfect
Ну тут не поспоришь.

#53
22:34, 13 фев. 2019
подписался
#54
(Правка: 23:31) 22:54, 13 фев. 2019

В gcc можно попробовать на встроенных векторах сделать. Что-то типа:
https://godbolt.org/z/tTphAX

+ Показать
#55
23:16, 13 фев. 2019

entryway
Точно, есть же этот трюк с детектированием переполнения.
И там же вроде достаточно

*d = sum | (sum < *s);
И у тебя не работает для w некратных 4.
Ну и замечание выше, что указатель на векторный тип компилятор воспринимает как гарантию выравненности.
#56
23:25, 13 фев. 2019

FordPerfect
> И там же вроде достаточно
Вроде да. Поправил.

#57
7:27, 14 фев. 2019

Тред не читай, сразу отвечай!
Предлагаю такой кламп:

+ Показать

gcc компилит вот в это:

+ Показать

#58
14:59, 14 фев. 2019

Ещё можно:

uint8_t LUT[511]={/*...*/};
uint8_t clamp(int32_t n) {return LUT[n];}

#59
15:52, 14 фев. 2019

Добавил проверку правильности, исправил add_cpp, добавил LUT:
https://rextester.com/BGCRG58483

Страницы: 13 4 5 612 Следующая »
ПрограммированиеФорумОбщее