powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ассемблер - регистры MMX - команды условного перехода.
25 сообщений из 225, страница 5 из 9
Ассемблер - регистры MMX - команды условного перехода.
    #39657957
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSiemargl, насколько я понял автор ведет борьбу на ниве 32х битных легаси машин с ММХ.про ммх пора забыть, sse2 существенно быстрее и есть ну очень давно (лет этак 11c 2001г)
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657961
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovmayton,

надежды не оправдались: проверил развертывание цикла в 2 раза - ускорение ~ 0.6%
Мда.. тут не те условия. В исходниках крипто-алгоритмов я часто видел такой хардкод

Код: plaintext
1.
#define ROUND_ENC(a,b,c,d,e,....) __asm{ ......}



А в основном коде шла копи-паста эдак штук 16 или 32 раза ROUND_ENC(...).
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657963
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перестановка операторов дает небольшой прирост скорости (итого 12.64 сек на 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.
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
  shr edi, 1
  //e
  mov edx, dword ptr[eax]
  and edx, ecx
  and ecx, dword ptr[eax+4]
  //new d
  xor esi, edx
  xor edi, ecx
  //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 - команды условного перехода.
    #39657965
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшой флешбек.
AR®Не спрашивайте про постановку задачи целиком. Она большая и скучная. Важна суть, а не постановка, а она - ниже.
Знаешь ты всё таки заслужил коньяк. И хотя ты, хитрый лис не показал мне оригинальную полный стек
(а я всегда смотрел в суть вызова. Кто ? Зачем? Как часто? Какие цели .... и я всегда нудный и дотошный
в постановках и пытаюсь убедить бизнес-аналитика что тот не прав... и этот велосипед на костылях
нелетает просто по причине само-противоречий в ТЗ) я согласен тебе его отправить.

Скажи куда.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39657976
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще немного ускорил (итого 10.14 сек на 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.
51.
52.
function f(a, b: pint64): boolean;
asm
  push ebx
  push ebp
  push esi
  push edi
  //d:=1;
  mov esi, 1
  mov ecx, esi
  xor edi, edi
  //b
  mov ebx, dword ptr [edx]
  mov ebp, dword ptr [edx+4]
  sub ebx, esi
  sbb ebp, edi
@loop:
  //shift d
  shrd esi, edi, 1
  shr edi, 1
  //a & mask
  mov edx, dword ptr[eax]
  neg ecx
  and edx, ecx
  and ecx, dword ptr[eax+4]
  //new d
  xor esi, edx
  xor edi, ecx
  //test d
  cmp esi, 1
  jne @1
  test edi, edi
  jz @done
@1:
  mov ecx, esi
  and ecx, 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 - команды условного перехода.
    #39657994
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

о которой молчит автор-партизан
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658003
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. да. Видимо топик живет своей жизнью. Отдельно от автора.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658004
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное крякает что-то. Стесняется.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658017
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще ускорил - отнес сравнения подальше от вычислений (итого 9.75 сек на 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.
51.
52.
53.
54.
55.
56.
57.
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
  jmp @entry

@loop:
  //new d
  xor esi, edx
  xor edi, ecx
  //test d
  cmp esi, 1
  jne @entry
  test edi, edi
  jz @false

@entry:
  mov ecx, esi
  and ecx, 1
  neg ecx
  shrd esi, edi, 1
  shr edi, 1
  mov edx, dword ptr[eax]
  and edx, ecx
  and ecx, dword ptr[eax+4]
  //test b
  sub ebx, 1
  jnc @loop
  add ebp, ebx
  jge @loop

  //test d
  xor eax, eax
  xor esi, edx
  xor edi, ecx
  xor esi, 1
  or esi, edi
  setz al
  jmp @done
@false:
  xor eax, eax
@done:
  pop edi
  pop esi
  pop ebp
  pop ebx
  end;

...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658051
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это уже за рамками добра и зла:

Код: plaintext
1.
2.
3.
4.
5.
6.
	DWORD d1, d2;
	d1 = GetTickCount();
	
	__int32 r = f(4294967337, 8589934591);
	
	d2 = GetTickCount();



резулт:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
; 24   : 	DWORD d1, d2;
; 25   : 	d1 = GetTickCount();

  00007	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__GetTickCount@0
  0000d	57		 push	 edi
  0000e	ff d6		 call	 esi
  00010	8b f8		 mov	 edi, eax

; 26   : 	__int32 r = f(4294967337, 8589934591);
; 27   : 	d2 = GetTickCount();

  00012	ff d6		 call	 esi
  00014	83 ec 10	 sub	 esp, 16			; 00000010H
  00017	8b f0		 mov	 esi, eax
  00019	e8 00 00 00 00	 call	 ?f@@YAH_K0@Z		; f

...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658053
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)это уже за рамками добра и зла
Нормально все. Ты же r нигде не используешь, вот компилятор его и выкинул. Добавь printf(r)
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658056
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

вот полный код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int test1()
{
	DWORD d1, d2;
	d1 = GetTickCount();
	
	__int32 r = f(4294967337, 8589934591);
	
	d2 = GetTickCount();
	printf("result = %d\n", r);
	printf("Time = %d - %d\n", d1, d2);
	return (d2 - d1);

}

int main()
{
	printf("Time = %d\n", test1());


    return 0;
}
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658060
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)вот полный код:
Т.е. получается компилятор сам посчитал f(4294967337, 8589934591) ? Однако слишком вумный

Долго компилировал? И что за компилятор?
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658061
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
студия 15-я
да ничего он не посчитал, просто вызов GetTickCount всего 1 сделал (см листинг)
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658064
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

вернее он местами поменял вызовы
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658065
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T,
студия 15-я
да ничего он не посчитал, просто вызов GetTickCount всего 1 сделал (см листинг)
Он расчет тебе в printf() заинлайнил, т.е. так получилось
Код: plaintext
1.
printf("result = %d\n", f(4294967337, 8589934591));


Веселый замер времени получился.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658071
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

нет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	00		 mov	 esi, DWORD PTR __imp__GetTickCount@0
  0000d	57		 push	 edi
  0000e	ff d6		 call	 esi
  00010	8b f8		 mov	 edi, eax

; 26   : 	__int32 r = f(4294967337, 8589934591);
; 27   : 	d2 = GetTickCount();

  00012	ff d6		 call	 esi

видишь, вызов GetTickCount идёт раньше чем вызов f
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658076
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)видишь, вызов GetTickCount идёт раньше чем вызов f
Я про это и писал: как понимаю компилятор посчитал что эти вызовы никак не связаны меж собой поэтому соптимизировал: выкинул r и воткнул вызов f в printf().
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658077
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ы
[SRC с++]f(unsigned long long, unsigned long long):
vmovdqa xmm0, XMMWORD PTR .LC0
push ebx
vmovq xmm3, QWORD PTR [esp+8]
vmovq xmm2, QWORD PTR [esp+16]
vmovd eax, xmm0
vpextrd edx, xmm0, 1
.L2:
vmovdqa xmm1, XMMWORD PTR .LC0
mov ecx, eax
mov ebx, edx
shrd ecx, edx, 1
sar ebx
vpand xmm0, xmm0, xmm1
vpxor xmm1, xmm1, xmm1
vpsubq xmm0, xmm1, xmm0
vpand xmm1, xmm0, xmm3
vmovd xmm0, ecx
vpinsrd xmm0, xmm0, ebx, 1
vpxor xmm0, xmm1, xmm0
vpcmpeqd xmm1, xmm1, xmm1
vpaddq xmm2, xmm2, xmm1
vpunpcklqdq xmm2, xmm2, xmm2
vmovd eax, xmm0
vpextrd edx, xmm0, 1
vmovdqa xmm1, XMMWORD PTR .LC0
vpxor xmm1, xmm0, xmm1
vpunpcklqdq xmm1, xmm1, xmm1
vptest xmm1, xmm1
sete cl
vptest xmm2, xmm2
sete bl
test cl, cl
jne .L4
test bl, bl
je .L2
.L4:
and ecx, ebx
pop ebx
movzx eax, cl
ret[/SRC]

это для Sandy Bridge (2011) и новее

https://godbolt.org/g/yzz7VJ
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658080
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

он функции переставляет потому что f ни на что не ссылается, добавил GetTickCount в f и перестановки уже нет

Код: plaintext
1.
2.
3.
4.
5.
__int32 f(unsigned __int64 a, unsigned __int64 b)
{
	GetTickCount();
	__int64 c = 0;
	__int64 d = 1;



Time = 14673

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

Теорий много. Все теории стоят одна другой ©. ))
Спасибо за примеры кода. Будет времечко, изучу.
Пара заметок:
1) корректно приводить время работы не просто для модели процессора, но с указанием его тактовой частоты
2) по ходу экспериментов я наступал как на "ложное срабатывание", так и на "ложное несрабатывание" своих асм-версий функции.
Поэтому вот более серьёзный тест: все числа от 4294967297 до 4294967550 в качестве 1-го аргумента функции, второй аргумент прежний - 8589934591. Весь цикл (254 шага) не займёт больше 20 минут.
Должно быть ровно 20 случаев f()==1. Если не 20, то в алгоритме ошибка.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658083
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если обратить внимание - то заинлайненный код вызова с параметрами-константами отличается от абстрактной функции.
наверно, при этих значениях, что то упростилось
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658085
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglесли обратить внимание - то заинлайненный код вызова с параметрами-константами отличается от абстрактной функции.
наверно, при этих значениях, что то упростилось
просто расчет пошел для int32_t - константы влезли в 32бита
...
Рейтинг: 0 / 0
25 сообщений из 225, страница 5 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ассемблер - регистры MMX - команды условного перехода.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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