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

 
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.
 
Vict:

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

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

Возможно, но пока вы меня не убедили.

Не подскажет, а нагадает. Внимательно читаем спецификацию.


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

 
Artyom Trishkin:

Если нет значения в буфере на баре, то это нужно явно прописать в буфере. Т.е., если рассчитанное значение должно быть выведено в буфер - записываем его в буфер, иначе - записываем пустое значение.

Спасибо, Артем.

 
Francuz:

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

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
                                3        1                    2                  4

Действия по порядку:

1 - получаем адрес первого эл-та ar[] в текущей структуре data.

2. узнаём его смещения от начал кэш-линии

3. находим кол-во байт от него до конца кэш-линии

4. узнаём кол-во интов, которые вместятся в это пространство до конца кэш-линии.


Вы у себя запускали? Разница в скорости есть? Или это лишь у меня?

 
Vict:

2. узнаём его смещения от начал кэш-линии

С чего вы взяли что так можно определить какое-то смещение?

 
От чего эти тормоза?
 
fxsaber:
От чего эти тормоза?
у динамического массива больше проверок, Ренат как-то писал, пост не найду, как раз в разговоре об обращении по индексу, почему существенно медленней плюсов
Причина обращения: