Есть два случая, которые необходимо различать. Вам нужно знать размеры кэша во время компиляции или во время выполнения?
Определение размера кэша во время компиляции
Для некоторых приложений вы знаете точную архитектуру, на которой будет выполняться ваш код, например, если вы можете скомпилировать код непосредственно на хост-машине. В этом случае упростить поиск размера и жесткое кодирование - это вариант (может быть автоматизирован в системе сборки). На большинстве современных машин строка кэша L1 должна составлять 64 байта.
Если вы хотите избежать этой сложности или вам нужна поддержка компиляции на неизвестных архитектурах, вы можете использовать функцию C ++ 17 std :: hardware_constructive_interference_size в качестве хорошего запасного варианта. Он предоставит оценку времени компиляции для строки кэша, но помнит о его ограничениях . Обратите внимание, что компилятор не может точно угадать, когда он создает двоичный файл, поскольку размер строки кэша, как правило, зависит от архитектуры.
Определение размера кэша во время выполнения
Во время выполнения у вас есть преимущество в том, что вы знаете точную машину, но вам потребуется код для конкретной платформы, чтобы прочитать информацию из ОС. Хорошей отправной точкой является фрагмент кода из этого ответа , который поддерживает основные платформы (Windows, Linux, MacOS). Аналогичным образом вы также можете прочитать размер кэша L2 во время выполнения.
Я бы не советовал пытаться угадать строку кэша, запустив тесты при запуске и измерив, какой из них работает лучше всего. Это может хорошо работать, но также подвержено ошибкам, если процессор используется другими процессами.
Объединение обоих подходов
Если вам нужно отправить один двоичный файл, и машины, на которых он будет работать позже, будут иметь различные архитектуры с различными размерами кэша, вы можете создать специализированные части кода для каждого размера кэша, а затем динамически (при запуске приложения) выбрать самый подходящий.