Вызовы Native под Linux - в чём подвох?
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.10.20 04:16
Оценка:
Всем привет.
Вчера наконец заборол кросс-платформенную сборку для бенчмарков linq2d.
Получил какие-то удивительные результаты.
Вкратце, что происходит: я вызываю пару функций из нативной .dll/.so через интероп.
На винде dll собирается MS VC.
На linux so собирается g++.

Замеряем быстродействие там и там — получаем, что плюсовый код на винде чуточку быстрее аналогичного unsafe-кода на дотнете:
Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
|              CppC4 |  InProcess | InProcessEmitToolchain | p00743.bmp | 125.56 ms | 1.562 ms | 1.385 ms |  0.87 |    0.02 |
|           UnsafeC4 |  InProcess | InProcessEmitToolchain | p00743.bmp | 144.90 ms | 2.675 ms | 2.502 ms |  1.00 |    0.00 |
|          NaturalC4 |  InProcess | InProcessEmitToolchain | p00743.bmp | 284.03 ms | 3.851 ms | 3.006 ms |  1.96 |    0.03 |

На линуксе получаем какой-то сюр:
Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
|             Method |   FileName |      Mean |    Error |   StdDev | Ratio | RatioSD |
|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
|              CppC4 | p00743.bmp | 330.92 ms | 1.103 ms | 0.921 ms |  2.73 |    0.03 |
|          NaturalC4 | p00743.bmp | 318.12 ms | 1.053 ms | 0.822 ms |  2.62 |    0.03 |
|           UnsafeC4 | p00743.bmp | 121.07 ms | 1.679 ms | 1.571 ms |  1.00 |    0.00 |

Это там интероп такой дорогой, или это я не сумел включить релизную конфигурацию сборки для g++?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Вызовы Native под Linux - в чём подвох?
От: VladCore  
Дата: 05.10.20 17:46
Оценка: 80 (1)
Здравствуйте, Sinclair, Вы писали:

S>Всем привет.

S>Вчера наконец заборол кросс-платформенную сборку для бенчмарков linq2d.
S>Получил какие-то удивительные результаты.
S>Вкратце, что происходит: я вызываю пару функций из нативной .dll/.so через интероп.
S>На винде dll собирается MS VC.
S>На linux so собирается g++.

S>Замеряем быстродействие там и там — получаем, что плюсовый код на винде чуточку быстрее аналогичного unsafe-кода на дотнете:

S>
S>Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
S>|              CppC4 |  InProcess | InProcessEmitToolchain | p00743.bmp | 125.56 ms | 1.562 ms | 1.385 ms |  0.87 |    0.02 |
S>|           UnsafeC4 |  InProcess | InProcessEmitToolchain | p00743.bmp | 144.90 ms | 2.675 ms | 2.502 ms |  1.00 |    0.00 |
S>|          NaturalC4 |  InProcess | InProcessEmitToolchain | p00743.bmp | 284.03 ms | 3.851 ms | 3.006 ms |  1.96 |    0.03 |
S>

S>На линуксе получаем какой-то сюр:
S>
S>Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
S>|             Method |   FileName |      Mean |    Error |   StdDev | Ratio | RatioSD |
S>|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
S>|              CppC4 | p00743.bmp | 330.92 ms | 1.103 ms | 0.921 ms |  2.73 |    0.03 |
S>|          NaturalC4 | p00743.bmp | 318.12 ms | 1.053 ms | 0.822 ms |  2.62 |    0.03 |
S>|           UnsafeC4 | p00743.bmp | 121.07 ms | 1.679 ms | 1.571 ms |  1.00 |    0.00 |
S>

S>Это там интероп такой дорогой, или это я не сумел включить релизную конфигурацию сборки для g++?

-O3/O2 в обычном gcc или llvm пробовал в линуксе?

В linux много базовых классов из netcore прекомпилировано в so майкрософтом и я не видел потерь от этого по сравнению с виндовс на однопоточных числодробительных задачах, хотя многопоточная синхронизация в линуксе в 2 раза медленее, чем в windows
Re[2]: Вызовы Native под Linux - в чём подвох?
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.10.20 06:39
Оценка: 6 (1)
Здравствуйте, VladCore, Вы писали:

VC>-O3/O2 в обычном gcc или llvm пробовал в линуксе?


VC>В linux много базовых классов из netcore прекомпилировано в so майкрософтом и я не видел потерь от этого по сравнению с виндовс на однопоточных числодробительных задачах, хотя многопоточная синхронизация в линуксе в 2 раза медленее, чем в windows

Спасибо большое, действительно, там какая-то кривда при сохранении С++ проектов в Visual Studio. Судя по всему, какие-то настройки считаются дефолтными, и он в Release в явном виде состояние флагов компиляции не сохраняет.
gccBuildTargets честно конвертирует настройки проекта в параметры g++, и туда ничего не попадало. Сейчас пробую перебилдить с <Optimization>Full</Optimization>, который должен мапиться в -O3.
Вот тут будут результаты: https://github.com/evilguest/linq2d/runs/1213262916?check_suite_focus=true
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Отредактировано 06.10.2020 6:41 Sinclair . Предыдущая версия .
Re[2]: Вызовы Native под Linux - в чём подвох?
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.10.20 10:27
Оценка:
Здравствуйте, VladCore, Вы писали:
S>>
S>>Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
S>>|             Method |   FileName |      Mean |    Error |   StdDev | Ratio | RatioSD |
S>>|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
S>>|              CppC4 | p00743.bmp | 330.92 ms | 1.103 ms | 0.921 ms |  2.73 |    0.03 |
S>>|          NaturalC4 | p00743.bmp | 318.12 ms | 1.053 ms | 0.822 ms |  2.62 |    0.03 |
S>>|           UnsafeC4 | p00743.bmp | 121.07 ms | 1.679 ms | 1.571 ms |  1.00 |    0.00 |
S>>

S>>Это там интероп такой дорогой, или это я не сумел включить релизную конфигурацию сборки для g++?

VC>-O3/O2 в обычном gcc или llvm пробовал в линуксе?


Да, вы были правы:
Intel Xeon CPU E5-2673 v4 2.30GHz, 1 CPU, 2 logical and 2 physical cores
Job=InProcess  Toolchain=InProcessEmitToolchain  

|             Method |   FileName |      Mean |    Error |   StdDev | Ratio | RatioSD |
|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
|              CppC4 | p00743.bmp |  61.42 ms | 0.975 ms | 0.864 ms |  0.55 |    0.01 |
|          NaturalC4 | p00743.bmp | 252.15 ms | 5.038 ms | 8.555 ms |  2.24 |    0.07 |
|           UnsafeC4 | p00743.bmp | 111.86 ms | 1.666 ms | 1.558 ms |  1.00 |    0.00 |
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Вызовы Native под Linux - в чём подвох?
От: VladCore  
Дата: 10.10.20 04:35
Оценка: 26 (2)
Здравствуйте, Sinclair, Вы писали:

S>Да, вы были правы:

S>
S>Intel Xeon CPU E5-2673 v4 2.30GHz, 1 CPU, 2 logical and 2 physical cores
S>Job=InProcess  Toolchain=InProcessEmitToolchain  

S>|             Method |   FileName |      Mean |    Error |   StdDev | Ratio | RatioSD |
S>|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
S>|              CppC4 | p00743.bmp |  61.42 ms | 0.975 ms | 0.864 ms |  0.55 |    0.01 |
S>|          NaturalC4 | p00743.bmp | 252.15 ms | 5.038 ms | 8.555 ms |  2.24 |    0.07 |
S>|           UnsafeC4 | p00743.bmp | 111.86 ms | 1.666 ms | 1.558 ms |  1.00 |    0.00 |
S>


Вдуг пригодится — что бы на всех линуксах работало собирать приходится на старых версиях линукса. Я как то разбирался с этим вопросом и вот выжимка на каких линуксах под какую архитектуру что можно собрать в докере переносимое: https://github.com/devizer/Universe.NativeLinux.Interop#precompiled-native-shared-objects

2.15 for x86_64, armhf, i386 (Ubuntu 12.04 LTS Precise)
2.19 for arm64, ppc64el (Ubuntu 14.04 LTS Trusty)
2.13 for armel & powerpc (Debian 7 Wheezy)
2.24 for mips64el: (Debian 9 Stretch)
2.12 for RHEL/CentOS 6 x84_64

По теме — Электрон свои бинарники кстати тоже на 12й убунте собирает под x86_64

Все архитектуры на x86_64 кстати собираются без мучений крос компиляции — сила докера)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.