The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Проект Minotaur развивает оптимизатор векторных инструкций для LLVM

16.07.2023 10:02

Группа исследователей из университета Юты (США) предложила оптимизатор Minotaur для набора компиляторов LLVM, использующий метод на основе решения задач выполнимости формул (SMT Solver) для выявления недостающих оптимизаций в промежуточном представлении кода (LLVM IR), генерируемом оптимизатором LLVM. Minotaur главным образом нацелен на оптимизацию целочисленных векторных инструкций (SIMD), как переносимых, так и специфичных для систем x86_64 (SSE, AVX, AVX2 и AVX-512).

В качестве векторизатора задействована библиотека Alive2, модифицированная для синтеза и поддержки векторных инструкций, используемых на системах x86_64. Разработка продолжает развитие проекта Souper, разрабатывавшегося теми же авторами. Minotaur может находить различные оптимизации применения векторных инструкций, пропущенные штатным оптимизатором LLVM. При тестировании дополнительно оптимизированного кода библиотеки libYUV на системе с CPU Intel Cascade Lake зафиксировано максимальное повышение производительности в 1.64 раза, но в среднем ускорение составило 2.2%. При тестировании набора SPEC CPU2017 ускорение составило 1.3%.

Пример оптимизации для Си-кода:


  do {
    if (*--p == '.') *p = '_';
  } while (p != name);

Для операции сравнения штатный оптимизатор LLVM сгенерирует биткод для использования инструкций AVX-2:


  %1 = shufflevector %0, <31, 30, 29, ... , 0>
  %2 = icmp eq %1, <46, 46, 46, ... , 46>
  %3 = shufflevector %2, <31, 30, 29, ... , 0>

Minotaur исключит лишние операции shufflevector и сведёт код к одному вызову операции icmp, которая также выполняет сравнение регистра с символом "." (ASCII-код 46), но без лишней реверсии вектора:


  %1 = icmp eq %0, <46, 46, 46, ... , 46>


  1. Главная ссылка к новости (https://news.ycombinator.com/i...)
  2. OpenNews: Выпуск Tinygo 0.28, компилятора языка Go на базе LLVM
  3. OpenNews: Создатель LLVM развивает новый язык программирования Mojo
  4. OpenNews: Релиз набора компиляторов LLVM 16.0
  5. OpenNews: Реализована возможность сборки Glibc при помощи инструментария LLVM
  6. OpenNews: Проект LLVM развивает средства для безопасной работы с буферами в C++
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/59447-minotaur
Ключевые слова: minotaur, llvm, simd, vector, optimization
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (107) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 10:43, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –21 +/
    много человекочасов, пропукали не один стул, построили целую науку, добились повышения в 1.3%. Это прогресс ащетаю
     
     
  • 2.3, Аноним (3), 10:58, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Прогресс в навязывании avx2
     
  • 2.9, Аноним (9), 11:36, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +12 +/
    Ты шутишь? Это целые 1.3%! Нука шляпу сними!
     
     
  • 3.29, Аноним (29), 14:45, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +17 +/
    Так потратили человекочасы одна группа и один раз, а 1.3% прироста теперь будут всегда и для всех.

    Вполне себе выигрыш.

     
     
  • 4.51, Аноним (51), 17:08, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    для всех, кто ЭТО использует. А кто будет использовать прилепленныетсбоку васяноподелки ради 1% производительности?
     
     
  • 5.58, Аноним (58), 18:17, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Например, любой крупный облачный оператор. Да и в целом, сэкономить 1% денег через несложные единоразовые телодвижения — хороший бизнес. Надо брать.
     
  • 5.72, Я (??), 23:03, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    для некоторых задач и ускорение на 0.1% это миллионы доларов экономии в год
     
  • 2.23, AKTEON (?), 13:19, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ага - полезность науки это растет как длина фрактала к ометаемой площади ....
     
     
  • 3.88, freehck (ok), 10:50, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Покуда учёные не создали perpetuum mobile, как бы мы полезность не определили, она всё-таки конечна. )
     
  • 2.27, Аноним (27), 13:41, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Ты пропукал свой комментарий, это прогресс я считаю.
     
  • 2.86, Anonymous1917 (?), 09:18, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    На больших масштабах это могут быть огромные деньги. К счастью они будут потрачены на рождение и воспитание детей не таких как ты
     
  • 2.87, Аноним (87), 09:33, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Для каких-нибудь видеоигр один процент - это целый кадр, если метишь в 120 FPS.
     
     
  • 3.105, Аноним (1), 08:10, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    разве есть какая-то разница 119 и 120 fps ?
     

  • 1.2, Аноним (2), 10:58, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    А они учитывают то что многие процессоры тут же включают троттлинг от таких инструкций?
     
     
  • 2.6, Аноним (6), 11:29, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    околесицу и чушь про тротлинг при вызове таких инструкций не несите, хорошо? спасибо.
     
     
  • 3.7, Аноним (7), 11:33, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Может троттлинг и не точное определение, но то, что ядра снижают частоту при использовании AVX-* - факт.
     
     
  • 4.15, Аноним (2), 12:33, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это то же самое и по той же причине. Своеобразный преемптивный троттлинг, avx легко отобрали пальму первенства по нагреву у sse и fpu. Особенно заметно, когда СО в итоге всё же не справляется и легко падает в полноценный троттлинг. Для примера, компиляция вебкита (и хромиума соотвественно) -- единственный процесс из всех пакетов, который выкидывал мой пк в защиту от перегрева (температура на ~20 градусов выше обычной максимальной).
     
     
  • 5.16, Аноним (2), 12:37, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    То, что это в принципе самый долгособираемый пакет, вопрос отдельный, троттлить начинало довольно быстро и соответственно всё растягивалось на долго.
     
  • 5.41, Аноним (41), 15:48, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Пользуйтесь процессорами AMD, у них частоты одинаковые при любых инструкциях.
     
     
  • 6.42, Аноним (2), 15:54, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А как же быть с тем, что процессоры АМД не показывают реальную температуру на датчиках? Из-за того, что они склеены из различной отбраковки, результаты могут довольно разниться. У них намного жёстче ограничения по рабочим температурам, как из-за материала затворов, так и из-за клея.
     
     
  • 7.73, Я (??), 23:05, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    какая разница что там на датчиках если процессор не пререгревается и работает нормально без тротлинга?
     
  • 4.30, Аноним (29), 14:48, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Это было на самых первых реализациях от интела. Этого уже нет, если укладывается в теплопакет - частота будет та же.

    Так и AVX-512 за троттлинг и снижение частоты гнобили, а *внезапно* это оказалось просто легкой болячкой первых интеловских реализаций, вон в Zen 4 никакого снижения частоты от AVX-512 не происходит. И теперь даже memcpy() с ним оказывается эффективнее воткнуть во всех программы, а то что когда-то Линус говорил против этого - оказалось частью истории и неактуальной частностью. Прошло время, ошибки изучили, сделали нормально. Вон, ознакомьтесь с бенчмарками phoronix с/без AVX2 и AVX-512.

     
     
  • 5.36, Аноньимъ (ok), 15:27, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В процессорах нет инструкций для копирования произвольных кусков памяти?
     
     
  • 6.57, Oe (?), 18:15, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Нету, проще каждое поколение наращивать количество ядер и продавать. Ой, уже давно уперлись в потребление в пол-киловатта, поэтому чтобы добавить еще больше ядер, половину ядер урезают по частотам под соусом "энергоэффективности и экологии", так можно еще пару лет делать новые "инновационные" поколения процессоров и впаривать хомякам, не внося абсолютно никаких изменений в архитектуру и техпроцесс.
     
     
  • 7.59, Аноньимъ (ok), 18:26, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    "Прогресс"

     
  • 7.82, n00by (ok), 08:05, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >> В процессорах нет инструкций для копирования произвольных кусков памяти?
    > Нету,

    Прекратите распространять мракобесие.

     
  • 6.81, n00by (ok), 08:02, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Есть, начиная с 16-ти разрядных 8086.

    rep movs

    В какие-то периоды времени она работала медленнее, чем цикл с предвыборкой из кеша (prefetchnta), но давно ускорили.

     
     
  • 7.90, Аноньимъ (ok), 11:26, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Есть, начиная с 16-ти разрядных 8086.
    > rep movs
    > В какие-то периоды времени она работала медленнее, чем цикл с предвыборкой из
    > кеша (prefetchnta), но давно ускорили.

    Зачем тогда avx используют для копирования?

    И разве это не просто способ повторения копирования одного слова?

     
     
  • 8.91, n00by (ok), 12:36, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не знаю, зачем Может маркетинг, или очередной выигрыш на уровне погрешности изм... большой текст свёрнут, показать
     
  • 8.118, Аноним (118), 21:38, 03/01/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Там целая эпопея https stackoverflow com questions 43343231 enhanced-rep-movsb... текст свёрнут, показать
     
  • 5.46, Аноним (46), 16:51, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ага, такой лёгкой болячкой оказалось, что вообще нафиг выпилили из новых процессоров.
     
     
  • 6.56, анонимус (??), 18:10, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Выпилили чтобы зеоны продавать, в них-то avx512 остался.
     
  • 6.65, Аноним (65), 19:19, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Выпилили по совершенно другой причине.
     
     
  • 7.80, Аноним (46), 07:35, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    И пр какой же? Только не надо вот про зионы, как выше написали, эти рынки вообще не пересекаются.
    В любом случае — это весьма стыдное в репутационном смысле решение. Вот представьте лет 20 назад: а давайте мы уберём SSE из наших пентиумов-3, и оставим его только в зионах! Дико? Дико.
     
     
  • 8.98, Аноним (98), 00:33, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Очевидно, потому что малые E-ядра не могут в AVX-512 Скорее всего, тупо не влез... текст свёрнут, показать
     
  • 5.69, S22 (?), 21:44, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    В zen4 avx512 выполняется в 2 инструкции так как ширина канала 256. По факту avx512 там не даёт существенных преимуществ над avx2
     
     
  • 6.71, анонимус (??), 22:44, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Phoronix потестил и смысл очень даже есть: https://www.phoronix.com/review/amd-zen4-avx512
    а вот с 512бит шириной канала есть вопросы поскольку штука узкоспециализированная, у интел тоже не дураки чтобы выкинуть поддержку из гражданских моделей, ибо греется сильней и зря занимает полезное место. Можно конечно придумать куда впихнуть, но тут проблема курицы и яйца
     
     
  • 7.79, S22 (?), 07:29, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Увеличение скорости на 10% против нормативных 2х раз.

    Avx512 там добавили для галочки. Кстати, как я понимаю многопоточность не будет работать с avx512 в линуксе, так как регистры не сохраняются при переключении задач?

     
     
  • 8.83, анонимус (??), 08:10, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    uwot https www phoronix com review rocket-lake-avx512 https www phoronix com... текст свёрнут, показать
     
  • 8.99, Аноним (98), 00:35, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Чего только не прочитаешь в комментах ... текст свёрнут, показать
     
  • 8.103, Stax (ok), 07:42, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не туда смотрите Вот вам в TensorFlow и в два раза прирост https www phoroni... текст свёрнут, показать
     
  • 2.32, Аноним (65), 14:53, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > А они учитывают то что многие процессоры тут же включают троттлинг от таких инструкций?

    А многие не включают.

     
     
  • 3.33, Аноним (2), 15:10, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вроде, это каждый раз повторяется. Добавляют новые SIMD, не вывозят по тепловыделению, и пока литография не обновится, все процессоры идут бракованные. И не предъявишь ведь как АМД -- ничего не падает.
     
     
  • 4.34, Аноним (2), 15:14, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    У АМД была похожая история с совместными блоками -- вроде, ядер много, а используется только половина и остальные стоят ждут. Ещё что-то там с шиной межъядерного взаимодействия было. Всё лучше чем сегфолты, конечно. Но старое железо никуда не девается ведь.
     
     
  • 5.38, Аноним (27), 15:35, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Всё лучше чем проц сгорает если снять кулер.
     
     
  • 6.47, Аноним (46), 16:54, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Тут, конечно, пара человек с сокетом  462 найдётся, но в основном все обновились уже.
    А то так можно вспомнить и «всё лучше, чем когда математику неправильно считает».
     
  • 5.49, An2 (?), 17:03, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Они тогда решили сэкономить на блоках для плавающей запятой (1 на 2 ядра). В бульдозерах, вроде. Напрасно.
     
     
  • 6.70, Аноньимъ (ok), 22:08, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Работало вообще оно отлично для обычных задач.

    Да, на всяких расчётах не очень хорошо тянуло в сравнении, хотя там свои нюансы были.

    Мне кажется бульдозеры незаслуженно ругали вообще.

    Думаю маркетинг подкачал скорее.

     
     
  • 7.100, Аноним (98), 01:02, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А вы посмотрите обзоры и сравнения тех времен, и перестанет казаться.

    Разделяемый FPU не взлетел потому что, внезапно, программы его активно используют. Напомню, что в случае AMD FPU используется не только для вычислений с плавающей запятой, но и для векторных инструкций. А в Бульдозере, к тому же, использовался сырой процесс, в котором не смогли добиться высоких частот. Вот и получилось, что разделяемый FPU, расчитанный на высокую пропускную способность (throughput) в ущерб задержке (latency), работал на относительно низких частотах.

     
     
  • 8.101, Аноньимъ (ok), 02:39, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Смотрел обзоры, видел много некомпетентности И успешно использовал эти апушки м... текст свёрнут, показать
     
  • 8.102, Аноньимъ (ok), 02:48, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Первой их апушкой у меня был AMD A10-5800K Разгонялся вообще отлично При этом б... текст свёрнут, показать
     
     
  • 9.106, n00by (ok), 09:13, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    расчитанный на высокую пропускную способность throughput в ущерб задержке la... текст свёрнут, показать
     
     
  • 10.108, Аноним (98), 12:57, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да нет, всё прилеплено куда надо Да, NetBurst был расчитан на высокие частоты... текст свёрнут, показать
     
     
  • 11.111, n00by (ok), 09:01, 19/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Но толку не было, потому она архитектура NetBurst и породила мем кукурузные г... текст свёрнут, показать
     
     
  • 12.114, Аноним (98), 11:27, 19/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Относится Почитайте статьи по ссылкам ... текст свёрнут, показать
     
     
  • 13.115, n00by (ok), 15:17, 19/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вот сам читай их, подбирай цитаты и подтверждай своё заявление Мне достаточно к... текст свёрнут, показать
     
     
  • 14.116, Аноним (98), 23:04, 19/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Всё понятно, удачи с вашим багажом знаний ... текст свёрнут, показать
     
     
  • 15.117, n00by (ok), 09:18, 20/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Бгг, но ведь ты как то живёшь, не понимая индукцию ... текст свёрнут, показать
     

  • 1.4, Аноним (3), 10:59, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >(SMT Solver)

    очень медленно будет.

     
     
  • 2.8, Аноним (8), 11:35, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    с какого это перепугу? вы, судя по всему, вообще не понимаете, что это и как оно реализовывается в Minotaur. https://arxiv.org/pdf/2306.00229.pdf
    почитайте источник исследований и то, откуда скопирована по своей сути статья.

    условно, вставляя более мощный двигатель в автомобиль вы говорите "медленно будет", потому-что там какя-то мембрана юзается или где-то какая-то реакция идет медленнее невесть бог где. мда уж.

     
     
  • 3.18, Аноним (18), 12:45, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +5 +/
    компиляция медленная, не выполнение. SMT - это тяжёлая артиллерия для таких задач, как инверсия хэш-функций. По сути - оптимизированный ветвями и границами брутфорс. Они могут это решить в принципе, но никто не обещал, что за приемлимое время и при приемлимом потреблении памяти. На smt полагаются тогда, когда на всё остальное положиться уже нельзя.
     

  • 1.17, Аноним (17), 12:43, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Rewrite Generator -> Rewrites -> Rewrite Rules -> Rewrite
     
     
  • 2.21, Аноньимъ (ok), 12:57, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Знают толк в С++
     

  • 1.20, Аноним (2), 12:56, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Интересно было бы сравнить с GCC (O3+pgo).
     
     
  • 2.63, Аноним (63), 18:46, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не заставляй афтаров LLVM посыпать себе голову пеплом. Спиды тестируются на O2 в любом случае.
     

  • 1.22, Аноньимъ (ok), 13:05, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Пример оптимизации для Си-кода:

    Это очень круто, но бывает эти avx инструкции нужны для всяких векторных вычислений, всяких кодировщиком видео, и прочее.

    А цикл заменяющий символы в строке может всеже стоит без avx делать?


    Другими словами если всё так круто и быстро может вообще отказаться от обычных инструкций и все через avx считать?

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

    И вот опять.

     
  • 1.24, Аноним (24), 13:21, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Может я чего-то недопонимаю, но зачем в LLVM вообще для  if (*--p == '.') приплетают векторные инструкции вместо примитивной инструкции CMP.
     
     
  • 2.26, Аноньимъ (ok), 13:30, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Они цикл разворачивают, как я понимаю.
    Но многое остаётся загадкой да.
     
  • 2.31, Аноним (65), 14:51, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Внезапно, это прямое назначение векторных инструкций - выполнить одну операцию над кучей данных. А "примитивной" CMP вы будете долго и нудно ковырять эту строку по одному символу за раз.
     
     
  • 3.39, Аноньимъ (ok), 15:40, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Стоит ли вообще такое делать без явного указания программиста что именно так нужно делать большой вопрос.

    У меня есть много вопросов по конкретному примеру вообще.

    Как приведенный в новости код векторизировать если неизвестен размер массива?

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

    Нормальная система такого позволять не должна.

     
     
  • 4.44, Tim (??), 16:41, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Конкретно в этом примере не весь цикл, а только оператор сравнения. Фактически выбросили две бессмысленные операции.

    Реализовать можно по-разному. Например три цикла, где первый побайтовый до границы кэш линии, затем векторный, и финал опять побайтовый. Или другой вариант – маскировать load/store.

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

    Проблемы начнутся если для копирования будут использовать DMA каналы, так как их мало и работают асинхронно.

    PS. Процессоры, которые кичатся своей RISC-овостью, могут load/store только с машинными словами, и только выровненными по границе слова.

     
     
  • 5.48, uis (??), 16:55, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > PS. Процессоры, которые кичатся своей RISC-овостью, могут load/store только с машинными словами, и только выровненными по границе слова.

    Не совсем. Хотя у POWER VMX очень интересно сделано: оно игнорирует последние n бит, всегда загружает выровненное слово и отказывается выдавать ошибку. Как результат - программная невыровненная загрузка выполняется в 3 инструкции.

     
  • 5.53, Аноньимъ (ok), 17:23, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Реализовать можно по-разному. Например три цикла, где первый побайтовый до границы кэш
    > линии, затем векторный, и финал опять побайтовый. Или другой вариант –
    > маскировать load/store.

    Для этого компилятору нужно знать размер массива.


     
  • 4.50, An2 (?), 17:08, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Стоит ли вообще такое делать без явного указания программиста что именно так нужно делать большой вопрос.

    Но откуда программисту знать, на каком процессоре код будет выполняться? Можно ли ему за раз 128 бит проверять или 256, а может и все 512?

    Если оптимизатор не накладывает ограничений на кратность размера буфера - просто замечательно.

     
     
  • 5.52, Аноньимъ (ok), 17:21, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >Но откуда программисту знать, на каком процессоре код будет выполняться?

    Да просто не от куда, загадка!
    Не говоря уже о том, что никогда никакой код и не пытается даже узнать это в рантайме прямо, это ведь невозможно.
    Только компилятор может знать, или не может.
    Кстати, откуда компилятору знать на каком процессоре будет код выполняться если программист этого не знает?

    >Можно ли ему за раз 128 бит проверять или 256, а может и все 512?

    Программисту ненужно знать сколько там бит и какие конкретно инструкции, достаточно сказать что это должна быть SIMD операция.
    Обычно делается это через спец векторные примитивы.

     
     
  • 6.54, An2 (?), 17:41, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Не говоря уже о том, что никогда никакой код и не пытается даже узнать это в рантайме прямо, это ведь невозможно.

    Очень даже возможно. Самый известный проигрыватель mplayer при запуске как раз об этом и сообщает: "Compiled with runtime CPU detection". И, самое главное, использует обнаруженные преимущества.

    > Кстати, откуда компилятору знать на каком процессоре будет код выполняться если программист этого не знает?

    Об этом ему может сообщить сборщик программы, который, в общем случае, не программист.

    > это должна быть SIMD операция

    Когда теперь чуть ли не каждый цикл можно автовекторизировать, то проще уже указывать обратное: вот именно тут, пожалуйста, никакой самодеятельности.

     
     
  • 7.62, Аноньимъ (ok), 18:40, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Когда теперь чуть ли не каждый цикл можно автовекторизировать, то проще уже
    > указывать обратное: вот именно тут, пожалуйста, никакой самодеятельности.

    Не знаю.
    Я думаю это не такой простой вопрос.

     
  • 4.67, Аноним (65), 19:39, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Как приведенный в новости код векторизировать если неизвестен размер массива?

    Очевидно, он известен, т.к. p указывает на конец, а name - на начало.

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

    Никаких чудес, если в рамках страницы памяти. Да, всякие sanitizer'ы и valgrind будут вонять про выход за границы буфера, но на практике всё будет работать без проблем. Такой подход реально применялся раньше, пока sanitizer'ы не стали модными.

     
     
  • 5.68, Аноньимъ (ok), 20:00, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Очевидно, он известен, т.к. p указывает на конец, а name - на
    > начало.

    Да, вы правы, я как-то не так этот кот прочитал.

     

  • 1.35, YM2608 (?), 15:21, 16/07/2023 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]
  • –1 +/
     

     ....ответы скрыты модератором (3)

  • 1.45, uis (??), 16:51, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > if (*--p == '.') *p = '_';

    Ауч, кэшу больно

     
     
  • 2.60, Аноньимъ (ok), 18:33, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >> if (*--p == '.') *p = '_';
    > Ауч, кэшу больно

    Меня больше смущает:
    > while (p != name);

     
     
  • 3.75, Tron is Whistling (?), 23:11, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Yup. Тоже это усмотрел, ну их нафиг.
     
     
  • 4.95, pavlinux (ok), 13:37, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Только ыксперты опеннета могут закопать 30-летний опыт Free Software  Foundation, Inc. и,
    конкретно Jean-loup Gailly.. https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D0%B9

    :)




    ... For example, consider this loop, in C, from the compression/decompression utility gzip,
    where name is the base address of a string and p is a pointer into the string:

    do {
    if (*--p == '.') *p = '_';
    } while (p != name);



    https://git.savannah.gnu.org/cgit/gzip.git/tree/util.c#n356




    /* ========================================================================
    * Make a file name legal for file systems not allowing file names with
    * multiple dots or starting with a dot (such as MSDOS), by changing
    * all dots except the last one into underlines.  A target dependent
    * function can be used instead of this simple function by defining the macro
    * MAKE_LEGAL_NAME in tailor.h and providing the function in a target
    * dependent module.
    */
    void
    make_simple_name (char *name)
    {
        char *p = strrchr(name, '.');
        if (p == NULL) return;
        if (p == name) p++;
        do {
            if (*--p == '.') *p = '_';
        } while (p != name);
    }



     
     
  • 5.97, Tron is Whistling (?), 22:00, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Тут-то как раз всё нормально. Контекст.
     
  • 2.66, Аноним (65), 19:30, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Процессоры, выпущенные в последние лет 15-20 вполне могут распознать обратную итерацию. И даже итерацию в любую сторону с большим шагом, и даже несколько параллельных итераций. Так что с кешем всё в порядке, не переживайте.
     

  • 1.55, Аноним (55), 18:00, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Кто Генту хаял из-за ничтожных 3% прироста производительности? Наука - понимать надо.
     
     
  • 2.61, Аноним (61), 18:36, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    1.3% - это ниже уровня стат. погрешности. Статья лежит не рецензированная. Такое достижение нормальные рецензенты не пропустят.
     
     
  • 3.89, Аноним (46), 11:02, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Вот не надо пытаться показаться умным, не зная значения термина.
     

  • 1.74, Tron is Whistling (?), 23:09, 16/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Не, я к этим ребятам не зайду. Пример уж слишком весел.

    do {
      if (*--p == '.') *p = '_';
    } while (p != name);

    Если p не байт, а длина (p - start) в байтах не кратна sizeof(*p), будет интересно :D

     
     
  • 2.76, Tron is Whistling (?), 23:13, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да и если p < start - тоже внезапно окажется не менее весело.
     
  • 2.77, Tron is Whistling (?), 23:14, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Но если до проверки p > start или установки p = start + X догонит каждый второй студент третьего курса аграрного, то вот с кратностью могут быть проблемы.
     
  • 2.78, Аноним (65), 02:47, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Если p не байт, а длина (p - start) в байтах не кратна sizeof(*p), будет интересно :D

    Это будет означать, что один из указателей не выровнен, что значит UB и косяк программиста. На практике надо явно постараться, чтобы этого добиться.

     
     
  • 3.84, n00by (ok), 08:21, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> Если p не байт, а длина (p - start) в байтах не кратна sizeof(*p), будет интересно :D
    > Это будет означать, что один из указателей не выровнен, что значит UB

    Он имел ввиду "не кратна размеру операнда SIMD инструкции", но сформулировал ошибочно. А указатели на char всегда "выровнены".

     
     
  • 4.104, Tron is Whistling (?), 08:09, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А кто сказал, что там char. Из вырванных из контекста строк не видно.
     
     
  • 5.107, n00by (ok), 09:25, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Видно. Там '_' вместо L'_'.
     
     
  • 6.110, Аноним (98), 13:02, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Фантазировать можно в любую сторону. Сравнивать с '_' можно хоть int, хоть double.
     
     
  • 7.112, n00by (ok), 09:06, 19/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Фантазировать можно в любую сторону. Сравнивать с '_' можно хоть int, хоть
    > double.

    Аноним - игнорим.

     
  • 4.109, Аноним (98), 12:59, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Я читаю то, что написано, и написано там было совсем не то, что у вас. И сдаётся мне, что автор имел ввиду то, что он написал, а не то, что кажется вам.
     
     
  • 5.113, n00by (ok), 09:09, 19/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Мне ничего не кажется - я посмотрел и понял листинг в статье. Проблема с гранулярностью касается размера операнда
    %1 = icmp eq %0, <46, 46, 46, ... , 46>
     
  • 2.85, n00by (ok), 08:26, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Там наверняка отдельных два цикла: один обрабатывает байты пачкой, а второй остаток. Ну и поскольку средняя длина строки меньше размера пачки, оптимизированная часть за пределами синтетических тестов не работает.) Смотрите pdf - в ряде случаев оптимизация приводит к ухудшению результатов тестов.
     

  • 1.92, pavlinux (ok), 12:45, 17/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Открою секрет, чтоб подсчитать определитель матрицы иль
    повернуть тело на 146°, полюбасу нужно перебрать все элементы матрицы.

     
  • 1.93, pavlinux (ok), 12:48, 17/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Пример оптимизации для Си-кода:
    >
    >  do {
    >   if (*--p == '.') *p = '_';
    >  } while (p != name);
    > Для операции сравнения штатный оптимизатор LLVM сгенерирует биткод для использования инструкций AVX-2:
    >
    >  %1 = shufflevector %0, <31, 30, 29, ... , 0>
    >  %2 = icmp eq %1, <46, 46, 46, ... , 46>
    >  %3 = shufflevector %2, <31, 30, 29, ... , 0>

    Cейчас кто-нибудь, вообще, ещё считает такты процессора?
    А то ж окажется, что 250 раз cmp + jnz будет быстрее трех SIMD инструкций

     
  • 1.94, Аноним (94), 13:01, 17/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Талантливые программисты:

    в среднем ускорение составило 2.2%. При тестировании набора SPEC CPU2017 ускорение составило 1.3%.

    Патчи к ядру для защиты от очередной дырки в процессоре:

    замедление 20..75%, на некоторых задачах до 400%, при применении защиты процессоры иногда взрываются, но, пожалуйста, не волнуйтесь, это только в очень редких случаях, которые хорошо описаны в документации

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру