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

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

11.04.2017, 16:49. Показов 3342. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru