Ошибки, баги, вопросы - страница 2505

 
Vict:

Довёл до ума первоначальную идею (в первом коде неправильно считал адреса). Если не затруднит, то интересно будет посмотреть на результат у вас.

По своей сути с/без WRONG_ALIGNED происходит одно и то же - на каждом while пишем в две соседние кеш-линии (запись в pad всегда в правильный адрес), разница лишь в том, что при WRONG_ALIGNED случаются случаи(не всегда), когда одна из записей в ar происходит в uint, который не попадет целиком в кеш-линию, у меня стабильная разница около 1.5 раз.

Поясните пожалуйста, что вы пытаетесь получить данной строкой? В предыдущем примере это был мусорный код.

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
[Удален]  
Francuz:

Поясните пожалуйста, что вы пытаетесь получить данной строкой? В предыдущем примере это был мусорный код.

Находим наше положение в текущей кеш-линии (в той, где находится pad) и берём такой индекс для ar[], что элемент с ним находится в следующей кеш-линии (возможно элемент находится в двух кеш-линиях при WRONG_ALIGNED)

 
Vict:

Находим наше положение в текущей кеш-линии (в той, где находится pad) и берём такой индекс для ar[], что элемент с ним находится в следующей кеш-линии (возможно элемент находится в двух кеш-линиях при WRONG_ALIGNED)

Вот теперь речь идёт о смещении. Но то что вы показываете это чисто синтетический пример, который в жизни никогда не встретится. А на реальных примерах выигрыш в скорости в лучшем случае будет около 1%. Ради такого мизерного ускорения и городить огород не следует.

П. С. Кроме того вы неверно посчитали размер регистра.
[Удален]  
Francuz:

Вот теперь речь идёт о смещении. Но то что вы показываете это чисто синтетический пример, который в жизни никогда не встретится. А на реальных примерах выигрыш в скорости в лучшем случае будет около 1%. Ради такого мизерного ускорения и городить огород не следует.

Нет, это вполне реальный пример. В нём лишь 25% записей происходит в "проблемные" места на стыке кеш-линий. Много ли это? Например, у вас массив из long double, в одну кеш-линию поместятся лишь 4 значения, и если вы не заморачиваетесь с выравниванием (и за вас не делает это компилятор), то вы получаете 25% проблемных даблов - как раз как в моём примере. Тут ещё много нюансов, которые говорят за выравнивание, но я не буду о них - недостаточно всесторонне владею вопросом.

Ну хозяин барин.

П. С. Кроме того вы неверно посчитали размер регистра.
Да я его как бы вообще не считал ))
 
Vict:

Нет, это вполне реальный пример. В нём лишь 25% записей происходит в "проблемные" места на стыке кеш-линий. Много ли это? Например, у вас массив из long double, в одну кеш-линию поместятся лишь 4 значения, и если вы не заморачиваетесь с выравниванием (и за вас не делает это компилятор), то вы получаете 25% проблемных даблов - как раз как в моём примере. Тут ещё много нюансов, которые говорят за выравнивание, но я не буду о них - недостаточно всесторонне владею вопросом.

Ну хозяин барин.

Ещё раз говорю вы путаете размер регистра.

[Удален]  
Francuz:

Ещё раз говорю вы путаете размер регистра.

Обоснуйте
 
Vict:
Обоснуйте

Регистры измеряются не в байтах, а в битах. Следовательно эта строчка некорректно используется во всём остальном коде:

#define CACHE_LINE_SIZE 64
[Удален]  
Francuz:

Регистры измеряются не в байтах, а в битах. Следовательно эта строчка некорректно используется во всём остальном коде:

Нет, вы что-то странное говорите. Я не собираюсь это доказывать. Посмотрите документацию к процессору, почитайте здесь https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

On x86 cache lines are 64 bytes

Мне не нужны регистры, я вообще не о них.

Aligning to cache line and knowing the cache line size
Aligning to cache line and knowing the cache line size
  • 2011.09.02
  • MetallicPriestMetallicPriest 12.1k2929 gold badges135135 silver badges259259 bronze badges
  • stackoverflow.com
To prevent false sharing, I want to align each element of an array to a cache line. So first I need to know the size of a cache line, so I assign each element that amount of bytes. Secondly I want the start of the array to be aligned to a cache line. I am using Linux and 8-core x86 platform...
 
Vict:

Нет, вы что-то странное говорите. Я не собираюсь это доказывать. Посмотрите документацию к процессору, почитайте здесь https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

Мне не нужны регистры, я вообще не о них.

Хм... Ладно. В общем кеш у разных моделей процессоров разный. И программно его размер не узнать. По этому на него глупо ориентироваться. А вот регистры у всех процессоров двух типов, и именно на размер регистров ориентируются опытные программисты. И даже ориентирование на регистры не всегда спасает, потому что между программой и процессором находятся компилятор и операционная система.

Кроме того данная строчка посчитана неверно и без учёта регистров:

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
[Удален]  
Francuz:

Хм... Ладно. В общем кеш у разных моделей процессоров разный. И программно его размер не узнать. По этому на него глупо ориентироваться. А вот регистры у всех процессоров двух типов, и именно на размер регистров ориентируются опытные программисты. И даже ориентирование на регистры не всегда спасает, потому что между программой и процессором находятся компилятор и операционная система.

Опять мимо, все развивается, все больше упор делается на многопоточность, и вот вам пожалуйтса - крестовая стд библиотека вам всё расскажет

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

Кроме того данная строчка посчитана неверно и без учёта регистров:
Возможно, но пока вы меня не убедили.
std::hardware_destructive_interference_size, std::hardware_constructive_interference_size - cppreference.com
  • en.cppreference.com
These constants provide a portable way to access the L1 data cache line size.