Re[2]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.10.20 11:34
Оценка:
Здравствуйте, σ, Вы писали:

S>>Мой доклад успешно прошёл. Запись я обещал не выкладывать до середины ноября, да и не особо там чего смотреть.

S>>Хочу поделиться самой зрелищной частью: сравнение производительности разных способов реализации вычислительно-интенсивного кода.

σ>Самый главный вопрос: результаты работы фильтров сравнивались друг с другом попиксельно? Для фильтров с не только целочисленной арифметикой (для исключительно целочисленной разницы не должно быть).

Да, кроме С++. Весь C# код проверялся в Linq2d.Tests на полное соответствие результатов для разных способов вычисления.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Производительность .Net на вычислительных задачах
От: Sheridan Россия  
Дата: 22.10.20 12:02
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>А есть инструкция по использованию cmake с VS2019 на проектах C#/C++?

Под рукой нету
Matrix has you...
Re: Производительность .Net на вычислительных задачах
От: AeroSun  
Дата: 22.10.20 13:22
Оценка: +5
В тему не вникал, но все холивары о том, что *ЛюбойЯзык* производительнее С++ (даже с тестами и красивыми графиками) всегда разбиваются о два вопроса:
1) За счёт чего они быстрее С++?
2) Почему это не является достижимым на С++?
Re[2]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.10.20 17:31
Оценка: +2
Здравствуйте, AeroSun, Вы писали:

AS>В тему не вникал, но все холивары о том, что *ЛюбойЯзык* производительнее С++ (даже с тестами и красивыми графиками) всегда разбиваются о два вопроса:

AS>1) За счёт чего они быстрее С++?
За счёт использования более высокоуровневых конструкций. Компилятор С++ вынужден намерения программиста угадывать; реализация более высокого уровня их точно знает.
AS>2) Почему это не является достижимым на С++?
Смотря что "это", и что мы считаем "достижимым на С++". Понятно, что можно на С++ написать дотнет, на дотнете — linq2d, на linq2d — эффективный фильтр.
А можно напилить на том же С++ рукопашный фильтр на интринсиках, раздуть код в разы, иметь риск деградации на неродной архитектуре.
Можно напилить (или скомпилировать) код под все нужные архитектуры, сделать выбор подключаемой библиотеки в рантайме.
Много чего можно сделать — вопрос в цене.
Хочется-то иметь компактный, понятный, легко отлаживаемый пользовательский код. А уж разворачиванием его в килобайты бинаря под конкретную архитектуру пусть занимается тупая машина.
Может быть, и на С++ тоже можно написать какой-то подобный аналог. Увы, в плюсах я ещё меньший эксперт, чем в дотнете. Так что с уверенностью судить не могу.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Производительность .Net на вычислительных задачах
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.10.20 18:13
Оценка: +2
Здравствуйте, AeroSun, Вы писали:

AS>В тему не вникал, но все холивары о том, что *ЛюбойЯзык* производительнее С++ (даже с тестами и красивыми графиками) всегда разбиваются о два вопроса:

AS>1) За счёт чего они быстрее С++?
AS>2) Почему это не является достижимым на С++?

1. Все зависит от компилятора.
2. Сборщик мусора и стратегия кэширования
3. Более высокоуровневый код упрощает кодирование, отладку и в итоге оптимизацию кода.

Да можно под определенный процессор написать на том же С с ассемблерными вставками оптимальный код.
Но в большинстве случаев на вылизывание кода в большинстве случаев плюют.
И в итоге более высокоуровневый код может быть быстрее С++ на шаблонах с инлайнами и прочими оптимизациями.
Сейчас в .Net есть .Net Native, развивается CoreRT совершенствуются алгоритмы

https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/

Думал, что 3.1 это потолок, но и в .Net 5 нехило докрутили

Ну и для ARM64
https://devblogs.microsoft.com/dotnet/arm64-performance-in-net-5/

В итоге многое зависит от используемых библиотек
и солнце б утром не вставало, когда бы не было меня
Re[4]: Производительность .Net на вычислительных задачах
От: a_g_99 США http://www.hooli.xyz/
Дата: 22.10.20 20:14
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Ну это грубо, по моему мнению


но правда.

вообще идея говорения что си щарп, пхп, вижуал бэсик и тп быстрее С++ это как то с душком не правда ли? Отдает какой то граничащей с безумием продажностью. Или клиническим идиотизмом

а вы хотите немного помолчать в сторонке ради политкорректности? как то трусовато выглядит
Re[5]: Производительность .Net на вычислительных задачах
От: IID Россия  
Дата: 22.10.20 20:43
Оценка:
Здравствуйте, a_g_99, Вы писали:

__>Здравствуйте, kaa.python, Вы писали:


KP>>Ну это грубо, по моему мнению


__>но правда.


__>вообще идея говорения что си щарп, пхп, вижуал бэсик и тп быстрее С++ это как то с душком не правда ли? Отдает какой то граничащей с безумием продажностью. Или клиническим идиотизмом


__>а вы хотите немного помолчать в сторонке ради политкорректности? как то трусовато выглядит


опять сравнивани скорость выделения памяти походу. Дефолтняй аллокатор плюсов против читерского в дотнете aka "память не ресурс", жрать как не в себя, зато аллокация одним инкрементом.
kalsarikännit
Re[5]: Производительность .Net на вычислительных задачах
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.10.20 01:23
Оценка: +1
Здравствуйте, a_g_99, Вы писали:

__>вообще идея говорения что си щарп, пхп, вижуал бэсик и тп быстрее С++ это как то с душком не правда ли? Отдает какой то граничащей с безумием продажностью. Или клиническим идиотизмом


Почему с душком? Я не согласен с таким утверждением. Наивного C++, как в примере из презентации, в реальных проектах в изобилии. Причем его и отлаживать и поддерживать тяжело не только потому что он более запутанный, но еще и на порядок объемнее. Ну а если аналогичный функционал, который работает с такой же скоростью как наивная C++ реализация, можно получить написав всего 5 строк на C#, это разве не подтверждение преимущества этого самого C# как платформы?

Поэтому я скорее считаю что презентация не полная. В презентации хотелось бы видеть оптимизированную C++ версию как иллюстрацию того, что ощутимо обогнать Linq2q вполне можно, но это сильно не бесплатно ни с точки зрения сильно возрастающих требований к самим разработчикам, ни с точки зрения дальнейшей поддержки полученного решения.
Re[6]: Производительность .Net на вычислительных задачах
От: CreatorCray  
Дата: 23.10.20 02:41
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>но это сильно не бесплатно ни с точки зрения сильно возрастающих требований к самим разработчикам

Ну дык с оптимизацией производительности всегда так — каждая срезанная секунда даётся всё дороже.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[7]: Производительность .Net на вычислительных задачах
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.10.20 03:33
Оценка: 2 (1) +2
Здравствуйте, CreatorCray, Вы писали:

KP>>но это сильно не бесплатно ни с точки зрения сильно возрастающих требований к самим разработчикам

CC>Ну дык с оптимизацией производительности всегда так — каждая срезанная секунда даётся всё дороже.

Мне кажется, ты упускаешь суть того, о чем я говорю. Высокий уровень оптимизации вообще мало где нужен, а разработчиков которые пишут наивный C++ код очень много. Это значит что обычно ты будешь как раз иметь наивный код, который поддерживать тяжело и дорого. А так как можно получить тоже самое по производительности с более высокоуровневым инструментом, т.е. в 3 строки, то и не нужно. Будет реально недостаточного того, что выдает Linq2q — ну перепишут на C++, хотя скорее просто на GPU переложат да сделают пакетную обработку
Re[8]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.20 05:26
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>И еще Релиз х86-64 надо ставить.
Поставил — на перформанс не повлияло.
Буду благодарен, если кто-то более опытный посмотрит и убедится, что собирается именно с AVX2.
https://github.com/evilguest/linq2d/tree/master/SauvolaBinarizeCPP
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.20 05:35
Оценка:
Здравствуйте, Sinclair, Вы писали:
Перебилдил таки под gcc с -march=native, MSVC — c EnableEnhancedInstructionSet= AdvancedVectorExtensions2. Результат бенчмарков не изменился.
Прикручиваю тесты, посмотрим, может удастся разогнать С++ при помощи улучшения исходников.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Производительность .Net на вычислительных задачах
От: LaptevVV Россия  
Дата: 23.10.20 07:03
Оценка: 2 (1)
LVV>>И еще Релиз х86-64 надо ставить.
S>Поставил — на перформанс не повлияло.
S>Буду благодарен, если кто-то более опытный посмотрит и убедится, что собирается именно с AVX2.
S>https://github.com/evilguest/linq2d/tree/master/SauvolaBinarizeCPP
Смотреть: Свойства проекта -> C++ -> выходные файлы -> Файл ассемблерного кода
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[10]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.20 08:02
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>>>И еще Релиз х86-64 надо ставить.

S>>Поставил — на перформанс не повлияло.
S>>Буду благодарен, если кто-то более опытный посмотрит и убедится, что собирается именно с AVX2.
S>>https://github.com/evilguest/linq2d/tree/master/SauvolaBinarizeCPP
LVV>Смотреть: Свойства проекта -> C++ -> выходные файлы -> Файл ассемблерного кода
Посмотрел.
Забавно. Для sauvola он смог векторизовать хоть что-то, хотя пока разобраться тяжело. Похоже, всё же вытащил SSE2.
C4, который явно более простой, он почему-то не потянул:

  С4
; Function compile flags: /Ogtpy
; File C:\Users\azlygostev.SWSOFT\Source\Repos\FilterTests\SauvolaBinarizeCPP\SauvolaBinarizeCPP.cpp
;    COMDAT c4filter
_TEXT    SEGMENT
tv3282 = 0
tv3291 = 8
tv3295 = 16
tv3296 = 24
tv3294 = 32
tv3292 = 40
tv3290 = 48
h$ = 128
w$ = 136
i$1$ = 144
input$ = 144
output$ = 152
c4filter PROC                        ; COMDAT

; 82   : {

$LN34:
    mov    QWORD PTR [rsp+32], r9
    mov    DWORD PTR [rsp+8], ecx
    push    rbx
    push    rsi
    push    r14
    sub    rsp, 96                    ; 00000060H
    movsxd    r14, edx
    mov    rsi, r9
    mov    r10, r8
    mov    ebx, ecx

; 83   :     if (input == NULL)

    test    r8, r8
    jne    SHORT $LN14@c4filter

; 84   :         return -1; // error: no input

    lea    eax, QWORD PTR [r8-1]

; 104  : }

    add    rsp, 96                    ; 00000060H
    pop    r14
    pop    rsi
    pop    rbx
    ret    0
$LN14@c4filter:

; 85   :     if (output == NULL)

    test    rsi, rsi
    jne    SHORT $LN15@c4filter

; 86   :         return -2; // error: no output

    lea    eax, QWORD PTR [rsi-2]

; 104  : }

    add    rsp, 96                    ; 00000060H
    pop    r14
    pop    rsi
    pop    rbx
    ret    0
$LN15@c4filter:

; 87   :     output[0] = (2 * (int)input[0] + (int)input[1] + (int)input[w]) / 4;

    movsx    ecx, BYTE PTR [r8]
    movsx    eax, BYTE PTR [r8+1]
    mov    QWORD PTR [rsp+136], rbp

; 88   :     for (int j = 1; j < w - 1;j++)

    lea    rbp, QWORD PTR [r14-1]
    mov    QWORD PTR [rsp+88], rdi
    mov    QWORD PTR [rsp+80], r12
    lea    eax, DWORD PTR [rax+rcx*2]
    mov    QWORD PTR [rsp+72], r13
    movsx    ecx, BYTE PTR [r14+r8]
    add    eax, ecx
    mov    QWORD PTR [rsp+64], r15
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2
    mov    DWORD PTR [r9], eax
    cmp    rbp, 1
    jle    SHORT $LN3@c4filter
    add    r9, 4
    mov    r11, r10
    add    r8, 2
    not    r11
    npad    14
$LL4@c4filter:

; 89   :         output[j] = ((int)input[j - 1] + (int)input[j] + (int)input[j + 1] + (int)input[j + w]) / 4;

    movsx    ecx, BYTE PTR [r8-2]
    lea    rax, QWORD PTR [r14+r8]
    add    rax, r11
    lea    r8, QWORD PTR [r8+1]
    lea    r9, QWORD PTR [r9+4]
    movsx    eax, BYTE PTR [rax+r10]
    add    eax, ecx
    movsx    ecx, BYTE PTR [r8-2]
    add    eax, ecx
    movsx    ecx, BYTE PTR [r8-1]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2
    mov    DWORD PTR [r9-4], eax
    lea    rax, QWORD PTR [r8+r11]
    cmp    rax, rbp
    jl    SHORT $LL4@c4filter
$LN3@c4filter:

; 90   :     output[w - 1] = (2 * (int)input[w - 1] + (int)input[w - 2] + (int)input[w + w - 1]) / 4;

    movsx    ecx, BYTE PTR [r10+rbp]
    lea    r13d, DWORD PTR [r14+r14]
    mov    r11d, 1
    movsxd    r9, r13d
    mov    DWORD PTR i$1$[rsp], r11d
    movsx    eax, BYTE PTR [r9+r10-1]
    lea    eax, DWORD PTR [rax+rcx*2]
    movsx    ecx, BYTE PTR [r14+r10-2]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2

; 91   :     for (int i = 1; i < h - 1; i++)

    dec    ebx
    mov    DWORD PTR [rsi+rbp*4], eax
    mov    DWORD PTR tv3282[rsp], ebx
    cmp    ebx, r11d
    jle    $LN6@c4filter

; 90   :     output[w - 1] = (2 * (int)input[w - 1] + (int)input[w - 2] + (int)input[w + w - 1]) / 4;

    lea    rax, QWORD PTR [r14*4]
    mov    edx, 2
    lea    rdi, QWORD PTR [rsi+4]
    sub    rdx, r9
    add    rdi, rax
    mov    QWORD PTR tv3294[rsp], rdx
    mov    rax, r9
    lea    r8, QWORD PTR [r10-2]
    sub    rax, r14
    inc    r13d
    add    r8, r9
    lea    rax, QWORD PTR [rax*4-8]
    mov    QWORD PTR tv3296[rsp], rax
    lea    eax, DWORD PTR [r14+r14*2]
    cdqe
    sub    rax, r9
    inc    rax
    mov    QWORD PTR tv3295[rsp], rax
    mov    rax, r14
    sub    rax, r9
    lea    rcx, QWORD PTR [rax+3]
    lea    rsi, QWORD PTR [rax+4]
    mov    QWORD PTR tv3292[rsp], rcx
    add    rax, 2
    mov    QWORD PTR tv3291[rsp], rsi
    mov    QWORD PTR tv3290[rsp], rax
    npad    1
$LL7@c4filter:

; 92   :     {
; 93   :         output[i * w] = ((int)input[i * w] + (int)input[(i - 1) * w] + (int)input[i * w + 1] + (int)input[(i + 1) * w]) / 4;

    movsx    eax, BYTE PTR [rax+r8]
    movsx    ecx, BYTE PTR [rcx+r8]
    add    eax, ecx
    movsx    ecx, BYTE PTR [rdx+r8]
    add    eax, ecx
    movsx    ecx, BYTE PTR [r8+2]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2
    mov    DWORD PTR [rdi-4], eax

; 94   :         for (int j = 1; j < w - 1; j++)

    cmp    rbp, 1
    jle    SHORT $LN9@c4filter

; 95   :             output[i * w + j] = ((int)input[(i - 1) * w + j] + (int)input[(i + 1) * w + j] + (int)input[i * w + (j - 1)] + (int)input[i * w + (j + 1)]) / 4;

    mov    eax, r14d
    lea    r11, QWORD PTR [rsi+r8]
    neg    eax
    lea    rsi, QWORD PTR [rbp-1]
    mov    r9d, r13d
    mov    rbx, rdi
    lea    r15d, DWORD PTR [rax+rax]
    npad    13
$LL10@c4filter:
    lea    eax, DWORD PTR [r15+r9]
    movsxd    rcx, eax
    lea    rbx, QWORD PTR [rbx+4]
    lea    r11, QWORD PTR [r11+1]
    movsx    eax, BYTE PTR [rcx+r10]
    movsxd    rcx, r9d
    inc    r9d
    movsx    edx, BYTE PTR [rcx+r10]
    movsx    ecx, BYTE PTR [r11-3]
    add    eax, edx
    add    eax, ecx
    movsx    ecx, BYTE PTR [r11-1]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2
    mov    DWORD PTR [rbx-4], eax
    sub    rsi, 1
    jne    SHORT $LL10@c4filter
    mov    r11d, DWORD PTR i$1$[rsp]
    mov    ebx, DWORD PTR tv3282[rsp]
    mov    rsi, QWORD PTR tv3291[rsp]
$LN9@c4filter:

; 96   :         output[i*w + w - 1] = (2 * (int)input[i * w + w - 1] + (int)input[i * w + w - 2] + (int)input[(i + 2)*w - 1]) / 4;

    mov    rax, QWORD PTR tv3295[rsp]
    inc    r11d
    add    r13d, r14d
    mov    DWORD PTR i$1$[rsp], r11d
    movsx    ecx, BYTE PTR [rax+r8]
    movsx    eax, BYTE PTR [r8+1]
    lea    eax, DWORD PTR [rcx+rax*2]
    movsx    ecx, BYTE PTR [r8]
    add    eax, ecx
    add    r8, r14
    mov    rcx, QWORD PTR tv3296[rsp]
    cdq
    and    edx, 3
    add    eax, edx
    mov    rdx, QWORD PTR tv3294[rsp]
    sar    eax, 2
    mov    DWORD PTR [rcx+rdi], eax
    lea    rax, QWORD PTR [r14*4]
    mov    rcx, QWORD PTR tv3292[rsp]
    add    rdi, rax
    mov    rax, QWORD PTR tv3290[rsp]
    cmp    r11d, ebx
    jl    $LL7@c4filter
    mov    rsi, QWORD PTR output$[rsp]
$LN6@c4filter:

; 97   :     }
; 98   :     output[(h - 1) * w] = (2 * (int)input[(h - 1) * w] + (int)input[(h - 1) * w + 1] + (int)input[h * w]) / 4;

    mov    r11d, DWORD PTR h$[rsp]
    mov    eax, r11d

; 99   :     for (int j = 1; j < w - 1;j++)

    mov    r13, QWORD PTR [rsp+72]
    mov    r12, QWORD PTR [rsp+80]
    mov    rbp, QWORD PTR [rsp+136]
    imul    eax, r14d
    imul    ebx, r14d
    movsxd    r15, eax
    movsxd    r8, ebx
    movsx    ecx, BYTE PTR [r8+r10]
    lea    rdi, QWORD PTR [r8+r10]
    movsx    eax, BYTE PTR [rdi+1]
    lea    eax, DWORD PTR [rax+rcx*2]
    movsx    ecx, BYTE PTR [r15+r10]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    lea    edx, DWORD PTR [r14-1]
    sar    eax, 2
    mov    DWORD PTR [rsi+r8*4], eax
    cmp    edx, 1
    jle    SHORT $LN12@c4filter

; 97   :     }
; 98   :     output[(h - 1) * w] = (2 * (int)input[(h - 1) * w] + (int)input[(h - 1) * w + 1] + (int)input[h * w]) / 4;

    movsxd    rcx, ebx
    lea    eax, DWORD PTR [r11-2]
    inc    rcx
    imul    eax, r14d
    lea    r8, QWORD PTR [r10+1]
    add    r8, rcx
    lea    r11d, DWORD PTR [rdx-1]
    lea    r9, QWORD PTR [rsi+rcx*4]
    movsxd    rbx, eax
    sub    rbx, rcx
$LL13@c4filter:

; 100  :         output[(h - 1) * w + j] = ((int)input[(h - 1) * w + j - 1] + (int)input[(h - 1) * w + j] + (int)input[(h - 1) * w + j + 1] + (int)input[(h-2) * w + j]) / 4;

    movsx    ecx, BYTE PTR [r8-2]
    lea    r9, QWORD PTR [r9+4]
    movsx    eax, BYTE PTR [rbx+r8]
    lea    r8, QWORD PTR [r8+1]
    add    eax, ecx
    movsx    ecx, BYTE PTR [r8-2]
    add    eax, ecx
    movsx    ecx, BYTE PTR [r8-1]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2
    mov    DWORD PTR [r9-4], eax
    sub    r11, 1
    jne    SHORT $LL13@c4filter
$LN12@c4filter:

; 101  :     output[h * w - 1] = (2 * (int)input[h * w - 1] + (int)input[h * w - 2] + (int)input[h * w - w - 1]) / 4;

    movsx    ecx, BYTE PTR [r15+r10-1]
    movsx    eax, BYTE PTR [r15+r10-2]
    lea    eax, DWORD PTR [rax+rcx*2]
    movsx    ecx, BYTE PTR [rdi-1]

; 102  : 
; 103  :     return 0;

    mov    rdi, QWORD PTR [rsp+88]
    add    eax, ecx
    cdq
    and    edx, 3
    add    eax, edx
    sar    eax, 2
    mov    DWORD PTR [rsi+r15*4-4], eax
    xor    eax, eax
    mov    r15, QWORD PTR [rsp+64]

; 104  : }

    add    rsp, 96                    ; 00000060H
    pop    r14
    pop    rsi
    pop    rbx
    ret    0
c4filter ENDP
_TEXT    ENDS
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: Производительность .Net на вычислительных задачах
От: CreatorCray  
Дата: 23.10.20 08:18
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Забавно. Для sauvola он смог векторизовать хоть что-то, хотя пока разобраться тяжело. Похоже, всё же вытащил SSE2.

Из того что я видел в SauvolaBinarizeCPP что выкладывали раньше ICC на https://godbolt.org/ нагенерил кусков типа:

    movq      xmm5, QWORD PTR [2+rax+r8]                    #87.47
    movq      xmm9, QWORD PTR [rax+r8]                      #87.47
    movdqa    xmm0, xmm5                                    #87.63
    movq      xmm6, QWORD PTR [1+rax+r12]                   #87.83
    movdqa    xmm4, xmm9                                    #87.27
    punpcklbw xmm4, xmm9                                    #87.27
    movdqa    xmm1, xmm6                                    #87.83
    psrldq    xmm9, 4                                       #87.27
    punpcklbw xmm0, xmm5                                    #87.63
    psrldq    xmm5, 4                                       #87.63
    movq      xmm8, QWORD PTR [1+rax+r8]                    #87.47
    punpcklbw xmm9, xmm9                                    #87.27
    movdqa    xmm3, xmm8                                    #87.47
    punpcklbw xmm5, xmm5                                    #87.63
    punpcklbw xmm1, xmm6                                    #87.83
    psrldq    xmm6, 4                                       #87.83
    punpcklbw xmm6, xmm6                                    #87.83
    punpcklwd xmm4, xmm4                                    #87.27
    punpcklwd xmm0, xmm0                                    #87.63
    psrad     xmm4, 24                                      #87.27
    punpcklwd xmm9, xmm9                                    #87.27
    psrad     xmm0, 24                                      #87.63
    punpcklwd xmm5, xmm5                                    #87.63
    psrad     xmm9, 24                                      #87.27
    punpcklbw xmm3, xmm8                                    #87.47
    psrad     xmm5, 24                                      #87.63
    psrldq    xmm8, 4                                       #87.47
    paddd     xmm4, xmm0                                    #87.99
    punpcklwd xmm1, xmm1                                    #87.83
    paddd     xmm9, xmm5                                    #87.47
    punpcklwd xmm6, xmm6                                    #87.83
    psrad     xmm1, 24                                      #87.83
    punpcklbw xmm8, xmm8                                    #87.47
    psrad     xmm6, 24                                      #87.83
    punpcklwd xmm3, xmm3                                    #87.47
    paddd     xmm4, xmm1                                    #87.63
    punpcklwd xmm8, xmm8                                    #87.47
    paddd     xmm9, xmm6                                    #87.47
    psrad     xmm3, 24                                      #87.47
    psrad     xmm8, 24                                      #87.47
    movdqa    xmm2, xmm4                                    #87.83
    movdqa    xmm7, xmm9                                    #87.83
    paddd     xmm2, xmm3                                    #87.83
    paddd     xmm7, xmm8                                    #87.83
    psrad     xmm2, 1                                       #87.99
    psrad     xmm7, 1                                       #87.99
    psrld     xmm2, 30                                      #87.99
    psrld     xmm7, 30                                      #87.99
    paddd     xmm4, xmm2                                    #87.63
    paddd     xmm9, xmm7                                    #87.63
    paddd     xmm4, xmm3                                    #87.83
    paddd     xmm9, xmm8                                    #87.83
    psrad     xmm4, 2                                       #87.99
    psrad     xmm9, 2                                       #87.99
    movdqu    XMMWORD PTR [4+rbx+rax*4], xmm4               #87.9
    movdqu    XMMWORD PTR [20+rbx+rax*4], xmm9              #87.9
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[12]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.20 09:16
Оценка:
Здравствуйте, CreatorCray, Вы писали:

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

CC>Из того что я видел в SauvolaBinarizeCPP что выкладывали раньше ICC на https://godbolt.org/ нагенерил кусков типа:
Ну, вот это — как раз SSE2, не AVX2. Был бы AVX2 — были бы ymmX регистры.
Вообще, там у меня в С++ коде — три разных трансформации.
Та, которую ты показываешь, это, судя по всему, вычисление интегралов. Linq2d его вообще не может векторизовать, потому что там есть "наложение". То есть когда мы вычисляем 8й элемент строки, ему нужен 7й элемент строки. В скалярном варианте это no brainer: ну, взял r[i, j-1] да и прибавил.
А в векторном-то у меня при вычислении, скажем, 16го элемента (с индексом 15) доступны только элементы с 0 по 7, а в индексе 14 лежит ноль. То есть я не могу просто загрузить вектор элементов результата с 7 по 14 и прибавить его к вектору исходных данных с 8 по 15.

Но вообще надо, наверное, распилить код на три файла, чтобы было легче сопоставлять их.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: Производительность .Net на вычислительных задачах
От: CreatorCray  
Дата: 23.10.20 10:12
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ну, вот это — как раз SSE2, не AVX2. Был бы AVX2 — были бы ymmX регистры.

Ну я сунул туда -QxHost, т.е. компилер компилит под ту машину, на которой запущен. Хз что там, может старьё какое. Я не помню какой ключ для AVX2 а гуглить лень.
Потом если компилер не считает что от AVX2 там будет хорошо он и не будет эти инструкции генерить, оно как то там само выбирает во что код можно разложить.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[14]: Производительность .Net на вычислительных задачах
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.20 12:11
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:
S>>Ну, вот это — как раз SSE2, не AVX2. Был бы AVX2 — были бы ymmX регистры.
CC>Ну я сунул туда -QxHost, т.е. компилер компилит под ту машину, на которой запущен. Хз что там, может старьё какое. Я не помню какой ключ для AVX2 а гуглить лень.
CC>Потом если компилер не считает что от AVX2 там будет хорошо он и не будет эти инструкции генерить, оно как то там само выбирает во что код можно разложить.
Ну, критерий истины — замеры. Ща прикручу тесты, можно будет развлекаться переписыванием кода, и заменами компиляторов.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Производительность .Net на вычислительных задачах
От: a_g_99 США http://www.hooli.xyz/
Дата: 23.10.20 14:14
Оценка: :)
Здравствуйте, IID, Вы писали:

IID>опять сравнивани скорость выделения памяти походу. Дефолтняй аллокатор плюсов против читерского в дотнете aka "память не ресурс", жрать как не в себя, зато аллокация одним инкрементом.

аллокация одним инкрементом не делает эту платформу быстрой. это не про методы а про то как индузы это сделали (очень криво и медленно)
Re[6]: Производительность .Net на вычислительных задачах
От: a_g_99 США http://www.hooli.xyz/
Дата: 23.10.20 15:05
Оценка: :))) :)
Здравствуйте, kaa.python, Вы писали:

KP>Почему с душком? Я не согласен с таким утверждением. Наивного C++, как в примере из презентации, в реальных проектах в изобилии. Причем его и отлаживать и поддерживать тяжело не только потому что он более запутанный, но еще и на порядок объемнее. Ну а если аналогичный функционал, который работает с такой же скоростью как наивная C++ реализация, можно получить написав всего 5 строк на C#, это разве не подтверждение преимущества этого самого C# как платформы?

KP>Поэтому я скорее считаю что презентация не полная. В презентации хотелось бы видеть оптимизированную C++ версию как иллюстрацию того, что ощутимо обогнать Linq2q вполне можно, но это сильно не бесплатно ни с точки зрения сильно возрастающих требований к самим разработчикам, ни с точки зрения дальнейшей поддержки полученного решения.

ну так что же вы тогда не пишите на этом си щарпе. просветите меня. все же хорошо — тяп ляп 5 строчек и С++ на коленях стоит
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.