Я реализовал стек без блокировки, основанный на примере книги «Параллельность в действии». Я хотел сравнить его с другими стеками без блокировок, то есть с boost :: lockfree. Для проведения этих тестов я использовал каркас тестов Google, измеряя время одной операции при разных конфликтах (под операцией я имею в виду push / pop, которые были вызваны в случайном порядке).
Run on (8 X 3400 MHz CPU s)
CPU Caches:
L1 Data 32K (x4)
L1 Instruction 32K (x4)
L2 Unified 256K (x4)
L3 Unified 6144K (x1)
----------------------------------------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------------------------------------
BM_lockFreeStack/real_time/threads:1 136 ns 136 ns 5145339
BM_lockFreeStack/real_time/threads:2 184 ns 367 ns 3785648
BM_lockFreeStack/real_time/threads:4 207 ns 820 ns 3361952
BM_lockFreeStack/real_time/threads:8 209 ns 1639 ns 3387024
BM_lockFreeStack/real_time/threads:16 167 ns 957 ns 4269504
BM_lockFreeStack/real_time/threads:32 150 ns 590 ns 4866592
BM_boostLockFreeStack/real_time/threads:1 66 ns 66 ns 10510435
BM_boostLockFreeStack/real_time/threads:2 133 ns 265 ns 5713306
BM_boostLockFreeStack/real_time/threads:4 122 ns 475 ns 5809292
BM_boostLockFreeStack/real_time/threads:8 128 ns 944 ns 5432072
BM_boostLockFreeStack/real_time/threads:16 129 ns 989 ns 5461120
BM_boostLockFreeStack/real_time/threads:32 129 ns 1017 ns 5447776
Как видите, я использовал процессор с 8 потоками. Что меня удивляет, так это результаты для потоков 16/32 (lockFreeStack), где среднее время работы меньше результатов для потоков 2/4/8. Результаты такого рода согласуются каждый раз, когда я запускаю эти тесты.
Есть ли логическое объяснение этому поведению?