Современные многоядерные процессоры синхронизируют кэш между ядрами путем отслеживания, то есть каждое ядро транслирует то, что оно делает с точки зрения доступа к памяти, и наблюдает за широковещательными сообщениями, генерируемыми другими ядрами, чтобы взаимодействовать друг с другом, чтобы убедиться, что записи из ядра A видны ядру B.
Это хорошо тем, что если у вас есть данные, которые действительно нужно разделять между потоками, это сводит к минимуму объем кода, который вы должны написать, чтобы гарантировать, что они будут разделены.
Плохо то, что если у вас есть данные, которые должны быть локальными только для одного потока, отслеживание все равно происходит, постоянно бесполезно рассеивая энергию.
Будет ли отслеживание еще происходить, если вы объявите соответствующие переменные thread_local
? К сожалению, в соответствии с принятым ответом на другие потоки могут изменять локальный поток память?
Предоставляет ли какая-либо существующая в настоящее время платформа (комбинация ЦП и операционной системы) какой-либо способ отключить отслеживание локальных данных потока? Не обязательно быть портативным; мне все еще интересно, если для этого требуется выполнить вызовы API для конкретной ОС или даже перейти в сборку.