2015-05-03 2 views
0

Я сравниваю блокировку TAS и TTAS. Вот код:TAS vs TTAS locking

ТАС:

.globl _tas_lock_acquire 
 
_tas_lock_acquire: 
 
\t repeat: 
 
\t \t lock btsw $0, (%rdi) 
 
\t jc repeat 
 
\t ret 
 

 
.globl _tas_lock_release 
 
_tas_lock_release: 
 
\t lock btrw $0, (%rdi) 
 
\t ret

TTAS:

.globl _ttas_lock_acquire 
 
_ttas_lock_acquire: 
 
\t try_lock: 
 
\t \t lock btsw $0, (%rdi) 
 
\t \t jc spinwait 
 
\t \t ret 
 
\t spinwait: 
 
\t \t btsw $0, (%rdi) 
 
\t \t jc spinwait 
 
\t \t jmp try_lock 
 

 
.globl _ttas_lock_release 
 
_ttas_lock_release: 
 
\t btrw $0, (%rdi) 
 
\t ret

Если производительность ТАС блокировки можно сравнить с C++ 11 atomic_flag (без разницы), тогда TTAS намного-намного медленнее (3). Я тестирую на «Intel (R) Core (TM) i3 CPU 540 @ 3.07GHz».

В чем моя ошибка?

+0

Вопрос о сравнении возникает из раздела «Искусство многопроцессорного программирования», глава 7, сравнивающего TAS и TTAS. – user1641854

ответ

0

О, моя ошибка заключается в реализации _ttas_lock_acquire, метки spinwait. Это должно быть инструкция «bt», а не «bts».