2010-10-20 2 views
7

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

Я могу предварительно выбрать n строки кэша с использованием _mm_prefetch в простой, в основном OS + компилятор-переносной моде, но какова длина строки кэша? Прямо сейчас я использую твердое значение 64, которое в настоящее время является нормой на процессорах x64, но я не знаю, как это обнаружить во время выполнения, и a question about this last year found no simple solution.

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

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

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

+0

Duplicate: http://stackoverflow.com/questions/794632 –

+2

Я понимаю, что вопрос существует, однако на мой вопрос нет ответа, и он гораздо более общий (мне все равно, что на платформах x64 существуют _mm_prefetch и только для целей предварительной выборки). Возможно, это может быть разрешимо без явного получения длины строки кэша. Нет, я не очень надеюсь здесь ... –

+0

@EamonNerbonne: Если вы только спрашиваете о архитектуре x64, поставьте это в свой вопрос. –

ответ

5

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

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

+0

Я не знаком с этим - спасибо! –

Смежные вопросы