Помощь векторизации
Ключевое слово restrict
Спецификатор restrict означает, что этот указатель единственное средство доступа к соответствующему объекту. Его можно применять только указателям. Наличие спецификатора расширяет возможности компилятора по оптимизации.
По своей сути мы обещаем, что этот указатель будет первым и единственным способом доступа к соответствующей области памяти в соответствующем блоке кода (функции). В свою очередь, компилятор обещает его ускорить.
Если спецификатор не установлен, то компилятор будет использовать пессимистичные оптимизации.
Часто такой спецификатор применяется в отношении формальных параметров стандартных функций библиотеки языка С.
void * memcpy (void * restrict ptr1, void * restrict ptr2, size_t n);
Спецификаторы, применённые к параметрам функции копирования, обозначают , что эти области памяти ptr1 и ptr2 не пересекаются.
Выравнивание данных
Оперирование данными происходит кэш линиями по 64 байта. SSE и AVX инструкции всегда попадают в кэш линию если данные выравнены на границу 16 или 32 байта.
Выравнивание данных производится для правильного и быстрого доступа центрального процессора к ячейкам памяти. В зависимости от разрядности системы расположение классов/структур в памяти может начинаться с адресов кратных 32 или 64 битам. Внутри самих классов/структур поля также могут выравниваться по границе 32, 16 или 8 бит.
Но выравнять данные само по себе не достаточно — необходимо информировать компилятор о том, что известно вам, и тогда можно получить на выходе наиболее эффективное приложение.