Spinlock e Hyper-Thread


 

Algo curioso que estive vendo hoje..

Encontrei um disassembly do SQL Server rodando na minha máquina com o código do Spinlock (em vermelho):

sqlservr!Spinlock<60,7,0>::SpinToAcquireOptimistic+0x3d:
00000000`01aca459 33c9            xor     ecx,ecx
00000000`01aca45b 85db            test    ebx,ebx
00000000`01aca45d 7412            je      00000000`01aca471
00000000`01aca45f 8b07            mov     eax,dword ptr [rdi]
00000000`01aca461 85c0            test    eax,eax
00000000`01aca463 7407            je      00000000`01aca46c
00000000`01aca465 90              nop
00000000`01aca466 03cd            add     ecx,ebp
00000000`01aca468 3bcb            cmp     ecx,ebx
00000000`01aca46a 72f3            jb      00000000`01aca45f
00000000`01aca46c 4c8b442438      mov     r8,qword ptr [rsp+38h]

Um comentário curioso: a instrução NOP no endereço 01aca465 não realiza nada, mas permite que processadores com Hyper-Threading façam a mudança de contexto para o próximo processador lógico. Esse comportamento torna a função “Hyper-Threading Friendly” e economiza energia!

Comments (9)

  1. Pedro disse:

    Muito interessante. Isso mostra que o processador possui varios nucleos.

  2. Joao disse:

    Exatamente, Pedro…

    É a prova cabal de que o processador dele é dotado de varios nucleos!

  3. Leivio disse:

    Pedro, Joao

    A operador NOP não tem nenhuma relação com processadores multi-cores o mesmo está presente em quase todos os códigos de aplicativos bem mais simples.

    Posso afirmar que o NOP seria equivalente a seguinte instrução:

    * XCHG EAX, EAX

    que é a mesma coisa dessa outra:

    * MOV X0, X0

    Ou seja, não faz realmente nada só consome ciclos de CPU. Esse comportamento na arquitetura IA-32 pode resultar em mudança de contexto para outro processador virtual. claro, isso só vai acontecer se o kernel windows identificar mais de um processador então adicionando na lista dos recursos virtuais disponiveis para aplicações. Isso vale para processadores com single-cores, HyperThreading e multi-cores.

    obs.: Dependendo da arquitetura da CPU podemos utilizar o NOP para outras necessidades em desenvolvimento de aplicações.

    Leivio Fontenele

    http://www.dbaninja.com

  4. Oi Leivio! O interessante é que o NOP não é exatamente um "faz nada"… mas, segundo o manual da Intel, esse inocente comando sinaliza o processador que é possível fazer o context switch da thread para o próximo processador lógico.

    Em um computador single-core, esse comando não faz absolutamente nada. Se o computador suportar o hyper-threading, ele sinaliza a possibilidade de fazer a mudança de contexto! De acordo que isso não prova que o processador tem vários núcleos – na verdade, apenas mostra que esse comando é backward compatible.

    Abraços, Fabricio

  5. Mas enfim, NOP é tradicionalmente o FAZ NADA e equivalente ao XCHG EAX, EAX ou MOV EAX, EAX.

  6. Leivio disse:

    Catae,

    Isso mesmo!. Como falei "Dependendo da arquitetura da CPU podemos utilizar o NOP para outras necessidades em desenvolvimento de aplicações. ". Em processadores Intel temos essa caracteristicas, pois somente a intel possui a tecnologia hyper-threading.

    Leivio Fontenele – dbaninja.com

  7. É verdade! Não sabia que o hyper-threading era exclusiva da Intel. Achei que houvesse outro mecanismo semelhante da AMD. Será que a AMD não acredita no HT?

  8. Leivio disse:

    Fabricio,

    Complementando…. na arquitetura CISC somente a Intel temimplementa a tecnologia multi-thread por core. Ja na arquiterura RISC quase todos os fabricantes tem a tecnologia multi-thread por core ex: POWER7, T2 da SUN e a propria Intel com Itanium.

    Acredito que a AMD não acreditou em hyper-threading. mas quem sabe no futuro..: techpulse360.com/…/amd-hints-to-hyper-threading-in-2012

    Agora, hyperthreding com banco de dados, eu particulamente não acredito. Pelo menos os processadores hyperthreading da arquitetura anterior da Intel. Não funcionavam bem com banco de dados pq um processador logico acabava atrapalhando o outro (cache, LPUs, etc). Ouvi falar que HT nos novos processadores funcionam muito melhor, mais ainda nao vi nenhum resultado oficial. vamos ficar no aguardo…:)

    Conversando com o Fabricio da equipe SQL Server SQL OS Developers sobre a melhorias em HT o mesmo recomendou que até o momento ainda existe nenhum resultado que comprove alguma melhora com os novos processadores Intel HT.

    Qual é a recomendação da equipe PFE Brasil quanto a SQL Server e Hyperthreding?

    Leivio Fontenele – dbaninja.com

  9. Ótimo! Acabei de usar essas informações para responder a pergunta de um cliente que estava comigo. Obrigado! A minha recomendação, em particular, é habilitar o Hyperthreading. Existem casos que o HT diminui a eficiência do cache L1/L2, mas já observei ganhos concretos de performance em duas situações reais. Depois disso, recomendo sempre deixar habilitado até que se prove o contrário.

    Abraços, Fabricio

Skip to main content