Супер! Спасибо за такой ценный труд! Очень жду продолжения. Было бы очень круто побольше примеров как это эффективно использовать, код до и код после, как с перемножением матриц!
1:10:26 Данный пример также хорошо демонстрирует тот факт, что L3-кэш общий для всех ядер. Поэтому к моменту, когда наблюдаемое ядро вернется за следующим блоком информации, этот блок уже может отсутствовать вследствие работы другого ядра.
Константин, спасибо за лекцию. 48:06 - а можно ведь не маллок делать, а вторую матрицу по месту транспонировать, а после вычислений вернуть обратно. Так будет даже шустрее, наверное. Понимаю, что входной параметр менять - это так себе решение, но этот момент можно отразить в документации к функции
Несколько раз за лекцию прозвучало, что умножение матриц "квадратичное" по количеству операций. То ли я перегрелся от погоды, то ли это неточность. Если считать, что обе матрицы N x N, то количество умножений и сложений порядка N^3. Если за N взять количество элементов в матрице, то тоже N^2 не получается.
А зачем эта тема с пустыми вставками ассемблера? Чем gcc push /__attribute не устраивает? Типо под msvc может не работать? Я только на clang пишу. А под другие не знаю
Я не очень понимаю как вы будете выкручиваться через прагмы и атрибуты. Отмените оптимизации вокруг конкретной функции? Ну так там компилятор понавтыкает обращений к памяти и удачных замеров. Пустая ассемблерная вставка хороша тем что позволяет нам оставить O2 и это O2 будет честным везде вокруг неё. То есть мы отменяем оптимизацию очень точечно, ни атрибутами ни прагмами такого (насколько мне известно) не достичь.
@@tilir ага. Просто перед и после push/pop отключения оптимизаций. А в чем проблема? Думаете не сработает? Как по мне должно. Никогда просто не делал бенчмаркинг без оптимизаций. Увидел дополнение. Ну просто как по мне это написание велосипеда. Я готов поспорить. Завтра проверю. Отпишусь
@@tilir уже дважды написал. Удаляется комментарии. Прочитал политику размещения комментариев. Оказывается ссылки нельзя. Думал спек скинуть. Ну, в общем был не прав. Я думал прагмы работают везде. По спецификации gcc только над функциями. Печально. В любом случае спасибо за снипет
Правильно ли я понимаю что массивы, какими они не были большими или маленькими, всегда хранятся в RAM, и когда идёт чтение, то массив забрасываеться в кеши, и после выполнения идёт перезаписываться обратно в RAM. Имеется ввиду, то что кеши не являются плацдармом для постоянного хранения памяти?
Если что то кеширована в кеше лежит копия. Когда она вытесняется из кеша туда кладётся копия для чего то нового (скажем памяти к которой только что обратились).
Валгринд не сравним с ubsan, это тёплое против мягкого, т.к. ub будет ub и под валгриндом (и конечно никак им не диагностируется). А вот asan и даже asan + memsan он сильно превосходит в точности диагностики, проигрывая в скорости работы, т.к. там разные механизмы проверки.
Они для разных целей. Asan валидирует доступ к памяти. Valgrind утечки. Да, они оба могут проверять вещи из обоих категорий, но это не гарантированно. Лично я пишу на винде. И среди этого использую asan. Утечки памяти он прям почти никогда не находит.
попробую короткий комментарий. вдруг прокатит 12:40 Я в Visual Studio С++ вот так сделал: template inline void donothing(types ...args) { __asm { DONOTHING: }}
Великолепный преподаватель!
Клиффхэнгер про конвейеры в конце был зачётный 😊
Сюжет этих лекций не отпускает ни на секунду
Подписывайтесь и ставьте лай.. Подписывайтесь и ставьте лайки!
Константин, благодарю за Ваши труды.
Супер! Спасибо за такой ценный труд! Очень жду продолжения. Было бы очень круто побольше примеров как это эффективно использовать, код до и код после, как с перемножением матриц!
Повезло сегодня с ютубчиком
Браво! Огромное спасибо!
1:10:26
Данный пример также хорошо демонстрирует тот факт, что L3-кэш общий для всех ядер. Поэтому к моменту, когда наблюдаемое ядро вернется за следующим блоком информации, этот блок уже может отсутствовать вследствие работы другого ядра.
И снова лай за ранее)
Огромное спасибо!
Константин, спасибо за лекцию.
48:06 - а можно ведь не маллок делать, а вторую матрицу по месту транспонировать, а после вычислений вернуть обратно. Так будет даже шустрее, наверное.
Понимаю, что входной параметр менять - это так себе решение, но этот момент можно отразить в документации к функции
Изящная идея. Попробуйте замерить сколько сэкономите.
Надеюсь студенты запомнили про политику вытеснения. На первой лекции по плюсам им пригодится😅
У них на последнем занятии защита проекта. Запомнят все ))
36:30 небольшая оговорочка -- разряжаются конденсаторы, а не транзисторы
Да спасибо. Смешная оговорка. Конечно я имел в виду конденсатор.
Несколько раз за лекцию прозвучало, что умножение матриц "квадратичное" по количеству операций. То ли я перегрелся от погоды, то ли это неточность. Если считать, что обе матрицы N x N, то количество умножений и сложений порядка N^3. Если за N взять количество элементов в матрице, то тоже N^2 не получается.
Вы конечно правы, кубическая сложность. Про квадратичное это оговорка.
1:33:40 В программе ошибка, мы не добавляем в сумму, а переписываем сумму значением из массива
Да смешно получилось, спасибо за наблюдательность. Но с другой стороны вряд ли это влияет на суть примера ))
А зачем эта тема с пустыми вставками ассемблера? Чем gcc push /__attribute не устраивает? Типо под msvc может не работать? Я только на clang пишу. А под другие не знаю
Я не очень понимаю как вы будете выкручиваться через прагмы и атрибуты. Отмените оптимизации вокруг конкретной функции? Ну так там компилятор понавтыкает обращений к памяти и удачных замеров.
Пустая ассемблерная вставка хороша тем что позволяет нам оставить O2 и это O2 будет честным везде вокруг неё. То есть мы отменяем оптимизацию очень точечно, ни атрибутами ни прагмами такого (насколько мне известно) не достичь.
@@tilir ага. Просто перед и после push/pop отключения оптимизаций. А в чем проблема? Думаете не сработает? Как по мне должно. Никогда просто не делал бенчмаркинг без оптимизаций.
Увидел дополнение. Ну просто как по мне это написание велосипеда. Я готов поспорить. Завтра проверю. Отпишусь
@@tilir уже дважды написал. Удаляется комментарии. Прочитал политику размещения комментариев. Оказывается ссылки нельзя. Думал спек скинуть.
Ну, в общем был не прав. Я думал прагмы работают везде. По спецификации gcc только над функциями. Печально. В любом случае спасибо за снипет
@@wusikijeronii4510можете ссылку в телеграм-канал заслать. В комментарии сюда: t.me/cpp_lects_rus/165
Правильно ли я понимаю что массивы, какими они не были большими или маленькими, всегда хранятся в RAM, и когда идёт чтение, то массив забрасываеться в кеши, и после выполнения идёт перезаписываться обратно в RAM. Имеется ввиду, то что кеши не являются плацдармом для постоянного хранения памяти?
Если что то кеширована в кеше лежит копия. Когда она вытесняется из кеша туда кладётся копия для чего то нового (скажем памяти к которой только что обратились).
А чем valgrind лучше санитайзеров (asan, ubsan, etc)?
Валгринд не сравним с ubsan, это тёплое против мягкого, т.к. ub будет ub и под валгриндом (и конечно никак им не диагностируется).
А вот asan и даже asan + memsan он сильно превосходит в точности диагностики, проигрывая в скорости работы, т.к. там разные механизмы проверки.
Они для разных целей. Asan валидирует доступ к памяти. Valgrind утечки. Да, они оба могут проверять вещи из обоих категорий, но это не гарантированно. Лично я пишу на винде. И среди этого использую asan. Утечки памяти он прям почти никогда не находит.
branchless код и математика указателей
10:00 всегда ставлю сумматор типа sum^=j;
Ну тут компилятор в принципе может сделать ничто, аналитически это легко посчитать.
С!!!!!
я никогда не слышал ничего подобного. массив-чтобы быстро найти. список - чтобы быстро заменить.
чё ютуб опять мои комментарии удаляет? (((
о. восстановился 1.
попробую тут
Не. Удаляет и всё.
Ютуб удаляет комментарии с кодом к видео про программирование 🤦♂️
попробую короткий комментарий. вдруг прокатит
12:40
Я в Visual Studio С++ вот так сделал:
template
inline void donothing(types ...args) { __asm { DONOTHING: }}
Напишите его на канал в телеграме, там тоже есть комментарии.
А как сделать чтобы работало в C?
Вот совсем недавно думал над такой мыслью: Оптимизировать find/ lower_bound для последовательных данных с учётом кэшей. Может стоит попробовать?