Ложное совместное использование - это результат того, что несколько ядер с отдельными кэшами получают доступ к одной и той же области физической памяти (хотя это не тот же адрес - это было бы правильным совместным использованием).
Чтобы понять ложное совместное использование, вам необходимопонять кеши.В большинстве процессоров каждое ядро будет иметь свой собственный кэш L1, в котором хранятся данные, к которым недавно обращались.Кэши организованы в «линии», которые выровнены по частям данных, обычно длиной 32 или 64 байта (в зависимости от вашего процессора).Когда вы читаете с адреса, которого нет в кэше, вся строка считывается из основной памяти (или из кэша L2) в L1.Когда вы записываете адрес в кеше, строка, содержащая этот адрес, помечается как «грязная».
Вот где начинается аспект совместного использования. Если несколько ядер читают из одной и той же строки, у каждого из них может быть копия строки в L1.Однако, если копия помечена как грязная, она делает недействительной строку в других кэшах.Если этого не произошло, то записи, сделанные на одном ядре, могут быть не видны другим ядрам намного позже.Поэтому в следующий раз, когда другое ядро начнет чтение из этой строки, кеш пропустит, и ему придется снова извлечь строку.
Ложное совместное использование происходит, когда ядра читают и записывают в разныеадреса в той же строке.Несмотря на то, что они не обмениваются данными, кэши действуют так, как они, так как они очень близки.
Этот эффект сильно зависит от архитектуры вашего процессора.Если бы у вас был одноядерный процессор, вы бы вообще не увидели эффекта, так как не было бы совместного использования.Если бы строки вашего кэша были длиннее, вы бы увидели эффект как в «плохом», так и в «хорошем» случаях, поскольку они все еще близки друг к другу.Если ваши ядра не разделяют кэш-память второго уровня (что, я полагаю, они имеют), вы можете увидеть разницу в 300-400%, как вы сказали, так как они должны были бы пройти весь путь до основной памяти при промахе кеша.
Вы также можете знать, что важно, чтобы каждый поток читал и записывал (+ = вместо =).Некоторые процессоры имеют кэш с сквозной записью , что означает, что если ядро выполняет запись по адресу, отсутствующему в кеше, оно не пропускает и не извлекает строку из памяти.Сравните это с кэшами с обратной записью , которые пропускают записи.