Есть ли способ убедиться, что переменная массива (unsigned int *) будет в памяти? - PullRequest
3 голосов
/ 08 июля 2011

Мне нужно установить значение по умолчанию для всех объектов в очень большом массиве.Это занимает довольно много времени (110-120 мс), и я подозреваю, что это происходит из-за промахов в памяти.

Я использую memset / std: fill для установки значения по умолчанию.Есть ли способ убедиться, что массив будет храниться в памяти перед записью / заполнением?

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Предполагая, что это большой файл с отображением в памяти, вы можете использовать madvise () libc с аргументом MADV_WILLNEED, чтобы указать ОС, что вы захотите получить доступ к упомянутой области.скоро.

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

0 голосов
/ 08 июля 2011

Скорее всего, у вас есть многоядерный процессор, а функции, такие как memset, фактически снижают производительность, когда не используются на одноядерных процессорах. Возможно, что блокировка мьютекса вызывает замедление. Попробуйте выделить память в стеке вместо динамической памяти. Так как это очень большой массив, я бы поэкспериментировал с созданием собственного менеджера памяти и сохранил его сегменты в нескольких потоках (но это была идея, которая у меня появилась после быстрого прочтения статьи). Стандартный способ сделать это - использовать один распределитель памяти на поток. В любом случае я бы посмотрел на что-то еще, кроме memset.

Может быть, следующий атик поможет

0 голосов
/ 08 июля 2011

Вы можете заблокировать память с гранулярностью на странице, используя mlock , но только до фиксированной суммы (я не уверен, какой предел установлен для OS X, но вы можете проверить это с помощью getrlimit с RLIMIT_MEMLOCK).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...