Практика языка C (МФТИ, 2023-2024). Семинар 7.2. Конвейер.

Поделиться
HTML-код
  • Опубликовано: 26 сен 2024

Комментарии • 33

  • @pompei2
    @pompei2 5 месяцев назад +9

    Для меня кэши проца всегда были какими-то неприступными крепостями, а тут раз-раз и всё ясно стало. Большая благодарность лектору от всей души

  • @sibedir
    @sibedir 5 месяцев назад +7

    Каждый вторник жду видосов от Сера Троглодита.
    Каждые выходные - от Константина. 👍

    • @tilir
      @tilir  5 месяцев назад +2

      Удивительное сравнение, вроде ничего общего. Хотя я тоже люблю геройские стримы ))

    • @sibedir
      @sibedir 5 месяцев назад +3

      @@tilir общее в таланте создавать ламповость и умиротворяющее повествование )

  • @serglarionov5560
    @serglarionov5560 5 месяцев назад +3

    Преподаватель от бога!

  • @БулатСадыков-д3ь
    @БулатСадыков-д3ь 3 месяца назад +1

    Большое спасибо, очень информативно

  • @v_zalygin
    @v_zalygin 5 месяцев назад +1

    Спасибо за семинар!

  • @alex_s_ciframi
    @alex_s_ciframi 3 месяца назад

    Константин, спасибо за лекцию.
    19:44 - так, ежели это отсортировать, то if становится не нужен )

    • @tilir
      @tilir  2 месяца назад

      Так мы же не знаем изначально сортировали или нет.

    • @tilir
      @tilir  2 месяца назад

      Мы заранее не знаем отсортирован вход или нет.

  • @rayrayray4653
    @rayrayray4653 5 месяцев назад +3

    Классно!!!

  • @DuplexKrokodile
    @DuplexKrokodile 5 месяцев назад +4

    Как обычно лайк за ранее)❤

    • @tilir
      @tilir  5 месяцев назад

      Вот это правильный подход. Если что всегда можно отжать обратно ))

  • @alexanderspeshilov839
    @alexanderspeshilov839 3 месяца назад

    К разделу "хитрая оптимизация" (31:26). Дело было вечером, делать было нечего, я немного поэкспериментировал с кодом и данной оптимизацией.
    1. У меня gcc выкидывает умножение и вместо imul делает условную загрузку регистра cmovle.
    2. Попытка использовать хак типа mask = (128 - arr[j]) >> 31 и потом arr[j] & mask никак не меняет время выполнения.
    3. Зато помогает явный переход в unsigned. Флаг сразу считаем в unsigned, явно переводим arr[j] в unsigned и потом умножаем. Тогда gcc делает cmp+cmovle+add и всё, cdqe не растягивает, ничего лишнего не делает. В данном случае такая оптимизация безопасна.
    У меня время в итоге такое:
    наивный несортированный ~ 3.5
    наивный сортированный ~ 0.55
    предложенная оптимизация ~ 0.7 (сорт == несорт)
    оптимизация c unsigned ~ 0.59 (сорт == несорт) - на 15% быстрее
    PS: Я также помотрел clang. Там есть отличия, любопытные, но непринципиальные.
    PPS: Бессмысленность и хрупкость последней оптимизации я отлично понимаю. Полез потыкать пример просто из интереса - проврить (128 - arr[j]) >> 31, но случайно увлёкся :)
    PPPS: На то как лишние конвертации signed съедают производительность я натыкался раньше, поэтому попробовал.

  • @johndick996
    @johndick996 5 месяцев назад +4

    Константин, большое спасибо за семинар!

  • @ruslankhl
    @ruslankhl 5 месяцев назад +1

    Спасибо!

  • @barsik5943
    @barsik5943 5 месяцев назад +4

    виртуально на ваших семинарах находится примерно по четыре тысячи любопытных глаз

  • @sanya8028
    @sanya8028 2 месяца назад

    Константин, большое спасибо за лекцию! Какую литературу Вы можете посоветовать по данной тематике?

    • @tilir
      @tilir  2 месяца назад +2

      Харрис и Харрис если хочется глубоко понять тему.

  • @MVZ1983
    @MVZ1983 4 месяца назад

    Аппаратные кэши, конвейеры, транзисторы, конденсаторы... Как же низко мы пали!

  • @Stedmiel
    @Stedmiel 5 месяцев назад

    24:40 в аппаратные счетчики умеет дефолтный линуксовый perf, к слову говоря. на винде это умеет делать не менее дефолтный ETW, но насколько помню- там было все не очень хорошо с документацией.

  • @AnarchySane
    @AnarchySane 5 месяцев назад

    В такие моменты начинаю понимать почему Си будет еще очень живее всех живых. ❤
    Ощущаю себя тупым, но я же JS’эсер 😂

  • @ddvamp
    @ddvamp 2 месяца назад

    1:06:43 Константин, не знаете ли вы, параллелятся ли аппаратно обращения к разным set внутри кэшей? (т.е. нужно ли ждать завершения работы с set0, чтобы начать следующее действие с set1) Если так, то кажется даже в случае одного прохода по памяти при попадании в один set мы будем получать замедление

    • @tilir
      @tilir  2 месяца назад

      Кстати интересная задача для экспериментирования.

  • @alexeydurnev9500
    @alexeydurnev9500 5 месяцев назад

    Константин! Огромное спасибо за семинар, очень кратко и максимально по делу! Есть вопрос: В обращении к студентам вы упомянули архитектуру их задания и распределение ролей в команде. Будут ли еще на канале видео, посвященные программной архитектуре? Или по взаимодействию в команде разработчиков?

    • @tilir
      @tilir  5 месяцев назад

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

  • @СергейДавыдов-е6й
    @СергейДавыдов-е6й 5 месяцев назад +1

    Быстрее бы...

  • @dervishsy
    @dervishsy 5 месяцев назад

    Жесть

    • @dervishsy
      @dervishsy 5 месяцев назад +1

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

    • @dervishsy
      @dervishsy 5 месяцев назад

      Возникает вопрос как процесс написания программы, учитывающей использование аппаратных кэшей, сочетается с векторизацией

  • @alexloktionoff6833
    @alexloktionoff6833 5 месяцев назад

    Pipeline - дословно трубопровод. Это похоже калька с русского термина водопроводный принцип организации управления, который впервые открыто ввел советский ученый А.С. Лебедев. Сейчас уже известно что и до этого была аппаратура специального назначения и на западе и в СССР, которая использовала этот принцип, но открыто впервые использовал его все-таки Лебедев. И хотя принцип работы может и проще объяснять на примере заводского конвейера, мне кажется важно помнить о корнях.

    • @tilir
      @tilir  5 месяцев назад +1

      Я кстати никогда не понимал а почему трубопровод. С водой текущей по трубе ничего не случается, а казалось бы суть именно в изменениях. В историческом смысле вы, вероятно, правы, похоже термин растёт именно отсюда. Вообще конечно очень не повезло что на заре вычислительной техники в СССР не было малого бизнеса и неоткуда было взяться ни советскому Интелу ни советскому IBM. В итоге вся ветка получилась кривоватой и не выпрямилась до сих пор.