Поддерживает ли Visual Studio C / C ++ автоматическую предварительную выборку программного обеспечения?

Компиляторы как Intel а также IBM XLC может вставлять инструкции предварительной выборки данных автоматически.

У меня есть код, который может помочь с предварительной загрузкой за счет читабельности. То есть существует естественная группировка кода, как

void foo(...){ // foo gets called frequently
...
char *myPtr = allocate(medium_size);
memset(myPtr,0,medium_size)  // cache misses here. medium_size is ~ 1 cache line
// Miss occurs on first access by memset, but not enough
// data to ameliorate by any hardware prefetching
// triggered by memset.  Basically foo() is called a lot

стоимость промахов кеша, понесенных memset, может быть уменьшена путем увеличения выделения в процедуре и немедленного выполнения команды предварительной выборки с достаточным количеством инструкций между ним и memset для того, чтобы было время для переноса данных в кэш. В моем случае код для вычисления medium_size становится немного запутанным, когда продвигается дальше в процедуре, делая его менее читабельным.

Если бы компилятор мог перенести код для меня, чтобы сделать предварительную выборку полезной (возможно, при поддержке PGO) тогда я мог бы получить лучшее из обоих миров.

Пока что кажется, что Visual Studio поддерживает только встроенные функции, то есть ручное размещение инструкций предварительной выборки. Я ошибся?


Обновление разъяснений в ответ на вопросы:

Q: Как компилятор может улучшить приведенный выше код? A: приведенный выше код был только для того, чтобы дать представление о том, что происходит. Фактический код более сложен, но сводится к выделению и хранению в нем. Чтение осуществляется с помощью memset при записи в память. На некоторых архитектурах это может не вызывать промах кэша, но на x86 это очевидно (в соответствии с vTune) (отвечает markgz ниже).

Q: Не будет ли достаточно просто использовать memset? Шаблон доступа к памяти memset очень предсказуем, и механизм аппаратной предварительной выборки должен с этим справиться.
A: Да, в общем, это правда, и я плохо объяснил контекст.
Подпрограмма (foo), содержащая memset, вызывается очень часто, и это первый доступ к памяти через memset, который вызывает промах кэша. Для memset недостаточно данных, чтобы исправить эту ошибку с помощью предварительной выборки, поэтому перед вызовом memset мне нужно выполнить предварительную выборку.

3

Решение

да, вы можете использовать

void _mm_prefetch (char *, int)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]