| |||
![]()
|
![]() ![]() |
![]()
поэкспериментировал немного с interlock-операциями и получил очень странный результат. Тестировал, в частности, функцию увеличения на единицу, написаную посредством InterlockedCompareExchange aka CAS. Интересовало меня, сколько раз этот самый CAS "сорвется" т.е. алгоритм уйдет на вторую попытку из за конфликта с другим тредом, при максимальной загрузке компьютера. Загрузил я этой функцией увеличения на единицу одной и той же переменной - четыре ядра, что не очень серьезно для мультипроцессорного теста, но и не так чтоб мало. Уж что было. Так вот, даже на четырех ядрах я получил менее одного процента конфликтов, т.е. более 99% операций CAS окончились успехом. Я сразу же глазам своим не поверил, и ради проверки точности вычисления процентов, решил посчитать, сколько же вообще операций CAS в процентах я выполнил. Должен был получить что-то около 101% (дополнительный процент за счет конфликтов), но получил что-то вроде 140%. При этом, и процент конфликтов подскочил до 40%. На самом деле, вот эти 40% - это более менее логичный процент конфликтов, но каким образом я смог его получить только лишь введя в цикл инкремент дополнительной переменной - общего числа вызовов, я так понять и не смог. Кстати, если попеременно инкрементировать в цикле с помощью CAS две разных переменных, уже не подсчитывая общее число вызовов, то опять же, число конфликтов где-то около тех же 40%. А вот как четыре ядра могут сделать менее 1% конфликтов, инкрементируя одну и ту же переменную - совершенно непонятно. UPD: снял точные замеры. Там не 1%, а 0.07%, семь сотых процентов конфликтов! При поочередном же доступе через CAS к двум переменным, процент конфликтов уже 51%. |
||||||||||||||
![]() |
![]() |