Debian: que instruções os binários x86-64 usam?

7

Gostaria de saber se os binários usam (são compilados para) conjuntos de instruções especiais como SSE 4.1 / 4.2, AVX, F16C ou não. Como posso descobrir se um binário em um pacote usa certos conjuntos de instruções?

Eu sei que eu posso habilitar tais instruções usando configure switches quando compilar pacotes manualmente, mas ao usar pacotes pré-compilados do repositório Debian deve haver um padrão.

Provavelmente binários não são compilados com conjuntos de instruções muito específicos porque não podem ser usados em nenhum sistema ou, dependendo do binário, são compilados com sub-rotinas alternativas que "emulam" o processamento com instruções básicas para suportar CPUs sem esses recursos .

Eu sei que eu poderia olhar para o arquivo rules de um pacote fonte Debian, mas estou interessado se há uma maneira mais fácil de fazer isso.

  • As instruções da CPU que um binário x86-64 usa são muito limitadas?
  • Pacotes de maio usam conjuntos de instruções bastante específicos, eles podem ter fallbacks usando instruções mais primitivas?
por try-catch-finally 14.12.2015 / 23:11

1 resposta

6

Para responder à sua pergunta em geral, link fornece um script que pode ser alimentado com um binário desmontado (a saída de objdump ) e tentará descobrir o conjunto mínimo de instruções necessárias. Essa técnica é necessariamente aproximada, já que um dado binário pode ter diferentes caminhos de execução dependendo do conjunto de instruções disponíveis, e tal binário pareceria exigir o "melhor" conjunto de instruções que ele suporta, mesmo que possa ser executado sem ele.

Especificamente em relação aos pacotes Debian, qualquer coisa empacotada para amd64 (o conjunto de instruções "PC" de 64 bits) deve ser capaz de rodar em qualquer CPU compatível com AMD64 ou x86-64; isso significa que ele pode usar o conjunto de instruções padrão completo de 64 bits, que inclui o SSE2, mas ele só pode usar outros recursos (incluindo aqueles que você lista) se ele fornece fallbacks para CPUs que não os suportam. Existem exceções, mas os pacotes devem indicar isso na descrição do pacote (veja, por exemplo, rr ).

O próprio kernel Linux pode adaptar seus recursos àqueles da CPU em que ele está rodando. Se for compilado para x86-64, assume que ele pode usar um TSC, CMPXCHG64 , CMOV (procure por qualquer coisa que dependa de X86_64 nesse link). Mas ele pode ser compilado para verificar em tempo de execução se recursos como AES-NI, AVX, AVX2 estão disponíveis e usá-los em particular para acelerar os cálculos de criptografia. Isso pode beneficiar qualquer programa usando esses recursos (ao custo de comutadores de contexto no kernel).

Em alguns casos, o vinculador dinâmico também pode ajudar a fornecer alternativas dependendo da CPU: libc6-i686 fornece um conjunto de bibliotecas para a arquitetura i386 que será usada automaticamente em vez dos equivalentes simples em CPUs compatíveis com o conjunto de instruções i686 (e suportando CMOV).

    
por 14.12.2015 / 23:47