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".

Другие вопросы по тегам