TAS против TTAS блокировки
Я сравниваю TAS с блокировкой TTAS. Вот код:
ТАС:
.globl _tas_lock_acquire
_tas_lock_acquire:
repeat:
lock btsw $0, (%rdi)
jc repeat
ret
.globl _tas_lock_release
_tas_lock_release:
lock btrw $0, (%rdi)
ret
TTAS:
.globl _ttas_lock_acquire
_ttas_lock_acquire:
try_lock:
lock btsw $0, (%rdi)
jc spinwait
ret
spinwait:
btsw $0, (%rdi)
jc spinwait
jmp try_lock
.globl _ttas_lock_release
_ttas_lock_release:
btrw $0, (%rdi)
ret
Если производительность блокировки TAS можно сравнить с C++11 atomic_flag (без разницы), то TTAS намного-намного медленнее (3 величины). Я тестирую на процессоре Intel® R Core 2 ™ с тактовой частотой 540 @ 3,07 ГГц.
В чем моя ошибка?
1 ответ
Решение
О, моя ошибка в реализации _ttas_lock_acquire, ярлыка spinwait. Это должна быть инструкция "bt", а не "bts".