ilyakurdyukov / jpeg-quantsmooth

JPEG artifacts removal based on quantization coefficients.
GNU Lesser General Public License v2.1
245 stars 21 forks source link

SSE flags? #1

Closed zvezdochiot closed 4 years ago

zvezdochiot commented 4 years ago

https://github.com/ilyakurdyukov/jpeg-quantsmooth/blob/fb02bb23999e5986ea6340d262556e59feec0d4e/quantsmooth.h#L48-L62

Maybe?:

#if defined(__SSE_USE__)
#if defined(__SSE4_1__)
#define USE_SSE2
#define USE_SSE4
#include <smmintrin.h>
#elif defined(__SSE2__)
#define USE_SSE2
#include <emmintrin.h>

#define _mm_cvtepu8_epi16(a) _mm_unpacklo_epi8(a, _mm_setzero_si128())
// _mm_cmplt_epi16(a, _mm_setzero_si128()) or _mm_srai_epi16(a, 15)
#define _mm_cvtepi16_epi32(a) _mm_unpacklo_epi16(a, _mm_srai_epi16(a, 15))
#define _mm_abs_epi16(a) ({ \
    __m128i __tmp = _mm_srai_epi16(a, 15); \
    _mm_xor_si128(_mm_add_epi16(a, __tmp), __tmp); })
#endif
#endif

Pass __SSE_USE__ from theMakefile:

CFLAGS ?= -Wall -D__SSE_USE__ -O2 -march=native -fopenmp

And add to docs alternative:

make CFLAGS="-Wall -O2"

PS: Debian Wheezy. I feel better without SSE.

ilyakurdyukov commented 4 years ago

Code with SSE2 is a way faster and supported in base x86_64 system. You can build with specific flags, if you want no SSE: make LIBS="-ljpeg -lm" CFLAGS="-fopenmp -static -O3 -mno-sse2" clean all See "release.sh" for examples.

zvezdochiot commented 4 years ago

@ilyakurdyukov say:

See "release.sh" for examples.

Hmm. It may be worth adding to README (Build section):

make CFLAGS="-fopenmp -O2 -mno-sse2" clean all

PS: The definition of __SSE_USE__ is still convenient. No harm.

ilyakurdyukov commented 4 years ago

Well, I'm kind of bad with documentation. I will be happy if someone help me do it better. But if you write a ready changes to README, and not a subject to add. Also need some edit because of bad English.

zvezdochiot commented 4 years ago

@ilyakurdyukov say:

Also need some edit because of bad English.

Да я сам такой же (https://translate.google.ru/). Ты хоть бы профиль посмотрел.

Делай "по образцу", например: https://github.com/ImageProcessing-ElectronicPublications/pixel-art-maker

ilyakurdyukov commented 4 years ago

Да я сам такой же (https://translate.google.ru/). Ты хоть бы профиль посмотрел.

Оно и по нику всё понятно, но нас и другие могут читать (чтобы несколько раз не спрашивали на разных языках).

zvezdochiot commented 4 years ago

На всякий: Я без https://translate.google.ru/ в English полный 0 (даже простейшего предложения не выдам). Поэтому прими совет по копипасте, меня оно в основном выручает.

ilyakurdyukov commented 4 years ago

Зачем мне дефайнить __SSE_USE__? Пользователь не должен делать дефайны такого вида (с подчёркиваниями), это системные. Идея в том, чтобы использовались фичи максимально возможные из разрешённых компилятору. Хорошо бы сделать динамический выбор в зависимости от результата cpuid, но я не хочу сейчас этим заморачиваться.

zvezdochiot commented 4 years ago

@ilyakurdyukov say:

Зачем мне дефайнить __SSE_USE__?

Так я ж для примера. На твоё усмотрение. Конструкция простая: сделал и забыл. Предполагается, что сборка будет через make с флагами по умолчанию. А остальное - это для "избранных", вроде меня.

zvezdochiot commented 4 years ago

С дугой стороны, вопрос в принципе решён. Только в README постарайся добавить.

Fixed https://github.com/ilyakurdyukov/jpeg-quantsmooth/issues/1#issuecomment-578493432

ilyakurdyukov commented 4 years ago

С дугой стороны, вопрос в принципе решён. Только в README постарайся добавить.

Напрягает меня писать README на английском (и на русском бы тоже напрягало, как и любая документация, но меньше), а если переводить гугл транслейтом, то получится филиал алиэкспресс. Так что как-нибудь дополню, когда будет настроение с переводом возиться.