Как стать автором
Обновить
4
0

Пользователь

Отправить сообщение

А причем тут шустрота конкретного процессора и оптимизация под конкретную архитектуру? А ее в clang надо ставить что для M2, что для андройда -march=armv8.2a+dotprod для последних процов, и под нее оптимизировать. Можете какой-нибудь opus посмотреть, там ничего специтфичного для M* нет.

Аргумент же был: что вот для M ничего не оптимизировали тогда пока, вот почему он "тормозил". Хотя по тестам что тогда что сейчас топовые десктопные х64 выигрывают, но ценой лишних ватт.

Это же обычный ARM64, портированик наврняка выход M* подстегнул, но что ничего небыло портировано некорректно. Поддержка и на андройдах уже была и портирование шло полным ходом.

Это я понимаю, он проверяет нечто другое относящееся к языку, а не скрытым доказательствам. Я просто предположил что раз не ходит он - то не ходит и этот доказывальщик. Вопрос на каком уровне он реализован в надстройке llvm или внедрен в саму llvm. Если внедрен - то должно помочь -C linker-plugin-lto.
Я потому и спрашиваю, вдруг кто уже порэксперементировал. Лично я пробовал очень давно, и там даже в одной единице трансляции были проблемы.

К этой теме еще стоит добавить, что как я понял borrow checker не ходит вглуб вызовов функций. Соответственно если в алгоритме встречаются вызовы функций, пусть даже заинлайненые, то доказательство выкидывания проверок все равно будет страдать.
Поправьте если ошибаюсь.

Справедливости ради, обмазано проприетарщиной - это один единственный модуль ядра реализующий ashmem/binder и все. Его можно собрать и запустить в стандартном ядре убунты и на этом ядре андройд будет работать. Так работает https://github.com/waydroid/waydroid, бывший anbox.

Тоже бесило это в виндовом фаре, а вот far2l не блокирует, так же можно нажав F4 открыть весь вывод в эдиторе.

что компилятор в принципе не имеет понятия UB

Не помню тут ли писали или к другой статье, насчет поведения +, что у раста переполнение в дебаге это trap, а в релизе wrap around (я подозреваю на проверяемой платформе).
Я сам не проверял, но если это так, то понятие UB должно быть. Иначе как сделать я просто не представляю, иначе дефайненый wrap around начнет сильно замедлять код на определенных архитектурах.
Если это все так, то поведение + по сути не отличается от clang со включенным ubsan в дебаге.

Ну кажется ваш собеседник именно это и имел ввиду, что нельзя просто так бесплатно сделать поведение определенным. Будет цена в виде оверхеда на платформах которым не повезло.
А пачка интринзиков с опредененным поведением есть и в gcс, так же как опция -fwrapv, которая делает определенным поведение +.

Не очень понял ваш ответ, не делать оптимизаций разве достаточно?
Я правильно понимаю что вы имеете виду что rust отключит оптимизацию, но оставит один единственный add этой платформы? Ну это же настоящий межплатформенный UB, на одной платформе получим одно, на другой - другое.
Единственное как можно избежать тут UB - это рассчитеть на поведение одной платформы, и добавить лишних инструкций на другой платформе, где поведение add отличается. Тоесть на этих платформах без UB компилер будет генерить менее эффективный код. Или я что-то не так понимаю?

В документации написано что этот анализатор пока только для C, а на С++ может косячить. Так что да, видимо gcc тут плохой пример. Но как ниже показали clang c -Wdangling-gsl таки справился и при исправлении варнинг уходит.

Справедливости ради, анализатор gcc ваш пример сразу поймал:

./1.cpp:3:29: warning: use of uninitialized value ‘<unknown>’ [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
    3 | std::string read() { return "foo"; }
      |                             ^~~~~
  ‘std::string read()’: events 1-3
    |
    |    3 | std::string read() { return "foo"; }
    |      | ^~~                         ~~~~~
    |      | |                           |
    |      | |                           (3) use of uninitialized value ‘<unknown>’ here
    |      | (1) region created on stack here
    |      | (2) capacity: 8 bytes
    |
./1.cpp:3:29: warning: use of uninitialized value ‘<unknown>’ [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
    3 | std::string read() { return "foo"; }
      |                             ^~~~~
  ‘int main()’: events 1-2
    |
    |    4 | int main() {
    |      |     ^~~~
    |      |     |
    |      |     (1) entry to ‘main’
    |    5 |     std::string_view s = read();
    |      |                          ~~~~~~
    |      |                              |
    |      |                              (2) calling ‘read’ from ‘main’
    |
    +--> ‘std::string read()’: events 3-6
           |
           |    3 | std::string read() { return "foo"; }
           |      | ~~~         ^~~~            ~~~~~
           |      | |           |               |
           |      | |           |               (6) use of uninitialized value ‘<unknown>’ here
           |      | |           (3) entry to ‘read’
           |      | (4) region created on stack here
           |      | (5) capacity: 8 bytes
           |

Ctrl+P - fuzzy поиск по посещенным папкам - реально удобно и быстро. В Фаре только плагином похожее можно сделать.

В far2l это есть из коробки - Alt-F12 выводит список недавно посещенных, Ctrl-Alt-F ищет в этом списке.

Если что travis-ci дает бесплатно контейнеры для сборки опенсорса с гитхаба, можно настройить автосборку при коммите и загрузку артефактов. И вроде есть еще пара бесплатных вариантов.

Если нацелен на замену, хорошо бы бенчмарки посмотреть, есть такие?

У gcc\clang есть рантаймовые asan, tsan, ubsan, которые замедляют выполнение. У msvc только asan.

Просто FYI: баг открывать не надо, если поставить gcc опцию -fwrapv то результат будет соответствовать clang.

Да, я тоже работал с такими где не выровненное чтение - креш. Я не про это, а про то что тут выравнивание нужно не только для скорости, (инструкцию можно применить и другую, ситуация для asan не поменяется) но и для гарантии непересечения страницы загрузкой.

Все верно, но проблема слегка ортогональна sse, при загрузке int64 или int32 принципиально все то же самое - главное на другую страницу не обратиться, затем и выравнивание. То есть это для целого набора архитектур безопасно, не безопасные еще поискать надо.

Точно такое же UB есть в Qt в qustrlen, и оно там просто подавлено для asan через __attribute__((__no_sanitize_address__)).

Все эти __aeabi_fmul так же довольно сильно тормозят код. Их вставляет стандартный arm gcc, даже если указать neon, а вот в android ndk от них избавились (когда gcc еще там был). Насчет clang не помню, но вроде так же. Так что есть еще куда ускорять.

1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность