Re[3]: Как из этого выжать максимальную скорость?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 23.08.05 14:34
Оценка:
Здравствуйте, Andrew S, Вы писали:

A>>Для строки
data[l] = 99999;
можно попробовать заполнить несколько первых значений, а потом размножить с помощью memcpy.


AS>И каким образом movsd будет быстрее stosd?


Я всего-лишь предположил В исходном сообщении не было намеков ни на платформу, ни даже на typeof(data[l]).
Re[4]: Как из этого выжать максимальную скорость?
От: Andrew S Россия http://alchemy-lab.com
Дата: 23.08.05 14:39
Оценка:
A>>>Для строки
data[l] = 99999;
можно попробовать заполнить несколько первых значений, а потом размножить с помощью memcpy.


AS>>И каким образом movsd будет быстрее stosd?


A>Я всего-лишь предположил В исходном сообщении не было намеков ни на платформу, ни даже на typeof(data[l]).


Да ну?

http://www.rsdn.ru/Forum/Message.aspx?mid=1331229&only=1
Автор:
Дата: 17.08.05


В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[11]: Как из этого выжать максимальную скорость?
От: front242  
Дата: 23.08.05 18:09
Оценка:
я наверное чего-то не догоняю, объясните, пожалуйста, если не сложно

; 21   :     int data11[10000];
; 22   : 
; 23   :     int *b1, *e1;
; 24   :     for (b1 = data11, e1 = data11 + 10000;  b1 < e1; ++b1)

    lea    eax, DWORD PTR _data11$[ebp]
    mov    DWORD PTR _b1$[ebp], eax
    lea    ecx, DWORD PTR _data11$[ebp+40000]
    mov    DWORD PTR _e1$[ebp], ecx
    jmp    SHORT $L234
$L235:
    mov    edx, DWORD PTR _b1$[ebp]
    add    edx, 4
    mov    DWORD PTR _b1$[ebp], edx
$L234:
    mov    eax, DWORD PTR _b1$[ebp]
    cmp    eax, DWORD PTR _e1$[ebp]
    jae    SHORT $L236

; 25   :         *b1 = 99999;

    mov    ecx, DWORD PTR _b1$[ebp]
    mov    DWORD PTR [ecx], 99999            ; 0001869fH
    jmp    SHORT $L235
$L236:

; 26   : 
; 27   : }


14 команд против 11

; 30   :     int data11[10000];
; 31   :     int *p1 = data11+9999;

    lea    eax, DWORD PTR _data11$[ebp+39996]
    mov    DWORD PTR _p1$[ebp], eax
$L241:

; 34   :         *p1=99999;

    mov    ecx, DWORD PTR _p1$[ebp]
    mov    DWORD PTR [ecx], 99999            ; 0001869fH

; 35   :     }while(p1-- != data11);

    mov    edx, DWORD PTR _p1$[ebp]
    lea    eax, DWORD PTR _data11$[ebp]
    mov    ecx, DWORD PTR _p1$[ebp]
    sub    ecx, 4
    mov    DWORD PTR _p1$[ebp], ecx
    cmp    edx, eax
    jne    SHORT $L241

; 36   : }


а как правильный листинг сгенерить с
rep stosd
?
Re[12]: Как из этого выжать максимальную скорость?
От: Andrew S Россия http://alchemy-lab.com
Дата: 23.08.05 20:58
Оценка:
F>я наверное чего-то не догоняю, объясните, пожалуйста, если не сложно

F>а как правильный листинг сгенерить с

F>rep stosd
F>?

Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз.
Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию).
Вроде все
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[13]: Как из этого выжать максимальную скорость?
От: front242  
Дата: 26.08.05 12:54
Оценка:
Здравствуйте, Andrew S, Вы писали:

F>>я наверное чего-то не догоняю, объясните, пожалуйста, если не сложно


F>>а как правильный листинг сгенерить с

F>>rep stosd
F>>?

AS>Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз.

AS>Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию).
AS>Вроде все

Использую стандартную Visual C++ 6.0
оптимизация на скорость /O2
листинг в asm файлы, релиз.

; 21   :     int data11[10000];
; 22   : 
; 23   :     int *b1, *e1;
; 24   :     for (b1 = data11, e1 = data11 + 10000;  b1 < e1; ++b1)

    lea    eax, DWORD PTR _data11$[ebp]
    mov    DWORD PTR _b1$[ebp], eax
    lea    ecx, DWORD PTR _data11$[ebp+40000]
    mov    DWORD PTR _e1$[ebp], ecx
    jmp    SHORT $L234
$L235:
    mov    edx, DWORD PTR _b1$[ebp]
    add    edx, 4
    mov    DWORD PTR _b1$[ebp], edx
$L234:
    mov    eax, DWORD PTR _b1$[ebp]
    cmp    eax, DWORD PTR _e1$[ebp]
    jae    SHORT $L236

; 25   :         *b1 = 99999;

    mov    ecx, DWORD PTR _b1$[ebp]
    mov    DWORD PTR [ecx], 99999            ; 0001869fH
    jmp    SHORT $L235
$L236:

; 26   : 
; 27   : }


14 : 11

и только
Re[14]: Как из этого выжать максимальную скорость?
От: Andrew S Россия http://alchemy-lab.com
Дата: 26.08.05 13:24
Оценка:
AS>>Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз.
AS>>Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию).
AS>>Вроде все

F>Использую стандартную Visual C++ 6.0

F>оптимизация на скорость /O2

Сервис паки ставили? У меня 6-й. До этого еще процессор пак 5-й стоял, но вроде как 6-й сервис пак его убил.
Обманывать мне вас смысла нет — да и смысл, если VC6 генерит именно это, не сам же я такой код нарисовал
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Как из этого выжать максимальную скорость?
От: Erop Россия  
Дата: 30.08.05 06:32
Оценка:
Здравствуйте, Andrew S, Вы писали:


AS>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.


А кэш?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Как из этого выжать максимальную скорость?
От: gear nuke  
Дата: 30.08.05 07:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Andrew S, Вы писали:


AS>>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.


E>А кэш?


А он берёт данные из памяти, которая на порядок (!) медленнее. И на больших объёмах данных, память самое узкое место.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: Как из этого выжать максимальную скорость?
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 30.08.05 09:50
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Erop, Вы писали:


E>>Здравствуйте, Andrew S, Вы писали:


AS>>>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.


E>>А кэш?


GN>А он берёт данные из памяти, которая на порядок (!) медленнее. И на больших объёмах данных, память самое узкое место.


Если читать в последний раз записанный участок памяти, то наверное он будет в кэше. Я попробовал сравнить обычный цикл с таким копированием на i86. Результаты почти не отличаются. Пробовал копировать пачками по 4 и 8 интов. На спарке это метод заметно медленнее.
Re[15]: Как из этого выжать максимальную скорость?
От: front242  
Дата: 30.08.05 12:17
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз.

AS>>>Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию).
AS>>>Вроде все

F>>Использую стандартную Visual C++ 6.0

F>>оптимизация на скорость /O2

AS>Сервис паки ставили? У меня 6-й. До этого еще процессор пак 5-й стоял, но вроде как 6-й сервис пак его убил.

AS>Обманывать мне вас смысла нет — да и смысл, если VC6 генерит именно это, не сам же я такой код нарисовал

у меня стоит sp6

Вы не могли бы код всей функции привести, пожалуйста, ну типа

void test()
{
    int data1[10000];

    int *b1, *e1;
    for (b1 = data1, e1 = data1 + 10000;  b1 < e1; ++b1)
        *b1 = 99999;

}

; 7    : {

    push    ebp
    mov    ebp, esp
    mov    eax, 40008                ; 00009c48H
    call    __chkstk

; 8    :     int data1[10000];
; 9    : 
; 10   :     int *b1, *e1;
; 11   :     for (b1 = data1, e1 = data1 + 10000;  b1 < e1; ++b1)

    lea    eax, DWORD PTR _data1$[ebp]
    mov    DWORD PTR _b1$[ebp], eax
    lea    ecx, DWORD PTR _data1$[ebp+40000]
    mov    DWORD PTR _e1$[ebp], ecx
    jmp    SHORT $L582
$L583:
    mov    edx, DWORD PTR _b1$[ebp]
    add    edx, 4
    mov    DWORD PTR _b1$[ebp], edx
$L582:
    mov    eax, DWORD PTR _b1$[ebp]
    cmp    eax, DWORD PTR _e1$[ebp]
    jae    SHORT $L584

; 12   :         *b1 = 99999;

    mov    ecx, DWORD PTR _b1$[ebp]
    mov    DWORD PTR [ecx], 99999            ; 0001869fH
    jmp    SHORT $L583
$L584:

; 13   : 
; 14   : }
Re[16]: Как из этого выжать максимальную скорость?
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.08.05 12:45
Оценка:
F>Вы не могли бы код всей функции привести, пожалуйста

Вот:

void test()
{
    int data1[10000];
    for (int *b1 = data1, *e1 = data1 + 10000;  b1 < e1; ++b1)
        *b1 = 99999;
    printf("", data1);
}


?test@@YAXXZ PROC NEAR                    ; test, COMDAT

; 192  : {

    mov    eax, 40000                ; 00009c40H
    call    __chkstk
    push    edi

; 193  :     int data1[10000];
; 194  :     for (int *b1 = data1, *e1 = data1 + 10000;  b1 < e1; ++b1)
; 195  :         *b1 = 99999;

    mov    ecx, 10000                ; 00002710H
    mov    eax, 99999                ; 0001869fH
    lea    edi, DWORD PTR _data1$[esp+40004]
    rep stosd

; 196  :     printf("", data1);

    lea    eax, DWORD PTR _data1$[esp+40004]
    push    eax
    push    OFFSET FLAT:??_C@_00A@?$AA@        ; `string'
    call    DWORD PTR __imp__printf
    add    esp, 8
    pop    edi

; 197  : }

    add    esp, 40000                ; 00009c40H
    ret    0
?test@@YAXXZ ENDP                    ; test
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Как из этого выжать максимальную скорость?
От: gear nuke  
Дата: 30.08.05 15:02
Оценка:
Здравствуйте, alnsn

AS>>>>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.


E>>>А кэш?


GN>>А он берёт данные из памяти, которая на порядок (!) медленнее. И на больших объёмах данных, память самое узкое место.


A>Если читать в последний раз записанный участок памяти, то наверное он будет в кэше.

Верно, хотя зависит от метода записи в память. Для x86 cуществуют команды, пишущие в обход кеша (компиляторы С их обычно не гененрируют).

A>Я попробовал сравнить обычный цикл с таким копированием на i86. Результаты почти не отличаются. Пробовал копировать пачками по 4 и 8 интов.

Очень многое зависит от объёма копируемых данных. На больших объёмах можно получить выигрыш до 3х раз(пример, для P4 это не очень актуально, поскольку там rep movsd ускорена аппаратно).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Как из этого выжать максимальную скорость?
От: Vutik  
Дата: 18.10.05 13:03
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, arcman, Вы писали:


A>>>Здравствуйте, Аноним, Вы писали:



А>>>>
А>>>>    for(unsigned int l=0; l<size*size; l++)
А>>>>    {
А>>>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>>>        data[l] = 99999;        <--- ?
А>>>>    }
А>>>>

можно
std::copy + std::fill
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.