Как std::alignas оптимизирует производительность программы?
В 32-битной машине один цикл чтения из памяти получает 4 bytes
данных.
Таким образом, для чтения ниже буфера, это должно занять 32 цикла чтения, чтобы прочитать буфер 128 bytes
упомянуто ниже.
char buffer[128];
Теперь, предположим, что если я выровнял этот буфер, как указано ниже, то, пожалуйста, дайте мне знать, как он сделает чтение быстрее?
alignas(128) char buffer[128];
Я предполагаю, что цикл чтения из памяти останется только 4 байта.
2 ответа
Размер регистров, используемых для доступа к памяти, - это только одна часть истории, другая часть - это размер строки кэша.
Если строка кеша составляет 64 байта и ваш char[128]
естественно выровнен, процессор обычно должен манипулировать тремя различными строками кэша. С alignas(64)
или же alignas(128)
нужно коснуться только двух строк кэша.
Если вы работаете с файлом, отображенным в память, или в условиях перестановки, включается следующий уровень выравнивания: размер страницы памяти. Это потребует 4096 или 8192 байтов.
Однако я серьезно сомневаюсь, что alignas()
имеет какой-либо значительный положительный эффект, если указанное выравнивание больше, чем естественное выравнивание, которое компилятор использует в любом случае: это значительно увеличивает потребление памяти, что может быть достаточным для запуска большего количества строк кэша / страниц памяти, к которым прежде всего обращаются. Следует избегать только небольших смещений, поскольку они могут вызвать огромное замедление работы некоторых процессоров или могут быть совершенно незаконными / невозможными для других.
Таким образом, правда только в измерении: если вам нужно все ускорение, которое вы можете получить, попробуйте его, измерьте разницу во времени выполнения и посмотрите, сработает ли она.
В 32-битной машине один цикл чтения из памяти получает 4 байта данных.
Это не так просто. Просто термин "32-битный компьютер" уже слишком широк и может означать много вещей. Регистры 32b (регистры GP? Регистры ALU? Регистры адресов?)? Шина адреса 32b? Шина данных 32b? 32b размер слова инструкции?
И "память прочитана" кем. ЦПУ? Cache? Чип DMA?
Если у вас есть платформа HW, где память читается на 4 байта (выровнены на 4) за один цикл и без кеша, то alignas(128)
не будет делать разницы (чем alignas(4)
).