Как std :: alignas оптимизирует производительность программы?

В 32-битной машине один цикл чтения из памяти получает 4 bytes данных.

Таким образом, для чтения ниже буфера, это должно занять 32 цикла чтения, чтобы прочитать буфер 128 bytes упомянуто ниже.

char buffer[128];

Теперь, предположим, что если я выровнял этот буфер, как указано ниже, то, пожалуйста, дайте мне знать, как он сделает чтение быстрее?

alignas(128) char buffer[128];

Я предполагаю, что цикл чтения из памяти останется только 4 байта.

3

Решение

Размер регистров, используемых для доступа к памяти, — это только одна часть истории, другая часть — это размер строки кэша.

Если строка кеша составляет 64 байта и ваш char[128] естественно выровнен, процессор обычно должен манипулировать тремя различными строками кэша. С alignas(64) или же alignas(128)нужно коснуться только двух строк кэша.

Если вы работаете с файлом, отображенным в память, или в условиях перестановки, включается следующий уровень выравнивания: размер страницы памяти. Это потребует 4096 или 8192 байтов.

Однако я серьезно сомневаюсь, что alignas() имеет какой-либо значительный положительный эффект, если указанное выравнивание больше, чем естественное выравнивание, которое компилятор использует в любом случае: это значительно увеличивает потребление памяти, что может быть достаточным для запуска большего количества строк кэша / страниц памяти, к которым прежде всего обращаются. Следует избегать только небольших смещений, поскольку они могут вызвать огромное замедление работы некоторых процессоров или могут быть совершенно незаконными / невозможными для других.

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

4

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

В 32-битной машине один цикл чтения из памяти получает 4 байта данных.

Это не так просто. Просто термин «32-битная машина» уже слишком широк и может означать много вещей. Регистры 32b (регистры GP? Регистры ALU? Регистры адресов?)? Шина адреса 32b? Шина данных 32b? 32b размер слова инструкции?

А также «чтение памяти» кем. ЦПУ? Cache? Чип DMA?

Если у вас есть платформа HW, где память читается на 4 байта (выровнены на 4) за один цикл и без кеша, то alignas(128) не будет делать разницы (чем alignas(4)).

1