Я написал многопоточное приложение для оценки скорости выполнения LOCK CMPXCHG (x86 ASM) .
На моей машине (двухъядерный - Core 2), с 2 работающими потоками и доступом к одной и той же переменной, я могу выполнять около 40M операций в секунду.
Затем я дал каждому потоку уникальную переменную для работы. Очевидно, это означает, что между потоками нет конфликта блокировок, поэтому я ожидал увеличения производительности. Тем не менее, скорость не т изменить. Почему?
Если у вас есть 2 потока, одновременно обращающихся к данным, находящимся в одной строке кэша, вы получите ложное совместное использование , когда каждое ядро должно обновлять свой кеш, потому что одна и та же часть кеш был заменен другим ядром.
Убедитесь, что уникальные переменные размещены в разных блоках памяти (скажем, на расстоянии не менее 128 байт), чтобы убедиться, что это не проблема, с которой вы столкнулись.
У DDJ есть хорошая статья, описывающая ужасные последствия ложного обмена: http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206
Вот запись об этом в Википедии : http://en.wikipedia.org/wiki/False_sharing