|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Кеш линии процессора09.12.2016, 10:18. Показов 8614. Ответов 14
Метки нет (Все метки)
Очень часто со стороны программистов можно заметить утверждение
"Вот эти данные скорее всего попадут в кеш линию процессора" - на чем основываются программисты, когда делают подобные выводы? Еще интересует то, что если данные которые претендуют на попадание в кеш превышают размер одной линейки кеша, могут ли они сохраниться сразу в двух линейках последовательно? Например есть массив L1 ---60% от последовательных данных--- L2 ---40% от последовательных данных(а остаток свободного места занят другими данными)---
0
|
|
| 09.12.2016, 10:18 | |
|
Ответы с готовыми решениями:
14
Кеш процессора Не обновляется кеш для потоков
|
|
|
|||
| 09.12.2016, 15:40 | |||
Сообщение было отмечено Undisputed как решение
Решение
Кэш лайн - это сплошной кусок памяти размером в 32 байта, выровненный на такой же размер. Этот размер может быть 64 или 128 байт (или ...) - зависит от конкретного устройства процессора. Для простоты буду называть его словами "32 байта".
При обработке запроса в память со стороны процессорв, реальное обращение в память происходит кусками по 32 байта. Т.е. если мы читаем из памяти 1 байт, то в реальности прочтётся кусок размером 32 байта с адреса, выровненного на 32. И весь этот кусок попадёт в кэш в виде кэш-лайна. Допустим, мы читаем байт по адресу 65, в реальности из памяти прочтётся 32 байта из диапазона адресов 64-95 и весь этот кусок памяти осядет в кэше, а до исполнительного устройства дойдёт только один нужный байт. Если после этого мы захотим прочесть один байт по адресу 66, то он уже прочтётся из кэша
4
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 10.12.2016, 01:52 [ТС] | ||
|
Evg,
Большое спасибо! 2. Что делать если используется большой пул памяти? достаточно что бы его начальный адрес был выровнен на 32? Или внутри пула относительно содержимых там типов так же нужно применять выравнивание? Добавлено через 6 минут И как понять какое выравнивание требует процессор для кеша(которое как я понял должно быть равно размеру линейки) что бы когда программа запускалась на разных процессорах всегда использовать эффективное выравнивание
0
|
||
|
|
||||
| 10.12.2016, 11:44 | ||||
|
C int a[100] __attribute__((aligned(32))); C #if defined __386__ # define CACHELINE 32 #elif defined __sparc__ # define CACHELINE 64 #elif defined __arm__ # define CACHELINE 128 #else /* Консервативное значение. Переменная, выровненная на 128 байт * автоматически будет выровнена на 16, 32, 64 */ # define CACHELINE 128 #endif
1
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 10.12.2016, 14:10 [ТС] | ||||
![]() Добавлено через 1 час 11 минут
0
|
||||
|
|
|||||
| 10.12.2016, 14:21 | |||||
|
1
|
|||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 10.12.2016, 14:34 [ТС] | ||
|
0
|
||
|
|
|||
| 10.12.2016, 15:17 | |||
|
Здесь я говорю именно про кусок памяти, через new массив объектов напрямую, конечно же, так не выделишь. Т.е. через new нужно выделить кусок памяти (грубо говоря, массив char'ов), затем вычислить нужный адрес начала и через placement new натянуть массив объектов на эту память. Каждый объект можно искусственно добить нужным количеством неиспользуемых полей, чтобы размер каждого объекта был кратен 32 байтам
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 10.12.2016, 15:26 [ТС] | ||
|
Кажется понял
Если я все правильно понял, думаю самый нормальный вариант это как ты сказал для каждого объекта в пуле отдельно выделять память, например как массив char или с помощью operator new, размер которых будет равен sizeof объекта + столько байт, что бы размер объекта в пуле был кратен размеру кеш линии.
0
|
||
|
|
||
| 10.12.2016, 15:30 | ||
|
C struct MyObj { char my_fields[57]; char unused_padding[7]; }
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 10.12.2016, 15:38 [ТС] | ||
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 10.12.2016, 16:04 [ТС] | |
|
Evg,
Ага ![]() Спасибо тебе, очень помог! Добавлено через 18 минут Evg, Ещё один вопрос назрел Предположим длина линейки кеша равна 128 а размер объекта хранимого в пуле равен 63. Так как это пул объекты железно следуют друг за дружком(плотно расположены). Если выравнивать до 128 то получится нам нужно будет добавить 65 байт мусора если выравнивать каждый объект по размеру линейки. Можно анализировать размер кеш линии (если есть такая возможность) и таким образом уместить в одной линейке не один объект, а два, прибавив по одному байту к каждому объекту сделав их размер 64. Затем проц запишет эти 128 байт в кеш и уже два объекта будут закешированы вместо одного. Но тут палка двух концов, насколько я понимаю, если один из этих двух объектов будет изменен, то будет сброшен кеш всей линии
0
|
|
|
|
|||
| 10.12.2016, 16:13 | |||
|
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 10.12.2016, 16:21 [ТС] | |
|
Evg,
Понял, спасибо!
0
|
|
| 10.12.2016, 16:21 | |
|
Помогаю со студенческими работами здесь
15
Как поместить переменную в кеш процессора Короткое замыкание по линии 12 вольт дополнительного питания процессора
Рисование дополнительной линии под углом к основной линии Построить линии равного уровня (линии контура) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|