LINUX.ORG.RU

Кроссплатформенно намекнуть компилятору, что обнуляемой памятью не надо засорять кеш

 , , , ,


0

3

Для начала работы некоторого алгоритма необходимо подготовить массив из 128-ми void*, заполненный нулями. Массив выделяется при помощи aligned_alloc, поэтому гарантированно выравнен по sizeof(void*[128]).

При этом алгоритм будет обращаться к элементам этого массива по хитро вычисляемым индексам и подавляющее большинство обращений пойдёт к первым 8 элементам, остальные 120 будут использоваться крайне редко.

Поскольку данные хорошо выровнены, и не потребуются в кеше - по идее наиболее быстрый способ - отправить их в память при помощи streaming non-temparal - что-то типа _mm512_stream_si512 - оно же VMOVNTDQA для x86.

Но как можно кросс-архитектурно намекнуть компилятору, что тут будет уместна такая инструкция?

То что данные выронены на 64 байта наверное можно объяснить, обнулив младшие биты указателя, с которым идёт работа. А вот как выразить на С совет не помещать данные в кеш - непонятно

★★
Ответ на: комментарий от Sorcerer

А, нет. В последних версиях gcc, как я понял, оно и без намёков будет генерировать эти инструкции для обнуляемого цикла, если собирать с -Ofast -fprefetch-loop-arrays

Sorcerer ★★★★★
()

Никак, лол. Ну или напиши свою обертку через __builtin_ia32_movntdq512 и остальные.

mix_mix ★★★★★
()
Последнее исправление: mix_mix (всего исправлений: 1)

похотливо намекни ему на асме

darkenshvein ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.