Потоковая скорость выполнения LOCK CMPXCHG

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

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

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

8
задан starblue 6 August 2010 в 22:18
поделиться

1 ответ

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

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

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

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

14
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: