All streams
Search
Write a publication
Pull to refresh
-6
0
habr is dead. @yleo

/dev/null

Send message

У вас несколько неверное представление, поэтому вы пару раз перемешали мух с котлетами:


  • Назвать LLVM IR байт-кодом не совсем корректно, мягко говоря. Тогда и исходник на C — тоже байт код, ибо тоже состоит из байтов ;)
  • В терминах LLVM IR программа манипулирует "примерно регистрами" заданной разрядности. Поэтому (наоборот) такая IR-программа будет относительно переносима между (не привязана к) 8-битной ATMega, 40-битному SHARC, 32/64-битному x86 и т.д.
  • На практике LLVM IR переносим примерно как шарообразный конь в вакууму. Т.е. пока некий код "шарообразный" и "в вакууме" — он переносим, а если чуточку иначе — сразу бац и коллапс волновой функции по массе причин ;)

В контексте удобно рассказать о знатной бага-фиче с [[gnu::pure]] в C++ и __attribute((pure))__ в C:


  1. В самом clang атрибут "pure" не документирован, но на зло для совместимости с gcc поддерживается фронтендом и обрабатывается бэкендом, а также честно виден через __has_attribute(pure).
  2. Встречая [[gnu::pure]] clang насильно включает noexcept(true), т.е. задним числом меняет тип функции (начиная с C++17).
  3. Всё происходит молча, без каких-либо предупреждений, при включении любой диагностики, и даже при наличии у функции явного noexcept(false).

Теперь представьте, что у вас проект с использованием десятка продвинутых C++ библиотек, в одной из которых есть трех-этажные шаблонны с абсолютно обоснованным использованием [[gnu::pure]] в паре-тройке функций, т.е. с втихую добавленными noexcept(true).


Этот noexcept(true) неплохо "протекает" через инлайнинг и IPO. При этом clang много чего оптимизирует/совмещает кадры стека и т.д. Соответственно, в каких-то случаях появление исключения приведет к вызову std::terminate(), а в других нет.


При каких-нибудь жалких 10-20К строк кода отлаживать сплошное удовольствие. Я провозился несколько часов, пока не дошел до "поштучного" анализа unwind-таблиц. Что характерно, эта бага-фича гуглится элементарно, как только понимаешь связь между [[pure]] и проблемами с исключениями. Но никак не раньше ;)

Ну что сказать, реклама LLVM удалась ;)

Доступность санитайзеров и их дружба друг-с-другом зависит от платформы, версии софта и т.п. Например, если не ошибаюсь, в gcc 10.x на x86_64 можно включить UndefinedBehaviorSanitizer (ubsan) одновременно с AddressSanitizer (asan) или с MemorySanitizer. А при выключенном asan можно всегда включить отдельно LeakSanitizer c любым другим санитайзером. Но лучше смотреть https://github.com/google/sanitizers и доку по конкретному компилятору.


  1. Для памяти: LeakSanitizer по-умолчанию включается одновременно с AddressSanitizer. Использование AddressSanitizer + MemorySanitizer (т.е. две отдельные сборки и два прогона) примерно соответствуют прогону под Valgrind с трекингом аллокаций.
  2. Для гонок: ThreadSanitizer, но я им почти не пользуюсь (писал выше).
  3. UndefinedBehaviorSanitizer: отлавливает массу всякой фигни, особенно в легаси-коде писанном для x86. Мне много раз помогал с unaligned access.

Но в целом, это RTFM.

Roaring Bitmaps не совсем то что вам нужно (не считая проблем шарповой реализации). А вот с CSharpFastPFOR померятся вполне уместно. Собственно этого достаточно чтобы соотнести результат вашего VLQ с остальными competitors в score-таблицах у TurboPFor и т.п.


Кроме этого, это поможет вам самим сориентироваться и решить куда двигаться дальше. Ну и конечно было-бы любопытно увидеть статью-продолжение с разбором полетов.


P.S.
На всякий — про качество кода CSharpFastPFOR мне ничего не известно, т.е. там тоже могут быть какие-то перлы.

Ждем наглядного процесса национализации TSMC в течение года?

Нет, совсем не так.
Вне зависимости от ученой степени ваша работа может представлять интерес (не быть дилетантской и наивной), если хотя-бы одно из двух:


  1. Вы со знанием дела теоретически показываете что предложили новый подход или улучшили уже известный.
  2. Вы практически (бенчмарком) показываете ценность вашего подхода и/или идеи. Например, можно померятся силами с TurboPFor (там в README достаточно таблиц с результатам различных реализаций).

А пока вы просто не понимаете как смешно выглядите, уж извините за прямоту.

Да, давайте еще раз:


  • Есть ряд научных работ (разных ученых/исследователей) по теме сжатия целочисленных последовательностей, в которых собрано и проанализировано немало различных идей/подходов.
  • Есть FastPFOR (включая https://github.com/Genbox/CSharpFastPFOR), streamvbyte, TurboPFor и немало других реализаций под разные задачи/требования, где использованы результаты этих научных работ.
  • Кроме этого есть и упомянутые Roaring Bitmap (в том числе на C#, на Java и даже на JS).

Соответственно, замечательно что вы пытаетесь самостоятельно разобраться и придумать что-то новое. Однако, без ознакомления с наработанным опытом из первого пункта (совершенно вне зависимости от остальных) результат вашей работы (включая статью) рискует быть излишне дилетантским и наивным.

Пардон, ну так вы для начала просто прочитайте публикации Daniel Lemire по ссылкам.
Причем если Дэниеля внятно спросить что-то beyond RTFM (тем более по-французски), то он очень хорошо отвечает.

Daniel Lemire с коллегами занимался этой темой (Integer Compression) более 6 лет. Собрал, наработал и опробовал массу идей, опубликовал около десятка работ и довел до ума несколько реализаций. А в https://github.com/lemire/FastPFor/blob/master/README.md пожалуй лучший набор ссылок по теме, как на научные работы (т.е. идеи с глубокой проработкой и выкладками), так и на реализации (с оптимизацией и т.д.).


С одной стороны, здорово что вы пытаетесь самостоятельно разобраться в теме и что-то придумать. Однако, не стоит делать публикаций без минимального ознакомления с примерно общеизвестной (хотя и в узких кругах) информацией по теме. Уж извините, вовсе не хочу обидеть, но это достаточно вредный дилетантизм.

s/Berkley/Berkeley/g
т.е. основная ошибка с пропуском "e" осталась.

Советую ознакомиться с работами Daniel Lemire, Leonid Boytsov, Nathan Kurz и т.д. по данной теме.
Соответственно, недостает сравнения с https://www.roaringbitmap.org/ и https://github.com/lemire/FastPFor.


Без этого плюсануть статью совесть не позволяет.

На скриншотах снизу видна небольшая неточность — вместо "Berkley" лучше писать "Berkeley DB".

Ох, пожалуй я "за википедию":


  1. Статистическая гипотеза = предположение о виде распределения и свойствах случайной величины, которое можно подтвердить или опровергнуть применением статистических методов к данным выборки.
  2. p-значения полезны при оценке того, насколько несовместимы данные с некоторой статистической гипотезой.
  3. p-значения могут использоваться в качестве индикатора случайной ошибки в результатах экспериментов/измерений/выборок с известной/доказанной статистической гипотезой.

Чем больше "замеров" и чем лучше они "ложатся" на статистическую гипотезу, тем меньше p-значение в диапазоне от 1 до 0.
Однако, нулевое значение недостижимо и свидетельствует о принципиальной проблеме: величина не случайна, ошибки в расчетах и т.п.
Аналогично с p-value ≥ 0.5, причём 1 можно трактовать как "полный туман/неизвестность", включая факт наличия самого p-значения.

Уж поправьте меня, если ошибаюсь. Но ведь все "много-раундовые" алгоритмы (примерно априори) принципиально уязвимы/нестойки к diff-атакам при возможности считывать/контролировать/искажать состояние между итерациями/раундами.


Соответственно, тут дело не в "консерватории" (AES), а в "пианисте" (программно-аппаратной реализации), и выстраивание подобной атаки (с начала и/или с конца раундов в зависимости от каналов утечки и/или влияния = дело техники и навыков).


Если (вдруг, всё бывает) проектировщики подобных систем (SoC и т.д) "не в курсе", то будем рады принять результат их работы к нам на аудит в ptsecurity.

На всякий, "в обнимку с ASAN" — это шутка на 50% ;)


C tsan у меня отношения не сложились, примерно как с drd и helgrind — либо не требуется, либо прилично фалсит (много false-positives) и приходиться разгребать руками:


  • Свой код уже автопилотно получается с минимизацией contention и кол-ва примитивов синхронизации, либо lock/wait-free если нужно.
  • Для чужого запутанного (особенно legacy) кода эти инструменты могут прилично фалсить. И вот после ReOpenLDAP в 2015 мне что-либо по-крупному чинить не приходилось (тьфу-тьфу).

Просто остался на C/C++ в обнимку с ASAN ;)

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

Там действительно неплохая подборка, но не вопросов, а скорее советов. Причем жаль что без должного описания причин (например, отсылки к этому багу).

На всякий, поясню почему вас "минусуют" (и, видимо, с заносом в карму):


  1. речь о E2K, а не о "спарках" (это взаимосвязанные, но всё-таки разные истории).
  2. "без бубна ре работает" = FUD в чистом виде.
  3. "все компоненты, стандарты и патенты импортные" = не будет явной заведомой ложью, если "все" заменить на "некоторые".

Information

Rating
Does not participate
Location
Севастополь, Республика Крым, Россия
Date of birth
Registered
Activity