Резьбовая скорость исполнения LOCK CMPXCHG - PullRequest
8 голосов
/ 06 августа 2010

Я написал многопоточное приложение для оценки скорости выполнения LOCK CMPXCHG (x86 ASM).

На моей машине (двухъядерный - Core 2), с 2-мя запущенными потоками и доступом к одной переменной,Я могу выполнить около 40M операций в секунду.

Затем я дал каждому потоку уникальную переменную для работы.Очевидно, это означает, что между потоками нет конфликта блокировок, поэтому я ожидал увеличения производительности.Однако скорость не изменилась.Почему?

1 Ответ

14 голосов
/ 06 августа 2010

Если у вас есть 2 потока, одновременно обращающихся к данным, находящимся в одной и той же строке кэша, вы получаете ложное совместное использование , когда каждое ядро ​​должно постоянно обновлять свой кэш, поскольку другая часть кэша была изменена другойcore.

Убедитесь, что уникальные переменные размещены в разных блоках памяти (скажем, не менее 128 байт), чтобы убедиться, что это не та проблема, с которой вы столкнулись.

У DDJ есть хорошая статья, описывающая ужасные последствия ложного обмена: http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206

Вот запись Википедии об этом: http://en.wikipedia.org/wiki/False_sharing

...