powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / inline корявo работает
13 сообщений из 38, страница 2 из 2
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
13 сообщений из 38, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / inline корявo работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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