Фон: Я реализовал стохастический алгоритм, который требует случайного упорядочения для лучшей конвергенции. Однако это явно разрушает локальность памяти. Я обнаружил, что, предварительно запрограммировав данные следующей итерации, падение производительности сведено к минимуму.Как можно запрограммировать область памяти наиболее легко?
Я могу предварительно выбрать 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
?
Duplicate: http://stackoverflow.com/questions/794632 –
Я понимаю, что вопрос существует, однако на мой вопрос нет ответа, и он гораздо более общий (мне все равно, что на платформах x64 существуют _mm_prefetch и только для целей предварительной выборки). Возможно, это может быть разрешимо без явного получения длины строки кэша. Нет, я не очень надеюсь здесь ... –
@EamonNerbonne: Если вы только спрашиваете о архитектуре x64, поставьте это в свой вопрос. –