powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ассемблер - регистры MMX - команды условного перехода.
25 сообщений из 225, страница 7 из 9
Ассемблер - регистры MMX - команды условного перехода.
    #39658462
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovА нету как такового вариант автора.

Есть вариант С++ без ассемблера на i3-2120 @3.3 ГГц.

Одиночный вызов f(4294967337, 8589934591) - 19..20 секунд.
Вышеописанный цикл из 254 шагов - 800..845 секунд.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658493
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Aleksandr SharahovА нету как такового вариант автора.

Есть вариант С++ без ассемблера на i3-2120 @3.3 ГГц.

Одиночный вызов f(4294967337, 8589934591) - 19..20 секунд.
Вышеописанный цикл из 254 шагов - 800..845 секунд.

хотелось бы наконец увидеть ассемблерный листинг этого варианта С++ без ассемблера
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658499
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®SiemarglВремя на прогон от 4294967297 до 4294967550 169сек
Это была реклама китайского i7-3770@4GHz
И получено 20 раз f()=1 ?да. и тесты с примерами ранее тоже прошли.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658507
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так был же: 21476315
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658509
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®,

если нетрудно, чтобы просто скопипастиь *всю* функцию от пушей до попов с ретами
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658523
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovAR®пропущено...


Есть вариант С++ без ассемблера на i3-2120 @3.3 ГГц.

Одиночный вызов f(4294967337, 8589934591) - 19..20 секунд.
Вышеописанный цикл из 254 шагов - 800..845 секунд.

хотелось бы наконец увидеть ассемблерный листинг этого варианта С++ без ассемблера
Я тоже голосую за C++.

Ассемблер заводит нас в дебри.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658524
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Так был же: 21476315
Ну ок. Давайте все брать его за эталон сравнения.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658562
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAleksandr Sharahov

хотелось бы наконец увидеть ассемблерный листинг этого варианта С++ без ассемблера
Я тоже голосую за C++.

Ассемблер заводит нас в дебри.

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

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

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

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

И получено 20 раз f()=1 ?да. и тесты с примерами ранее тоже прошли.
>mmx64ompivy
....................result == 1 counter is 20
Time = 627404437 - 627586359
Time = 181922
каждая точка это единичка. добавил счетчик и синхронных вывод - результат чуть ухудшился
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658674
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы тут ассемблером балуетесь... А компилятор например не забывает перед началом цикла воткнуть .align 16
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658675
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
результат компиляции clang (в AT&T формате):
Код: plaintext
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.
	.section	_TEXT,"xr"
	.globl	_f
	.align	16, 0x90
_f:                                     # @f
# BB#0:
	pushl	%ebp
	pushl	%ebx
	pushl	%edi
	pushl	%esi
	xorl	%esi, %esi
	movl	$1, %ebx
	movl	32(%esp), %ecx
	movl	28(%esp), %eax
	.align	16, 0x90
LBB0_1:                                 # =>This Inner Loop Header: Depth=1
	movl	%ebx, %edx
	andl	$1, %edx
	movl	$0, %edi
	cmovnel	24(%esp), %edi
	movl	%esi, %ebp
	sarl	%ebp
	xorl	%edi, %ebp
	testb	%dl, %dl
	movl	$0, %edx
	cmovnel	20(%esp), %edx
	shldl	$31, %ebx, %esi
	xorl	%edx, %esi
	movl	%esi, %edx
	xorl	$1, %edx
	addl	$-1, %eax
	adcl	$-1, %ecx
	orl	%ebp, %edx
	je	LBB0_3
# BB#2:                                 #   in Loop: Header=BB0_1 Depth=1
	movl	%eax, %edi
	orl	%ecx, %edi
	movl	%esi, %ebx
	movl	%ebp, %esi
	jne	LBB0_1
LBB0_3:                                 # %.critedge
	orl	%ecx, %eax
	orl	%eax, %edx
	sete	%al
	movzbl	%al, %eax
	popl	%esi
	popl	%edi
	popl	%ebx
	popl	%ebp
	ret

Ну или так (дисассемблер в intel формат, с ручной вставкой .align вместо nop)
Код: plaintext
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.
	
        public  _f
DGROUP  group   _DATA,_BSS

_TEXT   segment
        assume  CS:_TEXT
                .align 16
_f:
                push    EBP
                push    EBX
                push    EDI
                push    ESI
                xor     ESI,ESI
                mov     EBX,1
                mov     ECX,020h[ESP]
                mov     EAX,01Ch[ESP]
                .align 16
L20:            mov     EDX,EBX
                and     EDX,1
                mov     EDI,0
                cmovnz  EDI,018h[ESP]
                mov     EBP,ESI
                sar     EBP,1
                xor     EBP,EDI
                test    DL,DL
                mov     EDX,0
                cmovnz  EDX,014h[ESP]
                shld    ESI,EBX,01Fh
                xor     ESI,EDX
                mov     EDX,ESI
                xor     EDX,1
                add     EAX,0FFFFFFFFh
                adc     ECX,0FFFFFFFFh
                or      EDX,EBP
                je      L60
                mov     EDI,EAX
                or      EDI,ECX
                mov     EBX,ESI
                mov     ESI,EBP
                jne     L20
L60:            or      EAX,ECX
                or      EDX,EAX
                setz    AL
                movzx   EAX,AL
                pop     ESI
                pop     EDI
                pop     EBX
                pop     EBP
                ret
_TEXT   ends
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658680
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneВы тут ассемблером балуетесь... А компилятор например не забывает перед началом цикла воткнуть .align 16
оно вроде как на современных процах не имеет значения
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658684
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)BarloneВы тут ассемблером балуетесь... А компилятор например не забывает перед началом цикла воткнуть .align 16
оно вроде как на современных процах не имеет значенияАвтору же надо на старых процессорах.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658729
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обещанный полный код f() от MS VC++ на аcсемблере
Код: plaintext
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.
99.
100.
101.
102.
PUBLIC	?f@@YAH_K0@Z					; f
; Function compile flags: /Ogtp
;	COMDAT ?f@@YAH_K0@Z
_TEXT	SEGMENT
_c$ = -8						; size = 8
_a$ = 8							; size = 8
_b$ = 16						; size = 8
?f@@YAH_K0@Z PROC					; f, COMDAT

; 272  : {

	push	ebp
	mov	ebp, esp
	sub	esp, 8

; 273  : 	__int64 c = 0;

	xor	edx, edx
	push	esi
	push	edi
	mov	DWORD PTR _c$[ebp+4], edx

; 274  : 	__int64 d = 1;

	mov	eax, 1
	xor	ecx, ecx
$LN4@f:

; 275  : 
; 276  : 	do
; 277  : 	{
; 278  : 		__int64 e = -(d & 1);

	mov	esi, eax
	and	esi, 1
	xor	edi, edi

; 279  : 		d >>= 1;
; 280  : 		d ^= e & a;

	neg	esi
	adc	edi, edi
	and	esi, DWORD PTR _a$[ebp]
	shrd	eax, ecx, 1
	neg	edi
	and	edi, DWORD PTR _a$[ebp+4]
	sar	ecx, 1
	xor	eax, esi

; 281  : 		c++;

	mov	esi, DWORD PTR _c$[ebp+4]
	xor	ecx, edi
	add	edx, 1
	adc	esi, 0
	mov	DWORD PTR _c$[ebp+4], esi

; 282  : 	}
; 283  : 	while (d != 1 && c != b);

	cmp	eax, 1
	jne	SHORT $LN11@f
	test	ecx, ecx
	je	SHORT $LN10@f
$LN11@f:
	cmp	edx, DWORD PTR _b$[ebp]
	jne	SHORT $LN4@f
	cmp	esi, DWORD PTR _b$[ebp+4]
	jne	SHORT $LN4@f
$LN7@f:

; 284  :                                                         
; 285  : 	return (d == 1 && c == b) ? 1 : 0;	// если выполнились одновременно оба условия, достаточных для выхода из цикла, возвращаем 1, иначе 0

	xor	eax, eax

; 286  : }

	pop	edi
	pop	esi
	mov	esp, ebp
	pop	ebp
	ret	0
$LN10@f:

; 284  :                                                         
; 285  : 	return (d == 1 && c == b) ? 1 : 0;	// если выполнились одновременно оба условия, достаточных для выхода из цикла, возвращаем 1, иначе 0

	cmp	edx, DWORD PTR _b$[ebp]
	jne	SHORT $LN7@f
	cmp	esi, DWORD PTR _b$[ebp+4]
	jne	SHORT $LN7@f

; 286  : }

	pop	edi
	mov	eax, 1
	pop	esi
	mov	esp, ebp
	pop	ebp
	ret	0
?f@@YAH_K0@Z ENDP					; f


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

[SPOILER версия с ассемблерной вставкой]
Код: plaintext
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.
unsigned __int32 fa(unsigned __int64 _a, unsigned __int64 _b)
{
	unsigned __int32 a_H	= _a >> 32;
	unsigned __int32 a_L	= _a & 0xFFFFFFFF;
	unsigned __int32 b_H	= _b >> 32;
	unsigned __int32 b_L	= _b & 0xFFFFFFFF;

	unsigned __int32 _ret	= 0;
	unsigned __int32 d_H, d_L, c_H, c_L;
	
	__asm
	{	
		mov		edx, 0		// <edx:ecx> = d, начальное состояние = 000..01
		mov		ecx, 1
		xor		ebx, ebx	// <ebx:eax> = c, начальное состояние = 000..00
		xor		eax, eax

loopstart:
		xor		esi, esi	// <esi:edi> - будет заполняться в ходе работы либо 000..00, либо a
		xor		edi, edi

		shrd	ecx, edx, 1	// сдвиг младшей половины d
		cmovc	esi, a_H	// если был перенос в shrd, кладём a_H
		cmovc	edi, a_L	// если был перенос в shrd, кладём a_L
		shr		edx, 1		// сдвиг старшей половины d
		xor		edx, esi	// xor d либо с 000..00, либо с a
		xor		ecx, edi

		add		eax, 1		// инкремент c
		adc		ebx, 0

test_d:						// метка не используется
		cmp		edx, 0		// проверка d == 1
		jne	test_c
		cmp		ecx, 1
		jne	test_c
		jmp	loopout

test_c:						// проверка c == b
		cmp		ebx, b_H
		jne	loopstart
		cmp		eax, b_L
		jne	loopstart

loopout:
		cmp		edx, 0
		jne asmout
		cmp		ecx, 1
		jne asmout
		cmp		ebx, b_H
		jne asmout
		cmp		eax, b_L
		jne asmout
		mov		_ret, 1		// если прошли все 4 проверки выше, заполняем _ret = 1 (при объявлении _ret = 0)

asmout:					
		mov		d_H,	edx	// сохраняем d для вывода в printf()...
		mov		d_L,	ecx
		mov		c_H,	ebx	// сохраняем c для вывода в printf()...
		mov		c_L,	eax
	}
	
	printf("\nasmout:	d_H = %u		d_L = %u			c_H = %u		c_L = %u	\n",	d_H, d_L, c_H, c_L);

	return _ret;
}


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

спасибо за код.

На первый взгляд везде примерно одно и то же, оптимизировать практически нечего.

Дальше можно пойти по пути использования свойств алгоритма,
например, учитывать четность параметра и/или 33-битность,
если, конечно, автор не заинтересован в реализации тупого перебора )
Кода уже понаписано немало, самое время прояснить цель.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658771
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое интересное: если убрать в моей версии блок проверки d == 1, работает 13-14 секунд.
Именно эти проверки ломают intel'овский конвейер.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658828
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все ручные оптимизации - бесполезная трата времени.
Один исходник на чистом С, разные компиляторы:
msvc, 32bit - 41 sec
clang, 32bit - 18 sec
gcc, 64bit - 9.5 sec
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658835
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще
msvc 64bit - 18sec
gcc 32bit -27sec
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КМК этот алгоритм балансирует на грани алгоритмизации и практики использования железа.
Алгоритмически например первый шаг расчета e=-(d & 1) определяет битовую маску. Которая
влияет на ход вычисления всего кода дальше. В некоторых высокоуровневых ЯП можно было-бы поставить if
который при прочих генерализовнных условиях мог-бы повлиять на сложность алгоритма.
Типа раньше выйти из цикла. Или что-то в этом роде. Но помня о штрафных санкциях за неверный
переход тут надо подумать. Для ассемблера возможно оно и лучше оперировать флажками
но сохранять непрерывный поток команд без веток. Тоесть это тот случай когда алгоритмист-теоретик
проиграет практикующему ассебмлерщику.

Тот-же 33й бит как-то связывает руки. Так можно было-бы попробовать развернуть 2 раунда
вычислений в 1 спаренный на ММХ 2 по 32. Вобщем злая постановка. Напоминает язык Malbolge,
который создан чтобы поиздеваться над мозгом. Или потренировать смекалку. Впрочем без особой
практической пользы для отрасли.

Чисто организационно я-бы развернул для себя do{}while в for{}. Просто так привычнее. Только надо учеть
1 безусловную итерацию перед входом в цикл. Но возможно для ассемблера с его пост-условными переходами назад
этот подход чуть-чуть отдаляет оригинальный код С++ от результирующего.
...
Рейтинг: 0 / 0
Ассемблер - регистры MMX - команды условного перехода.
    #39658863
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonАлгоритмически например первый шаг расчета e=-(d & 1) определяет битовую маску.
Заметьте, в моей последней асм-версии я от него избавился.

maytonТот-же 33й бит как-то связывает руки.
Увы. Для 32 бит всё уже успешно проделано. И 33-й - это только начало и почва для отладки.

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


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