Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Эффективное выделение памяти

11.04.2017, 16:49. Показов 3470. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Много раз встречал что размер выделенной памяти рекомендуется округлять до степени двойки. Почему?

Так же еще встречался с мнением что в некоторых случаях лучше округлять размер выделенной памяти так, что бы она была равна размеру страницы памяти. То есть если нужно 4030 байт, то выделяют 4096?

Еще насколько я знаю размер страницы может быть разным. Если такое выделение эффективное (интересно почему), то есть ли переносимый способ узнать на этапе компиляции размер страницы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2017, 16:49
Ответы с готовыми решениями:

Эффективное использование памяти
Добрый день! Подскажите, пожалуйста, какой способ будет эффективнее всего использовать память при чтении строк из файла? Думала над...

Выделение памяти, проверка на утечку памяти
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Распределение памяти. Динамическое выделение памяти
an-1 an-2 ... a2

25
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
11.04.2017, 18:42  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Убежденный Посмотреть сообщение
Потому что cache line size гарантированно меньше, чем page size.
Я просто не могу понять почему Вот скажем есть 2 страницы в каждой из которой есть одна переменная int
Из твоих утверждений если я правильно понимаю эти две переменные не могут быть записаны в одну линейку
Но не могу понять почему... линейка же со страницами никак не связана, или я ошибаюсь?
То есть один поток может использовать две эти переменные которые попадут в одну линейку (насколько я знаю у проца нет специальной фичи чтоб разделять по разным линейкам данные из разных страниц)
И еще может быть так что все линейки имеют актуальные данные которые не нужно вытеснять но при этом есть возможность сложить данные с двух страниц в одну линейку. В противном случае инвалидировать актуальную линейку думаю было бы не эффективно
Я конечно ничего не утверждаю... просто так думается мне, объясни плиз в чем я ошибаюсь
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.04.2017, 18:53
Данные из памяти не попадают в кэш процессора "абы как". Если ты читаешь один байт
по адресу 0xF0007, то в кэш CPU попадет весь блок от 0xF0000 до 0xF001F включительно
(подразумеваем, что размер линии кэша - 32 байта). Как в эту же линейку могут попасть
данные из другой страницы, например 0xF1000?
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
11.04.2017, 19:13  [ТС]
Убежденный,
Блин, точно.
Вспомнил. Верно говоришь
Но тогда достаточно выравнивать по размеру кеш лайна чтоб понять кто с кем будет в одной линейке что тоже поможет избежать фолс шеринга

Добавлено через 14 минут
Убежденный,
А вот еще одна мысль. Есть например структура размер которой равен 32 байта
Первые 16 байт находятся в конце первой страницы а следующие 16 в начале второй (не уверен что так бывает)
Если так бывает то при чтении sizeof(cache_line) то с первой странице будет скачок на вторую чтоб прочитать всю структуру и положить в кеш.

Надеюсь я не сильно надоел))
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.04.2017, 19:23
Цитата Сообщение от sys_beginner Посмотреть сообщение
Блин, точно.
Вспомнил.
На всякий случай процитирую мануалы Intel (Combined Volume, Dec'2016)
11.1 INTERNAL CACHES, TLBS, AND BUFFERS
For Intel Core i7 processors and processors based on Intel Core, Intel Atom, and
Intel NetBurst microarchitectures, Intel Core Duo, Intel Core Solo and Pentium M processors,
the cache lines for the L1 and L2 caches (and L3 caches if supported) are 64 bytes wide.

The processor always reads a cache line from system memory beginning on a 64-byte boundary.
(A 64-byte aligned cache line begins at an address with its 6 least-significant bits clear.)
A cache line can be filled from memory with a 8-transfer burst transaction.
The caches do not support partially-filled cache lines, so caching even a single doubleword
requires caching an entire line.

The L1 and L2 cache lines in the P6 family and Pentium processors are 32 bytes wide, with
cache line reads from system memory beginning on a 32-byte boundary (5 least-significant bits
of a memory address clear.) A cache line can be filled from memory with a 4-transfer burst
transaction. Partially-filled cache lines are not supported.
----

Цитата Сообщение от sys_beginner Посмотреть сообщение
Но тогда достаточно выравнивать по размеру кеш лайна чтоб понять кто с кем будет в одной линейке что тоже поможет избежать фолс шеринга
Это верно.
Просто не существует хорошего и переносимого способа быстро определить
размер линейки кэша на текущем CPU. А page size, как правило, известен
еще на стадии компиляции.

Цитата Сообщение от sys_beginner Посмотреть сообщение
А вот еще одна мысль. Есть например структура размер которой равен 32 байта
Первые 16 байт находятся в конце первой страницы а следующие 16 в начале второй (не уверен что так бывает)
Если так бывает то при чтении sizeof(cache_line) то с первой странице будет скачок на вторую чтоб прочитать всю структуру и положить в кеш
Все верно. При условии, что ты не выравниваешь структуру на 32 байта или больше.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
11.04.2017, 19:41  [ТС]
Убежденный,
Ясно, спасибо!
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
11.04.2017, 21:30
Цитата Сообщение от sys_beginner Посмотреть сообщение
Первые 16 байт находятся в конце первой страницы а следующие 16 в начале второй (не уверен что так бывает)
Если так бывает то при чтении sizeof(cache_line) то с первой странице будет скачок на вторую чтоб прочитать всю структуру и положить в кеш.
4096 / 64 = 64 т.е. целое число, так что кэш-линия в пределах одной страницы будет находится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2017, 21:30

Выделение памяти
Вот кусок кода, класс и функция добавления в список Класс занимает 64 бита, я добавляю 10 элементов в список - 640 бит Потом отнимаю...

Выделение памяти(С = С++)
Привет. Нужна помощь, в выделении памяти. Есть код на С, нужно перевести его в С++. int SaveFileOne(int i) { FILE *f; if ((f =...

Выделение памяти
В чём ошибка выделения памяти? Подскажите, друзья! #include "stdafx.h" #include "stdio.h" #include <iostream> #include...

Выделение памяти
Доброго всем вечера. В книжке нашел задание: определить класс, представляющий стек. Сделал так, что при заполнении всего стека,...

Выделение памяти
Здравствуйте! #include<iostream> int main() { int *mass = new int ; int *mass2 = new int ; std::cout << (unsigned int)mass...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru