powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ассемблер - регистры MMX - команды условного перехода.
25 сообщений из 225, страница 4 из 9
Ассемблер - регистры MMX - команды условного перехода.
    #39657656
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Dima Tтоже тормоз
Код: plaintext
1.
2.
3.
4.
		__int64 e = 0;
		if(d & 1) e = a;
		d >>= 1;
		d ^= e;



Не мучайтесь. :)
Разные варианты этого алгоритма с ветвлениями были испытаны, и все были в 2-3 раза медленнее. Причём это верно и для чисел до 32 бит (когда всё без __int64).

тут нет ветвления, если у компилятора есть AI
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657665
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov.....
с использованием CMOV получилось медленнее? не верю )
А я такую полезную инструкцию даже и не помнил )))

Хорошая же идея. После сдвига в >> в регистре флагов окажется младший бит. Т.ч. можно & на ассемблере и не делать.

Но все равно. код можно сделать компактным, но скорости не добавит. Все шаги завязанны на переменную d, спекулятивное вычисление фиг получишь.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657684
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevAleksandr Sharahov.....
с использованием CMOV получилось медленнее? не верю )
А я такую полезную инструкцию даже и не помнил )))


Просветите меня тёмного, CMOV - это что-то только для x64? Или и для x86 она есть? MS VS C++ её знает?
Что она делает?
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657692
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Leonid Kudryavtsevпропущено...

А я такую полезную инструкцию даже и не помнил )))


Просветите меня тёмного, CMOV - это что-то только для x64? Или и для x86 она есть? MS VS C++ её знает?
Что она делает?

есть везде, если комп не ископаемый, ассемблер точно знает
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657775
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO Т.к. от длинного счетчика цикла вполне можно уйти. Скорее всего, от MMX выйгрышь будет.

Избавление от ненужных __int64 дало +25% ( 24 сек -> 18 сек), наверное и MMX даст примерно столько же. Но дальше - уже чисто тактовая частота процессора. Тут оптимизировать особо нечего, одно число (d) в цикле крутится. Т.ч. все конвееры современных процессоров идут лесом.

Тут только в математику вдумываться. Т.к. мне кажется, что близкие циклы зависят только от младших битов A. Т.ч., мне кажется, вполне можно за одну операцию обрабатывать сразу несколько битов в D. "Перепрыгивая" циклы
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Dima TВ продолжение 21476642 добавлю x32 вариант, тут тоже нет обращений к памяти внутри цикла
Так компилируется в x32
Очень интересно. Особенно, в чём глубокий смысл "and edx, 29h "?
Похоже компилятор перестарался 4294967337 = 0x00000001000000 29
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657809
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чуть больше 9 сек на i5-2300, не отлаживал, параметры передаются по адресу
Код: pascal
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.
function f(a, b: pint64): boolean;
asm
  push ebx
  push ebp
  push esi
  push edi
  //b
  mov ebx, dword ptr [edx]
  mov ebp, dword ptr [edx+4]
  //d:=1;
  mov esi, 1
  xor edi, edi
@loop:
  //shift d, calc mask
  shrd esi, edi, 1
  sbb ecx, 0
  mov edx, ecx
  shr edi, 1
  //e
  and ecx, dword ptr[eax]
  and edx, dword ptr[eax+4]
  //new d
  xor esi, ecx
  xor edi, edx
  //test d
  cmp esi, 1
  jne @1
  test edi, edi
  jz @done
@1:
  //test b
  test ebx, ebx
  jne @loop
  test ebp, ebp
  jne @loop
@done:
  xor eax, eax
  xor esi, 1
  or esi, edi
  or esi, ebx
  or esi, ebp
  jnz @false
  inc eax
@false:
  pop edi
  pop esi
  pop ebp
  pop ebx
  end;
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657817
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
увидел опечатку, наверно теперь пострадает скорость )

sbb ecx, 0

заменить на

sbb ecx, ecx
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657827
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov shrd esi, edi, 1
sbb ecx, 0

Красиво.
А я даже не знал, что в Intel есть инструкции с двойной точностью (((
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657836
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Код: pascal
1.
2.
3.
4.
5.
6.
@1:
  //test b
  test ebx, ebx
  jne @loop
  test ebp, ebp
  jne @loop


Это проверка на выход из цикла. А где сам декримент переменной цикла? Или я совсем ослеп (((
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657914
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevAleksandr Sharahov
Код: pascal
1.
2.
3.
4.
5.
6.
@1:
  //test b
  test ebx, ebx
  jne @loop
  test ebp, ebp
  jne @loop


Это проверка на выход из цикла. А где сам декримент переменной цикла? Или я совсем ослеп (((

Действительно, забыл,
исправленный вариант с новыми ошибками (менее 13 сек на i7-7700)
Код: pascal
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.
function f(a, b: pint64): boolean;
asm
  push ebx
  push ebp
  push esi
  push edi
  //d:=1;
  mov esi, 1
  xor edi, edi
  //b
  mov ebx, dword ptr [edx]
  mov ebp, dword ptr [edx+4]
  sub ebx, esi
  sbb ebp, edi
@loop:
  //shift d, calc mask
  shrd esi, edi, 1
  sbb ecx, ecx
  mov edx, ecx
  shr edi, 1
  //e
  and ecx, dword ptr[eax]
  and edx, dword ptr[eax+4]
  //new d
  xor esi, ecx
  xor edi, edx
  //test d
  cmp esi, 1
  jne @1
  test edi, edi
  jz @done
@1:
  //test b
  sub ebx, 1
  jnc @loop
  add ebp, ebx
  jge @loop
@done:
  xor eax, eax
  add ebx, edi
  or  ebx, ebp
  and esi, edi
  xor esi, -1
  or esi, ebx
  setz al
  pop edi
  pop esi
  pop ebp
  pop ebx
  end;
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657917
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®,

Пробовал развернуть цикл?
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657919
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил неточность с выходом из цикла,
даже не надеюсь, что багов не осталось
Код: pascal
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.
function f(a, b: pint64): boolean;
asm
  push ebx
  push ebp
  push esi
  push edi
  //d:=1;
  mov esi, 1
  xor edi, edi
  //b
  mov ebx, dword ptr [edx]
  mov ebp, dword ptr [edx+4]
  sub ebx, esi
  sbb ebp, edi
@loop:
  //shift d, calc mask
  shrd esi, edi, 1
  sbb ecx, ecx
  mov edx, ecx
  shr edi, 1
  //e
  and ecx, dword ptr[eax]
  and edx, dword ptr[eax+4]
  //new d
  xor esi, ecx
  xor edi, edx
  //test d
  cmp esi, 1
  jne @1
  test edi, edi
  jz @done
@1:
  //test b
  sub ebx, 1
  jnc @loop
  add ebp, ebx
  jge @loop
  xor eax, eax
  jmp @ret
@done:
  xor eax, eax
  and ebx, ebp
  cmp ebx, -1
  setz al
@ret:
  pop edi
  pop esi
  pop ebp
  pop ebx
  end;
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657921
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Финальное исправление
все 3x3 контрольных примера проходят
Код: pascal
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.
function f(a, b: pint64): boolean;
asm
  push ebx
  push ebp
  push esi
  push edi
  //d:=1;
  mov esi, 1
  xor edi, edi
  //b
  mov ebx, dword ptr [edx]
  mov ebp, dword ptr [edx+4]
  sub ebx, esi
  sbb ebp, edi
@loop:
  //shift d, calc mask
  shrd esi, edi, 1
  sbb ecx, ecx
  mov edx, ecx
  shr edi, 1
  //e
  and ecx, dword ptr[eax]
  and edx, dword ptr[eax+4]
  //new d
  xor esi, ecx
  xor edi, edx
  //test d
  cmp esi, 1
  jne @1
  test edi, edi
  jz @done
@1:
  //test b
  sub ebx, 1
  jnc @loop
  add ebp, ebx
  jge @loop
  xor eax, eax
  jmp @ret
@done:
  xor eax, eax
  or  ebx, ebp
  setz al
@ret:
  pop edi
  pop esi
  pop ebp
  pop ebx
  end;
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657929
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAR®, Пробовал развернуть цикл?
В каком смысле развернуть?
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657930
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevAleksandr Sharahov shrd esi, edi, 1
sbb ecx, 0

Красиво.
А я даже не знал, что в Intel есть инструкции с двойной точностью (((

Только она не совсем двойной точности. Она двигает первый операнд, а второй использует только чтобы взять из него замещающие биты биты, а сам он остаётся не сдвигается.
Просветите пожалуйста: CMOV меняет состояние флага CF ?
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657933
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®maytonAR®, Пробовал развернуть цикл?
В каком смысле развернуть?
Ну... обычно если число итераций заранее известно то делают копи-пасту тела цикла.
Выглядит по индусски... Но работает для highload. У тебя второй аргумент - всегда
константа? На этом можно сыграть.

Твой код похож на криптографию. Есть раунд. Внутри некая последовательность
операций над ключом. Только крипто-раунд возвращает шифро-блок. А ты возвращаешь
какой-то булевый признак.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657934
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Просветите пожалуйста: CMOV меняет состояние флага CF ?

не меняет
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657936
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAR®пропущено...

В каком смысле развернуть?
Ну... обычно если число итераций заранее известно то делают копи-пасту тела цикла.
Выглядит по индусски... Но работает для highload. У тебя второй аргумент - всегда
константа? На этом можно сыграть.

Твой код похож на криптографию. Есть раунд. Внутри некая последовательность
операций над ключом. Только крипто-раунд возвращает шифро-блок. А ты возвращаешь
какой-то булевый признак.

Ну, не очень-то и по идусски.
В данном случае даже один лишний переход будет иметь большое значение, т.к. их тут немалая концентрация.
В общем, обязательно стоит попробовать. ща только сериальчик досмотрю )
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657937
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAR®пропущено...

В каком смысле развернуть?
... обычно если число итераций заранее известно... У тебя второй аргумент - всегда
константа?

Второй аргумент - максимальное возможное число проходов цикла, а фактическое число проходов заранее неизвестно. Для тех значений первого аргумента, для которых f() = 0, оно может быть и очень небольшим.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657940
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®,

Постановка задачи неверная. Нужно внешний цикл вызова твоей f параллелить.
Причем параллелить с SSE.

В лоб при таких условиях хороший компилятор не обогнать никак.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657942
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, насколько я понял автор ведет борьбу на ниве 32х битных легаси машин с ММХ.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657943
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAR®,

Постановка задачи неверная. Нужно внешний цикл вызова твоей f параллелить.
Причем параллелить с SSE.

В лоб при таких условиях хороший компилятор не обогнать никак.

Дык обогнал уже.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657950
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут цена вопроса какая? Можно сделать мемоизацию.

Сделаем табличку на 2^33 bits = 2^(33-3) bytes. Для аргумента а. Аргумент b y нас константа.
Его можно хардкодить. И заполним табличку расчитанными значениями функции
f(a,b)==f'(a). Редукция подразумевается. Аргумент b уже учтен в новой функции b'

На расчет таблички уйдет много времени. Но это можно делать постепенно. И сохранять
результат на диск.

Вобщем насколько далеко готов автор зайти в попытке ускорить эту функцию.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657956
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

надежды не оправдались: проверил развертывание цикла в 2 раза - ускорение ~ 0.6%
...
Рейтинг: 0 / 0
25 сообщений из 225, страница 4 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ассемблер - регистры MMX - команды условного перехода.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]