Как мне легче всего предварительно выбрать область памяти? - PullRequest
8 голосов
/ 20 октября 2010

Справочная информация: Я реализовал стохастический алгоритм, который требует случайного упорядочения для лучшей сходимости. Однако это явно разрушает локальность памяти. Я обнаружил, что при предварительной выборке данных следующей итерации падение производительности сводится к минимуму.

Я могу предварительно выбрать n строк кэша, используя _mm_prefetch простым, в основном ОС + переносимым компилятором способом - но какова длина строки кэша? Прямо сейчас я использую жестко запрограммированное значение 64, что в настоящее время является нормой для процессоров x64, но я не знаю, как это обнаружить во время выполнения, и вопрос об этом в прошлом году не нашел простого решение .

Я видел GetLogicalProcessorInformation на окнах, но я опасаюсь использовать такой сложный API для чего-то такого простого, и это не сработает на Mac или Linux.

Возможно, есть какой-то совершенно другой API / встроенный модуль, который может предварительно выбирать область памяти, определяемую в виде байтов (или слов, или чего-то еще), и позволяет мне выполнять предварительную выборку, не зная длины строки кэша?

В принципе, есть ли разумная альтернатива _mm_prefetch с #define CACHE_LINE_LEN 64?

1 Ответ

5 голосов
/ 20 октября 2010

Есть вопрос, задающий примерно то же самое здесь .Вы можете прочитать его из CPUID, если хотите погрузиться в какую-то сборку.Для этого вам, конечно, придется написать код для конкретной платформы.

Возможно, вы уже знакомы с руководствами по оптимизации от Agner Fog, которые предоставляют информацию о кеше для многих популярных процессоров.Если вы можете определить ожидаемый процессор, с которым вы столкнетесь, вы можете просто жестко закодировать размеры строк кэша и посмотреть информацию о поставщике процессора, чтобы установить размер строки.

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