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