Как объявить диапазон памяти как неустранимый с использованием gcc на платформе x86?

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

Ответ 1

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

Лучше всего посмотреть на встроенные компиляторы GCC предоставляет и найти один или несколько, что выражает ваши намерения. Посмотрите на серии Ульриха Дреппера "Что каждый программист должен знать о памяти", в частности часть 5, которая касается обхода кеша. Похоже, что _mm_prefetch(ptr, _MM_HINT_NTA) может быть уместным для ваших нужд.

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

Ответ 2

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

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

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