Я вчера читал блог про Portability от создателя библиотеки SIMD Everywhere (полный порт всех SIMD инструкций под все существующие платформы). Блог хороший, портативность действительно сложна. Заставить работать у Васи с железкой 2007 года безумно тяжело не имея этой железки
http://evan.nemerson.com/2021/05/04/portability-is-reliability/
Вот, например, список багов, которые нашлись этой библиотекой. По опыту знаю. Это реально сложно и бесит.
Захотелось вспомнить самые забавные wtf портативности, с которыми я встречался (где-то сам, где-то в блогах)
Верхушка айсберга
1. False data dependency на инструкцию popcnt на x86, которая замедляла всё вокруг
2. Mersenne Random number generator ставит дефолтный seed не в 0 в C++. Попробуй потом отдебагать
5. Портирование атомиков с x86 на ARM вызывало падения тестов в lock-free алгоритмах как здесь. После этого я пишу код на атомиках на армах
6. Баг в кодогенерации LE vs BE PowerPC, наткнулся независимо
7. switch_endian(2) PowerPC64 only, до сих пор не понимаю как это может работать
8. ARM 26-bit computing with usr26() syscall
9. Компиляторы отказываются унифицировать интерфейсы crc32 инструкций для ARM, пишешь на ассемблере
10. Невозможность зааллоцировать непрерывный кусок для файла под MacOS, отсутствие аналога fallocate(2)
11. У серверных армов лэтенси мьютексов в 5 раз больше, чем у x86. Из-за того, что их никто не оптимизировал годами, да и модель памяти не позволяет. Это один из блокеров миграции на сервера arm
12. musttail из поста выше падает под всеми платформами, кроме x86 и aarch64. Будут протобуфы быстрее только для этих платформ, походу :)
13. Micron SSDs имели какие-то странные настройки перфа шедулера, если поставить всё в ноль, диск работает в 30 раз быстрее.
14. ClickHouse Network Cards BitFlips from Melanox
15. Баг в TCP стеке линукса на протяжении 26 лет
16. Процессор Apple M1 полностью повторяет float арифметику Intel Xeon W, в том числе и баги закрытого под всеми NDA микрокода
17. Windows XP SP2 имел некорректную и медленную имплементацию мьютекса в C++, в 2019 пофиксили в ... протобуфах, было нужно для хромиума
18. Skylake CPU bug, тру стори, дебагали всем отделом. Плакал весь отдел
19. 16 байтные атомики падали SIGILL на процессорах последнего поколения, потому что материнская плата решила запретить CPU их использовать
The abyss
Забавно себя ощущаю порой, мне кажется, что я один такие проблемы испытываю, видимо, карма за желание понимать весь стек, от распределённых систем до ассемблера.
Были вещи, которые я так и не раздебагал, они просто уходили сами по себе, скорее всего однажды столкнулся с византийским CPU багом, который не проявлялся ни разу спустя 2 года, был баг под нагрузкой сети, когда ядро решило закрывать сокеты пораньше, чем надо. Никто не понял, в чём дело, ретраи помогали и ладно.
Ну и всеми любимый Paxos. Раз в полгода стабильно падает/очень сильно замедляется тот же спаннер из-за очередного бага в Paxos, написанного в 2000 году и с тех пор поддерживаемого. После этого моё мнение, что написать работающий консенсус это всё таки удача, нежели умение, но это рассказ как-нибудь в следующий раз. :)
http://evan.nemerson.com/2021/05/04/portability-is-reliability/
Вот, например, список багов, которые нашлись этой библиотекой. По опыту знаю. Это реально сложно и бесит.
Захотелось вспомнить самые забавные wtf портативности, с которыми я встречался (где-то сам, где-то в блогах)
Верхушка айсберга
1. False data dependency на инструкцию popcnt на x86, которая замедляла всё вокруг
2. Mersenne Random number generator ставит дефолтный seed не в 0 в C++. Попробуй потом отдебагать
std::mt19937 mt(0);
против std::mt19937 mt;
3. __builtin_clz возвращает неопределённое значение на уровне CPU для x86-64 до Haswell, всё норм для ARM, Power, RISC. В документации всё ещё осталось Returns the number of leading 0-bits in x. If x is 0, the result is undefined.
4. Регрессия Openssl на 15% при переходе с clang-9 до clang-10 на x86 из-за нематчащейся регулярки, определяющей версию5. Портирование атомиков с x86 на ARM вызывало падения тестов в lock-free алгоритмах как здесь. После этого я пишу код на атомиках на армах
6. Баг в кодогенерации LE vs BE PowerPC, наткнулся независимо
7. switch_endian(2) PowerPC64 only, до сих пор не понимаю как это может работать
8. ARM 26-bit computing with usr26() syscall
9. Компиляторы отказываются унифицировать интерфейсы crc32 инструкций для ARM, пишешь на ассемблере
10. Невозможность зааллоцировать непрерывный кусок для файла под MacOS, отсутствие аналога fallocate(2)
11. У серверных армов лэтенси мьютексов в 5 раз больше, чем у x86. Из-за того, что их никто не оптимизировал годами, да и модель памяти не позволяет. Это один из блокеров миграции на сервера arm
12. musttail из поста выше падает под всеми платформами, кроме x86 и aarch64. Будут протобуфы быстрее только для этих платформ, походу :)
13. Micron SSDs имели какие-то странные настройки перфа шедулера, если поставить всё в ноль, диск работает в 30 раз быстрее.
14. ClickHouse Network Cards BitFlips from Melanox
15. Баг в TCP стеке линукса на протяжении 26 лет
16. Процессор Apple M1 полностью повторяет float арифметику Intel Xeon W, в том числе и баги закрытого под всеми NDA микрокода
17. Windows XP SP2 имел некорректную и медленную имплементацию мьютекса в C++, в 2019 пофиксили в ... протобуфах, было нужно для хромиума
18. Skylake CPU bug, тру стори, дебагали всем отделом. Плакал весь отдел
19. 16 байтные атомики падали SIGILL на процессорах последнего поколения, потому что материнская плата решила запретить CPU их использовать
The abyss
Забавно себя ощущаю порой, мне кажется, что я один такие проблемы испытываю, видимо, карма за желание понимать весь стек, от распределённых систем до ассемблера.
Были вещи, которые я так и не раздебагал, они просто уходили сами по себе, скорее всего однажды столкнулся с византийским CPU багом, который не проявлялся ни разу спустя 2 года, был баг под нагрузкой сети, когда ядро решило закрывать сокеты пораньше, чем надо. Никто не понял, в чём дело, ретраи помогали и ладно.
Ну и всеми любимый Paxos. Раз в полгода стабильно падает/очень сильно замедляется тот же спаннер из-за очередного бага в Paxos, написанного в 2000 году и с тех пор поддерживаемого. После этого моё мнение, что написать работающий консенсус это всё таки удача, нежели умение, но это рассказ как-нибудь в следующий раз. :)