Форум программистов, компьютерный форум, киберфорум
C++: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 1
Регистрация: 24.11.2016
Сообщений: 49
1

SSE (SSE42, SSE41, SSSE3, SSE3, SSE2, SSE1)

28.08.2017, 17:04. Просмотров 1091. Ответов 3
Метки нет (Все метки)


Подскажите фреймворк \ библиотеку которая будет на базе SSE (SSE42, SSE41, SSSE3, SSE3, SSE2, SSE1) проверять строку на равенство, а так же работать атрофическими операциями. А ля strcmp("StringA", "StringB") И SumAdd(20349, 54356)

Самый главный аспект, именно если процессор не поддерживает SSE42 и SSE41 то он бы использовать версию ниже
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2017, 17:04
Ответы с готовыми решениями:

Какой программой можно преобразовать SSE в SSE2?
Люди помогите мне нужна прога или что небуть в этом роде что бы проц подерживал последниее игры они...

Вектора в sse3
Добрый день. Возникла следующая проблемма: нужна программа, которая будет перемножать вектора с...

SSE2, выравнивание и new
Потихонечку пишу свою длинную арифметку. И вот на этапе оптимизации мне нужно использовать команды...

как не использовать SSE2 ?
т.к. у многих юзеров нет поддержки cvtss2sd из него, можно для них что-нить придумать?

3
1068 / 978 / 145
Регистрация: 19.02.2010
Сообщений: 3,012
29.08.2017, 00:32 2
У Агнера Фога agner.org посмотрите его библиотечку - там есть strcmp и stricmp.

Вот только в сырцах для strcmp заявляется реализация на/под 386 and SSE4.2 instruction sets. Может быть, даже 386ой вариант будет быстрее идущей в стандартной библиотеке Вашего компилятора - проверьте.
А для stricmp - SSE4.2 version not implemented because the gain is small. (т.е. её код "совместим" аж c 386)

Видимо, не все йогурты, т.е. новые наборы инструкций, полезны для повышения эффективности сравнения строк.
Вероятность, что Агнер пропустил какой-то из эффективных способов, мала - т.к. он является автором мануалов по оптимизации прог на ассемблере и на С/С++ (там же на сайте лежат), справочной информации по растактовкам команд кучи процессоров.
0
1 / 1 / 1
Регистрация: 24.11.2016
Сообщений: 49
29.08.2017, 04:43  [ТС] 3
Да, спасибо.. Это той тематики что я и спрашивал.. Только его код не производительнее чем люди на коленке пишут..

Вот этот asm

Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  push    ebx
  push    ebp
  xor     ecx, ecx
  cmp     eax, edx
  jz      @@exit
  inc     ecx
  test    eax, eax
  jz      @@exit
  test    edx, edx
  jz      @@exit
  mov     ecx, dword ptr [eax - 4]
  cmp     ecx, dword ptr [edx - 4]
  jnz     @@exit
  sub     edx, eax
  {$IFNDEF UNALIGNED}
  { test 2 unaligned characters }
  mov     ebx, [eax]
  xor     ebx, [eax + edx]
  jnz     @@exit
  lea     eax, [eax + 4]
  dec     ecx
  jz      @@exit
  dec     ecx
  jz      @@exit
  {$ENDIF}
  xor     ebx, ebx
  lea     ebx, [ebx - 8]
  test    ecx, ebx
  jz      @@l2c
  // -- 8x character loop
@@l8c:
  {$IFDEF UNALIGNED}
  movdqu  xmm0, dqword ptr [eax]
  movdqu  xmm1, dqword ptr [eax + edx]
  {$ELSE (ALIGNED)}
  movdqa  xmm0, dqword ptr [eax]
  {$ENDIF}
  {$IFNDEF SSE41}
  {$IFDEF UNALIGNED}
  pcmpeqd xmm0, xmm1
  {$ELSE (ALIGNED)}
  pcmpeqd xmm0, dqword ptr [eax + edx]
  {$ENDIF}
  pmovmskb ebp, xmm0
  sub     ebp, $FFFF
  {$ELSE (SSE2)}
  {$IFDEF UNALIGNED}
  pxor    xmm0, xmm1
  {$ELSE (ALIGNED)}
  pxor    xmm0, dqword ptr [eax + edx]
  {$ENDIF}
  ptest   xmm0, xmm0
  {$ENDIF}
  jnz     @@exit
  lea     eax, [eax + $10]
  lea     ecx, [ecx - $08]
  test    ecx, ebx
  jnz     @@l8c
  test    ecx, ecx
  jz      @@exit
  // -- 2x character loop
@@l2c:
  mov     ebx, dword ptr [eax]
  xor     ebx, dword ptr [eax + edx]
  jnz     @@exit
  lea     eax, [eax + 4]
  dec     ecx
  jz      @@exit
  dec     ecx
  jnz     @@l2c
  // -- set result and exit
@@exit:
  xor     eax, eax
  test    ecx, ecx
  setz    al
  pop     ebp
  pop     ebx


и тот что у него memcmpSSE2
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  push    esi
  push    edi
  mov     esi, A                    // ptr1
  mov     edi, B                 // ptr2
  mov     ecx, Len                   // size
  add     esi, ecx                         // use negative index from end of memory block
  add     edi, ecx
  neg     ecx
  jz      @@S900
  mov     edx, 0FFFFH
  cmp     ecx, -16
  ja      @@S200
 
@@S100:   // loop comparing 16 bytes
  movdqu  xmm1, [esi+ecx]
  movdqu  xmm2, [edi+ecx]
  pcmpeqb xmm1, xmm2                       // compare 16 bytes
  pmovmskb eax, xmm1                       // get byte mask
  xor     eax, edx                         // not ax
  jnz     @@S700                             // difference found
  add     ecx, 16
  jz      @@S900                             // finished, equal
  cmp     ecx, -16
  jna     @@S100                             // next 16 bytes
 
@@S200:   // less than 16 bytes left
  cmp     ecx, -8
  ja      @@S300
  // compare 8 bytes
  movq    xmm1, [esi+ecx]
  movq    xmm2, [edi+ecx]
  pcmpeqb xmm1, xmm2                       // compare 8 bytes
  pmovmskb eax, xmm1                       // get byte mask
  xor     eax, edx                         // not ax
  jnz     @@S700                             // difference found
  add     ecx, 8
  jz      @@S900
 
@@S300:   // less than 8 bytes left
  cmp     ecx, -4
  ja      @@S400
  // compare 4 bytes
  movd    xmm1, [esi+ecx]
  movd    xmm2, [edi+ecx]
  pcmpeqb xmm1, xmm2                       // compare 4 bytes
  pmovmskb eax, xmm1                       // get byte mask
  xor     eax, edx                         // not ax
  jnz     @@S700                             // difference found
  add     ecx, 4
  jz      @@S900
 
@@S400:   // less than 4 bytes left
  cmp     ecx, -2
  ja      @@S500
  movzx   eax, word [esi+ecx]
  movzx   edx, word [edi+ecx]
  sub     eax, edx
  jnz     @@S800                             // difference in byte 0 or 1
  add     ecx, 2
  jz      @@S900
 
@@S500:   // less than 2 bytes left
  test    ecx, ecx
  jz      @@S900                             // no bytes left
 
  // one byte left
  movzx   eax, byte [esi+ecx]
  movzx   edx, byte [edi+ecx]
  sub     eax, edx                         // return result
  pop     edi
  pop     esi
  JMP       @@exit
 
@@S700:   // difference found. find position
  bsf     eax, eax
  add     ecx, eax
  movzx   eax, byte [esi+ecx]
  movzx   edx, byte [edi+ecx]
  sub     eax, edx                         // return result
  pop     edi
  pop     esi
  JMP       @@exit
 
@@S800:   // difference in byte 0 or 1
  neg     al
  sbb     ecx, -1                          // add 1 to ecx if al == 0
@@S820:   movzx   eax, byte [esi+ecx]
  movzx   edx, byte [edi+ecx]
  sub     eax, edx                         // return result
  pop     edi
  pop     esi
  JMP       @@exit
 
@@S900:   // equal
  xor     eax, eax
  pop     edi
  pop     esi
@@exit:


Debug 32Bit
memcmpSSE2 Max: 1,456572 Min: 0,665633
TestSSE2 Max: 0,251890 Min: 0,219887
1,456572 | 0,227308) + 1,229264 >> TestSSE2
0,748693 | 0,228366) + 0,520327 >> TestSSE2
1,440724 | 0,239516) + 1,201208 >> TestSSE2
0,727608 | 0,239077) + 0,488531 >> TestSSE2
0,665633 | 0,251890) + 0,413743 >> TestSSE2
0,731848 | 0,219887) + 0,511961 >> TestSSE2
0,741570 | 0,229868) + 0,511702 >> TestSSE2
0,735388 | 0,228114) + 0,507274 >> TestSSE2
0,817917 | 0,238949) + 0,578968 >> TestSSE2
0,753952 | 0,243789) + 0,510163 >> TestSSE2


По производительности не канает... Есть ещё варианты ?

Добавлено через 1 минуту
У меня SSE42 и SSE41 не поддерживает проц, хочу заранее написать.
0
1068 / 978 / 145
Регистрация: 19.02.2010
Сообщений: 3,012
31.08.2017, 16:59 4
Проверьте для разных длин строк.
А то если разница в первом же символе - то, очевидно, проиграет тот вариант, у которого просто длиннее пролог+эпилог (число push-pop используемых регистров в стек, иные подготовительные операции).

Т.е. постройте график скоростей для случаев, когда в среднем в десятом, в пятидесятом, сотом, пятисотом, тысячном символе возникает различие у строк. Ну или кратным числу байт в регистре заложите шаг (16-32-64-128-... для случая использования SSE).
Также проверьте случаи выравненности и невыравненности строк на границу параграфа.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2017, 16:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

SSE2 результат не сходиться
Привет, есть простая реализация алгоритма хеширования паролей MD5. После переноса на SSE2 во втором...

Поддержка SSE2 в MASM32
Скачал последний пакет с http://www.masm32.com/. Но команды SSE2 не распознает пишет syntax error...

Умножение матриц. SSE2
Есть 2 матрицы 1000х1000, элементами которых являются матрицы float 12х12. Как с помощью команд...

Поддерживает ли Builder 6.0 инструкции SSE2
Поддерживает ли 6.0 билдер инструкции SSE2? А то что-то ругается компилятор..


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.