powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / inline корявo работает
38 сообщений из 38, показаны все 2 страниц
inline корявo работает
    #39455538
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему когда есть в таблице VAR какие нибудь переменные указатели, то функция inline сходит с сума ? И тормозит дико код.

Ведь на вызовах должна быть экономия!

Может что в настройках не так ?

- Выдаёт : 0.250906 сек.
Код: pascal
1.
procedure m(var source; var dest; len: Integer);




- Выдаёт : 0.265767 сек.
Код: pascal
1.
procedure m(var source; var dest; len: Integer); inline;




Код: pascal
1.
2.
3.
4.
5.
6.
var
  dst, src: PLongWord;
  i, m: Integer;
begin

end;
...
Рейтинг: 0 / 0
inline корявo работает
    #39455544
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикПочему когда есть в таблице VAR какие нибудь переменные указатели, то функция inline сходит с сума ? И тормозит дико код.

Ведь на вызовах должна быть экономия!

Может что в настройках не так ?

- Выдаёт : 0.250906 сек.
Код: pascal
1.
procedure m(var source; var dest; len: Integer);




- Выдаёт : 0.265767 сек.
Код: pascal
1.
procedure m(var source; var dest; len: Integer); inline;




Код: pascal
1.
2.
3.
4.
5.
6.
var
  dst, src: PLongWord;
  i, m: Integer;
begin

end;



"Почему когда я пью газировку, меня шибает не в нос, а в самую маковку ?"

Смотри ассемблерный код, лучше выкладывай сюда оба случая.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455549
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

inline меняет распределение регистров в вызывающей и вызываемой процедурах
и, следовательно, может влиять на качество их оптимизации из-за потребности
в большем количестве регистров для "объединенной" процедуры.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455554
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

в качестве примера,
именно поэтому в поразрядной сортировке http://guildalfa.ru/alsha/node/21
мне пришлось фазы распределения реализовать как самостоятельные процедуры
...
Рейтинг: 0 / 0
inline корявo работает
    #39455556
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Вот сама функция которая копирует строки (по несколько байтов, за один такт), и остаток. Чем move не подошёл - я проект ещё делаю под лазур, и там она медленно работает, вот пишу что бы там и там.

Код: 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.
procedure MyMove(var source; var dest; len: Integer);
var
  dst, src: PLongWord;
  i, m: Integer;
begin
  src := PLongWord(@source);
  dst := PLongWord(@dest);
  i := 0;
  m := len shr SizeOf(WORD);

  while i < m do
  begin
    dst^ := src^;
    inc(dst);
    inc(src);
    inc(i);
  end;

  i := 0;
  m := len Mod SizeOf(LongInt);

  while i < m do
  begin
    PByte(dst)^ := PByte(src)^;
    inc(PByte(dst));
    inc(PByte(src));
    inc(i);
  end;
end;



Её ассемблер
Код: 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.
MyMove:
005CDB14 53               push ebx
005CDB15 56               push esi
005CDB16 57               push edi
005CDB17 8BF0             mov esi,eax
005CDB19 33C0             xor eax,eax
005CDB1B 8BF9             mov edi,ecx
005CDB1D C1EF02           shr edi,$02
005CDB20 3BF8             cmp edi,eax
005CDB22 7E0F             jle $005cdb33
005CDB24 8B1E             mov ebx,[esi]
005CDB26 891A             mov [edx],ebx
005CDB28 83C204           add edx,$04
005CDB2B 83C604           add esi,$04
005CDB2E 40               inc eax
005CDB2F 3BF8             cmp edi,eax
005CDB31 7FF1             jnle $005cdb24
005CDB33 33C0             xor eax,eax
005CDB35 8BF9             mov edi,ecx
005CDB37 81E703000080     and edi,$80000003
005CDB3D 7905             jns $005cdb44
005CDB3F 4F               dec edi
005CDB40 83CFFC           or edi,-$04
005CDB43 47               inc edi
005CDB44 3BF8             cmp edi,eax
005CDB46 7E0C             jle $005cdb54
005CDB48 0FB60E           movzx ecx,[esi]
005CDB4B 880A             mov [edx],cl
005CDB4D 42               inc edx
005CDB4E 46               inc esi
005CDB4F 40               inc eax
005CDB50 3BF8             cmp edi,eax
005CDB52 7FF4             jnle $005cdb48
005CDB54 5F               pop edi
005CDB55 5E               pop esi
005CDB56 5B               pop ebx
005CDB57 C3               ret 



Рассматривать Ассемблер будем на такой функции


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure StrMove(var StrCode: EngineType; var Value: EngineString;
  var CurrentLenToken: EngineInt; var i3: EngineInt; lenskip: EngineInt);
begin
  SetLength(Value, CurrentLenToken + i3);
  MyMove(StrCode^, Value[CurrentLenToken + 1], i3 * SizeOf(EngineChar));
  inc(CurrentLenToken, i3);
  inc(StrCode, i3 + lenskip);
  i3 := 0;
end;




Без inline выходит
Код: 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.
StrMove:
005CDB58 55               push ebp
005CDB59 8BEC             mov ebp,esp
005CDB5B 51               push ecx
005CDB5C 53               push ebx
005CDB5D 56               push esi
005CDB5E 57               push edi
005CDB5F 8BF1             mov esi,ecx
005CDB61 8955FC           mov [ebp-$04],edx
005CDB64 8BF8             mov edi,eax
005CDB66 8B5D0C           mov ebx,[ebp+$0c]
005CDB69 8B16             mov edx,[esi]
005CDB6B 0313             add edx,[ebx]
005CDB6D 8B45FC           mov eax,[ebp-$04]
005CDB70 E84BDBE3FF       call @UStrSetLength
005CDB75 8B45FC           mov eax,[ebp-$04]
005CDB78 E847D4E3FF       call @UniqueStringU
005CDB7D 8B16             mov edx,[esi]
005CDB7F 8D1450           lea edx,[eax+edx*2]
005CDB82 8B0B             mov ecx,[ebx]
005CDB84 03C9             add ecx,ecx
005CDB86 8B07             mov eax,[edi]
005CDB88 E887FFFFFF       call MyMove
005CDB8D 8B03             mov eax,[ebx]
005CDB8F 0106             add [esi],eax
005CDB91 8B03             mov eax,[ebx]
005CDB93 034508           add eax,[ebp+$08]
005CDB96 03C0             add eax,eax
005CDB98 0107             add [edi],eax
005CDB9A 33C0             xor eax,eax
005CDB9C 8903             mov [ebx],eax
005CDB9E 5F               pop edi
005CDB9F 5E               pop esi
005CDBA0 5B               pop ebx
005CDBA1 59               pop ecx
005CDBA2 5D               pop ebp
005CDBA3 C20800           ret $0008
005CDBA6 8BC0             mov eax,eax




Вместе с inline

Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
StrMove:
005CDB14 55               push ebp
005CDB15 8BEC             mov ebp,esp
005CDB17 83C4F4           add esp,-$0c
005CDB1A 53               push ebx
005CDB1B 56               push esi
005CDB1C 894DF8           mov [ebp-$08],ecx
005CDB1F 8BDA             mov ebx,edx
005CDB21 8945FC           mov [ebp-$04],eax
005CDB24 8B55F8           mov edx,[ebp-$08]
005CDB27 8B12             mov edx,[edx]
005CDB29 8B450C           mov eax,[ebp+$0c]
005CDB2C 0310             add edx,[eax]
005CDB2E 8BC3             mov eax,ebx
005CDB30 E88BDBE3FF       call @UStrSetLength
005CDB35 8B75FC           mov esi,[ebp-$04]
005CDB38 8B36             mov esi,[esi]
005CDB3A 8BC3             mov eax,ebx
005CDB3C E883D4E3FF       call @UniqueStringU
005CDB41 8B55F8           mov edx,[ebp-$08]
005CDB44 8B12             mov edx,[edx]
005CDB46 8D0450           lea eax,[eax+edx*2]
005CDB49 8945F4           mov [ebp-$0c],eax
005CDB4C 8BCE             mov ecx,esi
005CDB4E 8B45F4           mov eax,[ebp-$0c]
005CDB51 8BD0             mov edx,eax
005CDB53 33C0             xor eax,eax
005CDB55 8B5D0C           mov ebx,[ebp+$0c]
005CDB58 8B33             mov esi,[ebx]
005CDB5A 03F6             add esi,esi
005CDB5C C1EE02           shr esi,$02
005CDB5F 3BF0             cmp esi,eax
005CDB61 7E0F             jle $005cdb72
005CDB63 8B19             mov ebx,[ecx]
005CDB65 891A             mov [edx],ebx
005CDB67 83C204           add edx,$04
005CDB6A 83C104           add ecx,$04
005CDB6D 40               inc eax
005CDB6E 3BF0             cmp esi,eax
005CDB70 7FF1             jnle $005cdb63
005CDB72 33C0             xor eax,eax
005CDB74 8B5D0C           mov ebx,[ebp+$0c]
005CDB77 8B33             mov esi,[ebx]
005CDB79 03F6             add esi,esi
005CDB7B 81E603000080     and esi,$80000003
005CDB81 7905             jns $005cdb88
005CDB83 4E               dec esi
005CDB84 83CEFC           or esi,-$04
005CDB87 46               inc esi
005CDB88 3BF0             cmp esi,eax
005CDB8A 7E0C             jle $005cdb98
005CDB8C 0FB619           movzx ebx,[ecx]
005CDB8F 881A             mov [edx],bl
005CDB91 42               inc edx
005CDB92 41               inc ecx
005CDB93 40               inc eax
005CDB94 3BF0             cmp esi,eax
005CDB96 7FF4             jnle $005cdb8c
005CDB98 8B450C           mov eax,[ebp+$0c]
005CDB9B 8B00             mov eax,[eax]
005CDB9D 8B55F8           mov edx,[ebp-$08]
005CDBA0 0102             add [edx],eax
005CDBA2 8B450C           mov eax,[ebp+$0c]
005CDBA5 8B00             mov eax,[eax]
005CDBA7 034508           add eax,[ebp+$08]
005CDBAA 03C0             add eax,eax
005CDBAC 8B55FC           mov edx,[ebp-$04]
005CDBAF 0102             add [edx],eax
005CDBB1 8B450C           mov eax,[ebp+$0c]
005CDBB4 33D2             xor edx,edx
005CDBB6 8910             mov [eax],edx
005CDBB8 5E               pop esi
005CDBB9 5B               pop ebx
005CDBBA 8BE5             mov esp,ebp
005CDBBC 5D               pop ebp
005CDBBD C20800           ret $0008

...
Рейтинг: 0 / 0
inline корявo работает
    #39455563
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользуюсь случаем, дабы спросить...

Я воспользовался компилятором GCC и сделал ASM благодаря сайту godbolt

Дальше полученный код засунул в Delpho
Код: 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.
 procedure MyMove(var source; var dest; len: Integer);  stdcall;
  label
  L1, L2, L3, L4, L5, L10;
  asm
  push	esi
  push	ebx
  mov	ecx, dest
  mov	ebx, source
  cmp	ecx, ebx
  je	L1
  mov	eax, len
  xor	edx, edx
  shr	eax, 2
  L3:
  cmp	edx, eax
  jge	L10
  mov	esi, DWORD PTR [ebx+edx*4]
  mov	DWORD PTR [ecx+edx*4], esi
  inc	edx
  jmp	L3
  L10:
  sal	eax, 2
  xor	edx, edx
  add	ecx, eax
  add	eax, ebx
  mov	ebx, len
  and	ebx, 3
  mov	esi, ebx
  L5:
  cmp	edx, esi
  je	L1
  mov	bl, BYTE PTR [eax+edx]
  mov	BYTE PTR [ecx+edx], bl
  inc	edx
  jmp	L5
  L1:
  pop	ebx
  pop	esi
  end;



Но, по результату она оказалась медленной на 0.011862 сек.

Это говорит о том, что GCC медленнее Delphi ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Type your code here, or load an example.
#include <wchar.h>


 void   strmove( wchar_t*Dest,  wchar_t*Source, int len)
{
	int i, m;
	unsigned long  *wdst =(unsigned long  *) Dest;  // текущая позиция в буфере назначения
	unsigned long  *wsrc =(unsigned long  *)  Source;  // текущая позиция в источнике
	unsigned char  *cdst, *csrc;
	 
	for(i = 0, m = len / sizeof(long); i < m; i++)  // копируем основную часть блоками по 4 или 8 байт
	   *(wdst++) = *(wsrc++);                     // (в зависимости от платформы)
	 
	cdst = (unsigned char*)wdst;
	csrc = (unsigned char*)wsrc;

	for(i = 0, m = len % sizeof(long); i < m; i++)             // остаток копируем побайтно
	   *(cdst++) = *(csrc++);
}

...
Рейтинг: 0 / 0
inline корявo работает
    #39455566
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для сайта того я задал максимальную оптимизацию -m32 -O3 -Os -S -masm=intel
...
Рейтинг: 0 / 0
inline корявo работает
    #39455576
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

какой смысл переизобретать Move?
...
Рейтинг: 0 / 0
inline корявo работает
    #39455578
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая офигенная "оптимизация".

Еще и с ошибками =)
...
Рейтинг: 0 / 0
inline корявo работает
    #39455580
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovНяшик,

какой смысл переизобретать Move?


В скорости, если Delphi нам выдаёт хорошие результат в виде


Код: pascal
1.
2.
3.
4.
procedure MyMove(var source; var dest; len: Integer);
begin
  move(source, dest, len);
end;




0.258414 сек.


То лазур уже выдаёт

0.520669 сек.


=___= БРРР ... С моим велосипедом он выдаёт

0.472578 сек

Опять же все оптимизации выставил на максимум..


Siemargl,

Ну уж какая есть
...
Рейтинг: 0 / 0
inline корявo работает
    #39455583
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Поизучай что ли матчасть
https://github.com/graemeg/freepascal/blob/master/rtl/i386/fastmove.inc
...
Рейтинг: 0 / 0
inline корявo работает
    #39455586
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

тебе намекают на SizeOf(EngineChar)
...
Рейтинг: 0 / 0
inline корявo работает
    #39455592
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovНяшик,

тебе намекают на SizeOf(EngineChar)


А что тут такого? Мне удобнее когда все типы - заранее переопределяются настройками движка, в зависимости под какую я платформу хочу собрать, и какие типы строк я хочу использовать.


Сейчас у меня там
Код: pascal
1.
2.
  EngineChar = WideChar;
  EngineType = PWideChar;





SiemarglНяшик,

Поизучай что ли матчасть
https://github.com/graemeg/freepascal/blob/master/rtl/i386/fastmove.inc


А на боевых действиях это как - то коряво работает...
...
Рейтинг: 0 / 0
inline корявo работает
    #39455609
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,
сам посмотри, сколько лишних пересылок порождается.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455627
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Так ты код посмотрел?

Проверил, что у тебя RTL с USE_FASTMOVE собран?
...
Рейтинг: 0 / 0
inline корявo работает
    #39455652
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНяшик,

Так ты код посмотрел?

Проверил, что у тебя RTL с USE_FASTMOVE собран?

Вроде как. Поставил
Код: pascal
1.
{$define USE_FASTMOVE}        



И ничего не изменилось
...
Рейтинг: 0 / 0
inline корявo работает
    #39455664
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикSiemarglНяшик,

Так ты код посмотрел?

Проверил, что у тебя RTL с USE_FASTMOVE собран?

Вроде как. Поставил
Код: pascal
1.
{$define USE_FASTMOVE}        



И ничего не изменилось

поставил где, у себя в программе, использующую уже собранную RTL ?
...
Рейтинг: 0 / 0
inline корявo работает
    #39455669
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rНяшикпропущено...


Вроде как. Поставил
Код: pascal
1.
{$define USE_FASTMOVE}        



И ничего не изменилось

поставил где, у себя в программе, использующую уже собранную RTL ?

А ну так собирать ещё RTL нужно... Ну если в гугле 1 запрос по данному поводу "USE_FASTMOVE LAZARUS" то тут уже не совсем мой косяк.

Киньте мануал как это сделать
...
Рейтинг: 0 / 0
inline корявo работает
    #39455695
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, интересно, а зачем нужен режим без USE_FASTMOVE, который по-умолчанию, как я понял?
...
Рейтинг: 0 / 0
inline корявo работает
    #39455702
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикSiemarglНяшик,

Так ты код посмотрел?

Проверил, что у тебя RTL с USE_FASTMOVE собран?

Вроде как. Поставил
Код: pascal
1.
{$define USE_FASTMOVE}        



И ничего не изменилось
:LOL:
...
Рейтинг: 0 / 0
inline корявo работает
    #39455707
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНо, по результату она оказалась медленной на 0.011862 сек.

Это говорит о том, что GCC медленнее Delphi ?

Это говорит о том, что там более оптимизированный алгоритм используется - он GPU использует. Кстати, алгоритм запатентованный вроде бы
...
Рейтинг: 0 / 0
inline корявo работает
    #39455714
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикПользуюсь случаем, дабы спросить...

Я воспользовался компилятором GCC и сделал ASM благодаря сайту godbolt
....

Выбери там же Clang 4 и получишь SSE
...
Рейтинг: 0 / 0
inline корявo работает
    #39455715
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)НяшикНо, по результату она оказалась медленной на 0.011862 сек.

Это говорит о том, что GCC медленнее Delphi ?

Это говорит о том, что там более оптимизированный алгоритм используется - он GPU использует. Кстати, алгоритм запатентованный вроде быА давай еще сказку на ночь?
...
Рейтинг: 0 / 0
inline корявo работает
    #39455736
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНяшикПользуюсь случаем, дабы спросить...

Я воспользовался компилятором GCC и сделал ASM благодаря сайту godbolt
....

Выбери там же Clang 4 и получишь SSE

Ну... Поставил, впихнул в Delphi... И вижу что моя функция на Delphi - 0.002525 сек быстрее..

Пробовал с разными оптимизациями, остановился на -m32 -O3 -Os -Oz

Код: 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.
procedure MyMove(var source; var dest; len: Integer); stdcall;
label
  LBB0_1, LBB0_2, LBB0_3, LBB0_4, LBB0_5, LBB0_6, LBB0_7, LBB0_8, LBB0_9;
asm
  push    ebp
  push    ebx
  push    edi
  push    esi
  mov     eax, len
  mov     edi, dest
  mov     ebp, source
  mov     esi, eax
  shr     esi, 2
  lea     ecx, [edi + 4*esi]
  mov     ebx, esi
  jmp     LBB0_1
  LBB0_2:
  mov     edx, dword ptr [ebp]
  add     ebp, 4
  dec     ebx
  mov     dword ptr [edi], edx
  add     edi, 4
  LBB0_1:
  test    ebx, ebx
  jne     LBB0_2
  mov     edx, dword ptr [esp + 24]
  and     eax, 3
  lea     edx, [edx + 4*esi]
  jmp     LBB0_4
  LBB0_5:
  mov     bl, byte ptr [edx]
  inc     edx
  dec     eax
  mov     byte ptr [ecx], bl
  inc     ecx
  LBB0_4:
  test    eax, eax
  jne     LBB0_5
  pop     esi
  pop     edi
  pop     ebx
  pop     ebp
end;




И всё же, почему так медленно? Может это Delphi ассемблер как - то коверкает. Вот листинг
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
pas.699: asm
00414B3C 55               push ebp
00414B3D 8BEC             mov ebp,esp
pas.700: push    ebp
00414B3F 55               push ebp
pas.701: push    ebx
00414B40 53               push ebx
pas.702: push    edi
00414B41 57               push edi
pas.703: push    esi
00414B42 56               push esi
pas.704: mov     eax, len
00414B43 8B4510           mov eax,[ebp+$10]
pas.705: mov     edi, dest
00414B46 8B7D0C           mov edi,[ebp+$0c]
pas.706: mov     ebp, source
00414B49 8B6D08           mov ebp,[ebp+$08]
pas.707: mov     esi, eax
00414B4C 89C6             mov esi,eax
pas.708: shr     esi, 2
00414B4E C1EE02           shr esi,$02
pas.709: lea     ecx, [edi + 4*esi]
00414B51 8D0CB7           lea ecx,[edi+esi*4]
pas.710: mov     ebx, esi
00414B54 89F3             mov ebx,esi
pas.711: jmp     LBB0_1
00414B56 EB0C             jmp $00414b64
pas.713: mov     edx, dword ptr [ebp]
00414B58 8B5500           mov edx,[ebp+$00]
pas.714: add     ebp, 4
00414B5B 83C504           add ebp,$04
pas.715: dec     ebx
00414B5E 4B               dec ebx
pas.716: mov     dword ptr [edi], edx
00414B5F 8917             mov [edi],edx
pas.717: add     edi, 4
00414B61 83C704           add edi,$04
pas.719: test    ebx, ebx
00414B64 85DB             test ebx,ebx
pas.720: jne     LBB0_2
00414B66 75F0             jnz $00414b58
pas.721: mov     edx, dword ptr [esp + 24]
00414B68 8B542418         mov edx,[esp+$18]
pas.722: and     eax, 3
00414B6C 83E003           and eax,$03
pas.723: lea     edx, [edx + 4*esi]
00414B6F 8D14B2           lea edx,[edx+esi*4]
pas.724: jmp     LBB0_4
00414B72 EB07             jmp $00414b7b
pas.726: mov     bl, byte ptr [edx]
00414B74 8A1A             mov bl,[edx]
pas.727: inc     edx
00414B76 42               inc edx
pas.728: dec     eax
00414B77 48               dec eax
pas.729: mov     byte ptr [ecx], bl
00414B78 8819             mov [ecx],bl
pas.730: inc     ecx
00414B7A 41               inc ecx
pas.732: test    eax, eax
00414B7B 85C0             test eax,eax
pas.733: jne     LBB0_5
00414B7D 75F5             jnz $00414b74
pas.734: pop     esi
00414B7F 5E               pop esi
pas.735: pop     edi
00414B80 5F               pop edi
pas.736: pop     ebx
00414B81 5B               pop ebx
pas.737: pop     ebp
00414B82 5D               pop ebp
pas.738: end;

...
Рейтинг: 0 / 0
inline корявo работает
    #39455807
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Вот код от Clang4 с SSE (-O3 -m32), у тебя же лишние опции.
Код: 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.
void __fastcall  strmove( void* __restrict__ Dest, void* __restrict__ Source, int len); // <-- correct declaration
strmove(void*, void*, int):                        # @strmove(void*, void*, int)
        push    ebp
        push    ebx
        push    edi
        push    esi
        sub     esp, 12
        mov     eax, dword ptr [esp + 32]
        mov     edi, eax
        shr     edi, 2
        je      .LBB0_12
        lea     esi, [ecx + 4*edi]
        lea     ebx, [edx + 4*edi]
        cmp     eax, 32
        mov     dword ptr [esp], esi    # 4-byte Spill
        jae     .LBB0_3
        mov     ebp, edx
        mov     edx, dword ptr [esp]    # 4-byte Reload
        jmp     .LBB0_8
.LBB0_3:
        mov     dword ptr [esp + 4], ebx # 4-byte Spill
        mov     ebx, edi
        and     ebx, 1073741816
        je      .LBB0_7
        lea     ebp, [edx + 4*ebx]
        lea     esi, [ecx + 4*ebx]
        add     ecx, 16
        add     edx, 16
        mov     dword ptr [esp + 8], ebx # 4-byte Spill
.LBB0_5:                                # =>This Inner Loop Header: Depth=1
        movups  xmm0, xmmword ptr [edx - 16]
        movups  xmm1, xmmword ptr [edx]
        add     edx, 32
        movups  xmmword ptr [ecx - 16], xmm0
        movups  xmmword ptr [ecx], xmm1
        add     ecx, 32
        add     ebx, -8
        jne     .LBB0_5
        mov     ecx, dword ptr [esp + 8] # 4-byte Reload
        mov     ebx, dword ptr [esp + 4] # 4-byte Reload
        mov     edx, dword ptr [esp]    # 4-byte Reload
        cmp     edi, ecx
        jne     .LBB0_9
        jmp     .LBB0_11
.LBB0_7:
        mov     ebp, edx
        mov     edx, dword ptr [esp]    # 4-byte Reload
        mov     ebx, dword ptr [esp + 4] # 4-byte Reload
.LBB0_8:
        mov     esi, ecx
        xor     ecx, ecx
.LBB0_9:
        sub     edi, ecx
.LBB0_10:                               # =>This Inner Loop Header: Depth=1
        mov     ecx, dword ptr [ebp]
        add     ebp, 4
        mov     dword ptr [esi], ecx
        add     esi, 4
        dec     edi
        jne     .LBB0_10
.LBB0_11:
        mov     ecx, edx
        mov     edx, ebx
.LBB0_12:
        and     eax, 3
        je      .LBB0_14
.LBB0_13:                               # =>This Inner Loop Header: Depth=1
        movzx   ebx, byte ptr [edx]
        inc     edx
        mov     byte ptr [ecx], bl
        inc     ecx
        dec     eax
        jne     .LBB0_13
.LBB0_14:
        add     esp, 12
        pop     esi
        pop     edi
        pop     ebx
        pop     ebp
        ret     4

Далее, еще надо правильно измерять и не забывать про погрешности измерений.
Ес-но XMM инструкции начнут работать, если у тебя > 32 байт данных.
QueryPerformanceCounter используй для высокой точности.

Ну и ошибка никуда не делась - если области перекрываются, может быть мусор, а не копия.

Дальше - инлайнить такие огромные функции - обычно невыгодно, используй fastcall - два параметра в регистрах ECX, EDX .
...
Рейтинг: 0 / 0
inline корявo работает
    #39455809
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сонный и сам - нарушил главное правило - не мешай оптимизатору =)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall  strmove( char* __restrict__ Dest, char* __restrict__ Source, int len)
{
    while(len-- > 0)
        *Dest++ = *Source++; // none of the objects modified through *p is the same
                     // as any of the objects read through *q
                     // compiler free to optimize, vectorize, page map, etc.
}


asm Clang4 -O3 -m32
Код: 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.
strmove(char*, char*, int):                        # @strmove(char*, char*, int)
        push    ebp
        push    ebx
        push    edi
        push    esi
        push    eax
        mov     eax, dword ptr [esp + 24]
        test    eax, eax
        jle     .LBB0_9
        mov     esi, eax
        mov     edi, -2
        not     esi
        cmp     esi, -3
        cmovg   edi, esi
        lea     ebx, [edi + eax + 2]
        cmp     ebx, 32
        jb      .LBB0_2
        mov     esi, ebx
        mov     ebp, ebx
        and     esi, -32
        and     ebp, -32
        je      .LBB0_2
        lea     edi, [edx + esi]
        sub     eax, esi
        add     esi, ecx
        add     ecx, 16
        add     edx, 16
        mov     dword ptr [esp], ebp    # 4-byte Spill
.LBB0_5:                                # =>This Inner Loop Header: Depth=1
        movups  xmm0, xmmword ptr [edx - 16]
        movups  xmm1, xmmword ptr [edx]
        add     edx, 32
        movups  xmmword ptr [ecx - 16], xmm0
        movups  xmmword ptr [ecx], xmm1
        add     ecx, 32
        add     ebp, -32
        jne     .LBB0_5
        cmp     ebx, dword ptr [esp]    # 4-byte Folded Reload
        jne     .LBB0_7
        jmp     .LBB0_9
.LBB0_2:
        mov     edi, edx
        mov     esi, ecx
.LBB0_7:
        inc     eax
.LBB0_8:                                # =>This Inner Loop Header: Depth=1
        movzx   ecx, byte ptr [edi]
        dec     eax
        inc     edi
        mov     byte ptr [esi], cl
        inc     esi
        cmp     eax, 1
        jg      .LBB0_8
.LBB0_9:
        add     esp, 4
        pop     esi
        pop     edi
        pop     ebx
        pop     ebp
        ret     4

...
Рейтинг: 0 / 0
inline корявo работает
    #39455821
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ради интереса, полное развертывание циклов с опциями
-O3 -m32 -mfpmath=sse -fno-builtin -march=haswell
...
Рейтинг: 0 / 0
inline корявo работает
    #39455826
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я вот краем уха где-то слышал, что в современных процессорах MOVSD (MOVSQ для 64 бит), работает с той же скоростью, что и все ваши хитропопые оптимизации... (Интересуют ли нас не совсем современные процессоры - вот в чём вопрос.)
...
Рейтинг: 0 / 0
inline корявo работает
    #39455842
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваш край уха немного запаздывает )

в приложенном листинге есть 128-битная movups, которая из древнего SSE

можно явно указать другую архитектуру, тогда используется vmovups -до 256 бит, поновее из AVX, но тоже весьма древняя
...
Рейтинг: 0 / 0
inline корявo работает
    #39455868
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

авторЭто говорит о том, что GCC медленнее Delphi ?

Странно как-то у тебя GCC собрал, да и в делфи ты какой-то странный код приводишь. Вод XE6 Для больших блоков:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@@LargeMove:
        JNG     @@LargeDone {Count < 0}
        CMP     EAX, EDX
        JA      @@LargeForwardMove
        SUB     EDX, ECX
        CMP     EAX, EDX
        LEA     EDX, [EDX+ECX]
        JNA     @@LargeForwardMove
        SUB     ECX, 8 {Backward Move}
        PUSH    ECX
        FILD    QWORD PTR [EAX+ECX] {Last 8}
        FILD    QWORD PTR [EAX] {First 8}
        ADD     ECX, EDX
        AND     ECX, -8 {8-Byte Align Writes}
        SUB     ECX, EDX
@BwdLoop:
        FILD    QWORD PTR [EAX+ECX]
        FISTP   QWORD PTR [EDX+ECX]
        SUB     ECX, 8
        JG      @BwdLoop
        POP     ECX
        FISTP   QWORD PTR [EDX] {First 8}
        FISTP   QWORD PTR [EDX+ECX] {Last 8}



По 8 байт (64 бита) переносит, элайн учитывает. Будет ли по 128 или 256 бит быстрее - вопрос спорный, с учетом 64х битности шины.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455915
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик
Может это Delphi ассемблер как - то коверкает.

Да, конечно. Меняет твои правильные команды на свои неправильные. Это заговор.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455916
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon Будет ли по 128 или 256 бит быстрее - вопрос спорный, с учетом 64х битности шины.

Какой шины ? И причем тут шина ?
...
Рейтинг: 0 / 0
inline корявo работает
    #39455940
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНяшик,

Вот код от Clang4 с SSE (-O3 -m32), у тебя же лишние опции.

Далее, еще надо правильно измерять и не забывать про погрешности измерений.
Ес-но XMM инструкции начнут работать, если у тебя > 32 байт данных.

Ну использовать XMM инструкции я не могу позволить себе - из за компилятора. Так что, опции далеко не лишние, особенно m32

SiemarglQueryPerformanceCounter используй для высокой точности.

Её и использую как раз - таки.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        if QueryPerformanceCounter(stopTime) then
        begin
          QueryPerformanceFrequency(iCounterPerSec);

          time := (0 - startTime + stopTime) / iCounterPerSec;

          SetLength(Output, 15);

          SetLength(Output, sprintf(PAnsiChar(Output), '%f сек.', time));

          Writeln(Output);
        end;




SiemarglНу и ошибка никуда не делась - если области перекрываются, может быть мусор, а не копия.

У меня такого не будет, так как код всегда находится в движении.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455945
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСонный и сам - нарушил главное правило - не мешай оптимизатору =)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall  strmove( char* __restrict__ Dest, char* __restrict__ Source, int len)
{
    while(len-- > 0)
        *Dest++ = *Source++; // none of the objects modified through *p is the same
                     // as any of the objects read through *q
                     // compiler free to optimize, vectorize, page map, etc.
}


asm Clang4 -O3 -m32
Код: 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.
strmove(char*, char*, int):                        # @strmove(char*, char*, int)
        push    ebp
        push    ebx
        push    edi
        push    esi
        push    eax
        mov     eax, dword ptr [esp + 24]
        test    eax, eax
        jle     .LBB0_9
        mov     esi, eax
        mov     edi, -2
        not     esi
        cmp     esi, -3
        cmovg   edi, esi
        lea     ebx, [edi + eax + 2]
        cmp     ebx, 32
        jb      .LBB0_2
        mov     esi, ebx
        mov     ebp, ebx
        and     esi, -32
        and     ebp, -32
        je      .LBB0_2
        lea     edi, [edx + esi]
        sub     eax, esi
        add     esi, ecx
        add     ecx, 16
        add     edx, 16
        mov     dword ptr [esp], ebp    # 4-byte Spill
.LBB0_5:                                # =>This Inner Loop Header: Depth=1
        movups  xmm0, xmmword ptr [edx - 16]
        movups  xmm1, xmmword ptr [edx]
        add     edx, 32
        movups  xmmword ptr [ecx - 16], xmm0
        movups  xmmword ptr [ecx], xmm1
        add     ecx, 32
        add     ebp, -32
        jne     .LBB0_5
        cmp     ebx, dword ptr [esp]    # 4-byte Folded Reload
        jne     .LBB0_7
        jmp     .LBB0_9
.LBB0_2:
        mov     edi, edx
        mov     esi, ecx
.LBB0_7:
        inc     eax
.LBB0_8:                                # =>This Inner Loop Header: Depth=1
        movzx   ecx, byte ptr [edi]
        dec     eax
        inc     edi
        mov     byte ptr [esi], cl
        inc     esi
        cmp     eax, 1
        jg      .LBB0_8
.LBB0_9:
        add     esp, 4
        pop     esi
        pop     edi
        pop     ebx
        pop     ebp
        ret     4



Данный код перемешает по 1 символу за такт, когда можно по 2 что влияет на скорость выполнение в N сек.
...
Рейтинг: 0 / 0
inline корявo работает
    #39455998
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикДанный код перемешает по 1 символу за такт, когда можно по 2 что влияет на скорость выполнение в N сек.
С какого перепуга?

Код: plaintext
1.
2.
        movups  xmm0, xmmword ptr [edx - 16]
        movups  xmm1, xmmword ptr [edx]



Сколько перемещают?
...
Рейтинг: 0 / 0
inline корявo работает
    #39456025
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНяшикДанный код перемешает по 1 символу за такт, когда можно по 2 что влияет на скорость выполнение в N сек.
С какого перепуга?

Код: plaintext
1.
2.
        movups  xmm0, xmmword ptr [edx - 16]
        movups  xmm1, xmmword ptr [edx]



Сколько перемещают?

И опять же эти инструкции которые мой 32 битный компилятор не скушает.

Хм.. И да, код на 0.000079 сек быстрее оказался, в отличии от Delphi кода (Delphi код так хорош? В своём 32 битном режиме)

Код: 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.
procedure MyMove(var source; var dest; len: Integer); stdcall;
label
  LBB0_1, LBB0_2;
asm
  push    ebx
  push    esi
  mov     eax, len
  test    eax, eax
  jle     LBB0_2
  mov     ecx, source
  mov     edx, dest
  inc     eax
  xor     esi, esi
  inc     esi
  LBB0_1:
  mov     bl, byte ptr [ecx]
  dec     eax
  inc     ecx
  mov     byte ptr [edx], bl
  inc     edx
  cmp     eax, esi
  jg      LBB0_1
  LBB0_2:
  pop     esi
  pop     ebx
end;




А тот же GCC 7.1 генерит вот такое .. По одному символу судя по погрешности в дохера..
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure MyMove(var source; var dest; len: Integer); stdcall;
label
  L1, L2;
asm
  xor     eax, eax
  push    ebx
  mov     edx,dest
  mov     ebx, source
  L2:
  mov     ecx, len
  sub     ecx, eax
  test    ecx, ecx
  jle     L1
  mov     cl, BYTE PTR [ebx+eax]
  mov     BYTE PTR [edx+eax], cl
  inc     eax
  jmp     L2
  L1:
  pop     ebx
end;

...
Рейтинг: 0 / 0
inline корявo работает
    #39456040
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикSiemarglпропущено...

С какого перепуга?

Код: plaintext
1.
2.
        movups  xmm0, xmmword ptr [edx - 16]
        movups  xmm1, xmmword ptr [edx]



Сколько перемещают?

И опять же эти инструкции которые мой 32 битный компилятор не скушает.
...

Это 32-битные инструкции. Если же встроенный в Д/Лазарь ассемблер их не знает, замени на FILD/FSTP как XE6 делает - это одинаково

опции для gcc 5/6/7 я уже писал
-O3 -m32 -mfpmath=sse -fno-builtin -march=ivybridge (marh по возможному для тебя выбору)
...
Рейтинг: 0 / 0
inline корявo работает
    #39456044
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с Nehalem, Интел заоптимизировал инструкцию REP MOVSx.

Реализующий ее микрокод использует сторадж максимально возможной длины, то есть обычный вызов REP MOVSD покажет производительность не уступающую SSE-инструкциям, по факту пересылая ГОРАЗДО больше четырех байт за такт (точное число зависит от архитектуры).
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / inline корявo работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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