False Sharing и выравнивание кэша в многопроцессорной системе
Я пытаюсь понять ложное совместное использование и выравнивание кэша и его влияние на производительность в многоядерных системах. Вот мой случай, и я пытаюсь понять на очень высоком уровне.
Threads : 2
CPUS/Cores : 4
Locks : 1 per each Thread T1, T2
Data Structures : Each thread has 32k Size Structure which has several nested arrays and structures.
Language : C
У меня есть 2 потока и 4 ядра / ЦП, которые могут обслуживать 2 потока в любой момент времени. Теперь мои потоки постоянно занимаются записью и чтением соответствующих структур данных, которые достаточно велики, близкие к размеру 32 КБ. Каждый поток не зависит друг от друга и не записывает / читает структуры данных других потоков. В потоках всегда сохранялась блокировка, начиная с их временного интервала.
Учитывая мой вышеупомянутый случай, есть ли вероятность ложного обмена или любого негативного влияния, которое может помешать производительности. Я предполагаю, что не будет никакого ложного совместного использования, поскольку каждый поток работает со своей собственной структурой данных и берет блокировку в самом начале временного интервала потока.
1 ответ
Я могу вспомнить два маловероятных сценария, в которых может произойти ложный обмен.
Предположим, что ваш поток 1 работает на ядре 1. Через некоторое время он мигрирует на ядро 2 и возобновляет выполнение. При работе на ядре 2 он может попытаться получить доступ к строке кэша, которая уже кэширована в ядре 1. Таким образом, ситуация похожа на строку кэша, разделяемую между ядром 1 и 2.
Для каждого потока структуры данных были выделены из общей памяти. Если вы не будете осторожны, чтобы дополнить их выравниванием по строкам кэша, последний элемент одной структуры данных и первый из следующего могут быть размещены в одной и той же строке кэша.