Как объявить диапазон памяти как не кешируемый с помощью gcc на платформе x86? - PullRequest
10 голосов
/ 14 сентября 2011

Хотя я читал об инструкциях movntdqa по этому поводу, но изобрел чистый способ выразить не кэшируемый диапазон памяти или прочитать данные, чтобы не загрязнять кэш. Я хочу сделать это из GCC. Моя главная цель - переключаться на случайные места в большом массиве. Надеемся ускорить эту операцию, избегая кэширования, так как данных очень мало.

Ответы [ 2 ]

7 голосов
/ 18 сентября 2011

Я думаю, что вы описываете Регистры диапазона типов памяти . Вы можете управлять ими в Linux (если доступно и пользователь 0), используя /proc/mttr / ioctl(2), см. здесь для примера. Поскольку он работает в физическом диапазоне адресов, я думаю, вам будет трудно использовать его разумным образом.

Лучший способ - взглянуть на встроенные функции компилятора, которые GCC предоставляет и найти одно или несколько выражений, которые выражают ваше намерение. Взгляните на серию Ульриха Дреппера на тему «Что должен знать каждый программист о памяти», в частности part 5 , посвященной обходу кэша. Похоже, что _mm_prefetch(ptr, _MM_HINT_NTA) может подойти для ваших нужд.

Как всегда, когда дело доходит до производительности - измерять, измерять, измерять. Серия Drepper содержит отличные детали, подробно описывающие, как это можно сделать ( part 7 ), а также примеры кода и другие стратегии, которые можно попробовать при ускорении производительности памяти вашего кода.

2 голосов
/ 24 сентября 2011

Всем полезных советов от пользователя786653; особенно статья Ульриха Дреппера. Я добавлю:

  • Вне кэшированного или нет, VM HW будет вынуждена искать информацию о странице в TLB, которая имеет ограниченную емкость. Не стоит недооценивать влияние перехвата TLB на производительность произвольного доступа. Если вы еще этого не сделали, посмотрите результаты здесь , чтобы узнать, почему вы действительно хотите использовать огромные страницы для данных массива, а не для подросткового 4K по умолчанию что восходит ко временам "640K должно быть достаточно для всех"). Конечно, если вы говорите действительно огромные массивы, большие, на которые может ссылаться даже TLB, заполненный 2-мегабайтными страницами, даже это не поможет.

  • Что вы получили вопреки инструкциям 'nt' (например, _mm_stream_ps встроенная)? Я не уверен, что объявление некэшированных страниц даст вам лучшую производительность, чем их правильное использование, и их гораздо проще использовать, чем альтернативы. Было бы очень интересно увидеть доказательства обратного.

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