Ошибки, баги, вопросы - страница 2505
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Довёл до ума первоначальную идею (в первом коде неправильно считал адреса). Если не затруднит, то интересно будет посмотреть на результат у вас.
По своей сути с/без WRONG_ALIGNED происходит одно и то же - на каждом while пишем в две соседние кеш-линии (запись в pad всегда в правильный адрес), разница лишь в том, что при WRONG_ALIGNED случаются случаи(не всегда), когда одна из записей в ar происходит в uint, который не попадет целиком в кеш-линию, у меня стабильная разница около 1.5 раз.Поясните пожалуйста, что вы пытаетесь получить данной строкой? В предыдущем примере это был мусорный код.
Поясните пожалуйста, что вы пытаетесь получить данной строкой? В предыдущем примере это был мусорный код.
Находим наше положение в текущей кеш-линии (в той, где находится pad) и берём такой индекс для ar[], что элемент с ним находится в следующей кеш-линии (возможно элемент находится в двух кеш-линиях при WRONG_ALIGNED)
Находим наше положение в текущей кеш-линии (в той, где находится pad) и берём такой индекс для ar[], что элемент с ним находится в следующей кеш-линии (возможно элемент находится в двух кеш-линиях при WRONG_ALIGNED)
Вот теперь речь идёт о смещении. Но то что вы показываете это чисто синтетический пример, который в жизни никогда не встретится. А на реальных примерах выигрыш в скорости в лучшем случае будет около 1%. Ради такого мизерного ускорения и городить огород не следует.
П. С. Кроме того вы неверно посчитали размер регистра.Вот теперь речь идёт о смещении. Но то что вы показываете это чисто синтетический пример, который в жизни никогда не встретится. А на реальных примерах выигрыш в скорости в лучшем случае будет около 1%. Ради такого мизерного ускорения и городить огород не следует.
Нет, это вполне реальный пример. В нём лишь 25% записей происходит в "проблемные" места на стыке кеш-линий. Много ли это? Например, у вас массив из long double, в одну кеш-линию поместятся лишь 4 значения, и если вы не заморачиваетесь с выравниванием (и за вас не делает это компилятор), то вы получаете 25% проблемных даблов - как раз как в моём примере. Тут ещё много нюансов, которые говорят за выравнивание, но я не буду о них - недостаточно всесторонне владею вопросом.
Ну хозяин барин.
Нет, это вполне реальный пример. В нём лишь 25% записей происходит в "проблемные" места на стыке кеш-линий. Много ли это? Например, у вас массив из long double, в одну кеш-линию поместятся лишь 4 значения, и если вы не заморачиваетесь с выравниванием (и за вас не делает это компилятор), то вы получаете 25% проблемных даблов - как раз как в моём примере. Тут ещё много нюансов, которые говорят за выравнивание, но я не буду о них - недостаточно всесторонне владею вопросом.
Ну хозяин барин.
Ещё раз говорю вы путаете размер регистра.
Ещё раз говорю вы путаете размер регистра.
Обоснуйте
Регистры измеряются не в байтах, а в битах. Следовательно эта строчка некорректно используется во всём остальном коде:
Регистры измеряются не в байтах, а в битах. Следовательно эта строчка некорректно используется во всём остальном коде:
Нет, вы что-то странное говорите. Я не собираюсь это доказывать. Посмотрите документацию к процессору, почитайте здесь https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876
Мне не нужны регистры, я вообще не о них.
Нет, вы что-то странное говорите. Я не собираюсь это доказывать. Посмотрите документацию к процессору, почитайте здесь https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876
Мне не нужны регистры, я вообще не о них.
Хм... Ладно. В общем кеш у разных моделей процессоров разный. И программно его размер не узнать. По этому на него глупо ориентироваться. А вот регистры у всех процессоров двух типов, и именно на размер регистров ориентируются опытные программисты. И даже ориентирование на регистры не всегда спасает, потому что между программой и процессором находятся компилятор и операционная система.
Кроме того данная строчка посчитана неверно и без учёта регистров:
Хм... Ладно. В общем кеш у разных моделей процессоров разный. И программно его размер не узнать. По этому на него глупо ориентироваться. А вот регистры у всех процессоров двух типов, и именно на размер регистров ориентируются опытные программисты. И даже ориентирование на регистры не всегда спасает, потому что между программой и процессором находятся компилятор и операционная система.
Опять мимо, все развивается, все больше упор делается на многопоточность, и вот вам пожалуйтса - крестовая стд библиотека вам всё расскажет
https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size