Como posso encontrar uma lista de todas as instruções do SSE? O que acontece se uma CPU não suportar o SSE?

6

Então, eu tenho lido sobre como os processadores funcionam. Agora estou seguindo as instruções (SSE, SSE2, etc). (O que é bem interessante).

Eu tenho muitas perguntas (tenho lido essas coisas na Wikipedia):

  1. Eu vi os nomes de algumas instruções que foram adicionadas no SSE, no entanto, não há explicação sobre nenhuma delas (Talvez SSE4? Elas nem sequer estão listadas na Wikipedia). Onde posso ler sobre o que eles fazem?

  2. Como sei quais dessas instruções estão sendo usadas?

  3. Se sabemos quais estão sendo usados, digamos que estou fazendo uma comparação, (essa pode ser a pergunta mais estúpida que já fiz, não sei sobre assembly, no entanto). possível usar diretamente a instrução em um código de montagem? (Eu estive olhando para isso: link )

  4. Como o processador interpreta as instruções?

  5. O que aconteceria se eu tivesse um processador sem nenhuma das instruções do SSE? (Eu suponho que no caso nós queremos fazer uma comparação, nós não poderíamos, certo?)

por Blastcore 06.11.2012 / 01:55

4 respostas

11

I've saw the names of some instructions that we're added on SSE, however there's no explain about all of them (Maybe SSE4? They're not even listed on Wikipedia). Where i can read about what they do?

A melhor fonte seria diretamente das pessoas que projetaram as extensões: Intel. As referências definitivas são o Software de arquitetura Intel® 64 e IA-32 Manuais do desenvolvedor ; Eu recomendaria que você baixasse os volumes combinados 1 a 3C (primeiro link de download nessa página). Você pode querer olhar para Vol. 1, Ch. 12 - Programação com SSE3, SSSE3, SSE4 e AESNI. Para consultar instruções específicas, consulte Vol. 2, Ch. 3-4 . (O Apêndice B também é útil)

How do i know which of these instructions are being used?

As instruções são usadas somente se um programa que você estiver executando realmente as usa (ou seja, o bytecode correspondente às várias instruções do SSE4 está sendo chamado). Para descobrir quais instruções um programa usa, você precisa usar um desmontador .

If we do know which are being used, let's say i'm doing a comparation, (This may be the stupidest question i've ever done, i don't know about assembly, though) It's possible to directly use the instruction on an assembly code? (I've been looking at this: http://asm.inightmare.org/opcodelst/index.php?op=CMP)

How does the processor interpret the instructions?

Você pode querer dar uma olhada na minha resposta à pergunta, " Como uma CPU 'sabe' quais comandos e instruções realmente significam? ". Quando você escreve o código de montagem manualmente, para tornar um executável, você passa o código de assembly "legível" para um montador, que transforma as instruções em 0s e 1s reais que o processador executa.

What would happen if i have a processor without any of the SSE instructions? (I suppose if in the case we want to do a comparation, we wouldn't be able, right?)

Como o seu computador é Turing complete , ele pode executar qualquer função matemática arbitrária usando um algoritmo de software se ele não tiver o hardware dedicado para fazer isso. Obviamente, fazer matemática paralela ou matemática intensa em hardware é muito mais rápido do que em software (exigindo muitos loops de instruções), então isso causaria uma desaceleração para o usuário final. Dependendo de como o programa foi criado, é possível que pode requerer uma instrução em particular (ie uma do conjunto SSE4), apesar de ser possível fazer a mesma coisa em software (e portanto utilizável em mais processadores), esta prática é rara.

Como exemplo acima, você deve se lembrar de quando os processadores foram lançados pela primeira vez com a extensão do conjunto de instruções MMX . Digamos que queremos adicionar dois vetores de 8 bits assinados de 8 elementos juntos (assim, cada vetor é de 64 bits, igual a um único registrador MMX) ou, em outras palavras, A + B = C . Isso pode ser feito com uma única instrução MMX chamada paddsb . Por uma questão de brevidade, digamos que nossos vetores são mantidos em locais de memória A , B e C também. Nosso código de montagem equivalente seria:

movq   MM0, [A]
paddsb MM0, [B]
movq   [C], MM0

No entanto, esta operação também pode ser feita facilmente em software. Por exemplo, o código C a seguir executa a operação equivalente (desde que char tenha largura de 8 bits):

#define LEN 8
char A[LEN], B[LEN], C[LEN];

/* Code to initialize vectors A and B... */

for (i = 0; i < LEN; i++)
{
    C[i] = A[i] + B[i];
}

Você provavelmente pode adivinhar como seria o código de montagem do loop acima, mas está claro que ele conteria significativamente mais instruções (já que agora precisamos de um loop para manipular a adição dos vetores) e, portanto, precisaríamos executar que muito mais buscas. Isso é semelhante a como o tamanho da palavra de um processador afeta o desempenho de um computador (o objetivo da MMX / SSEx é fornecer os registros maiores, bem como a capacidade de executar o mesma instrução em vários dados ).

    
por 06.11.2012 / 02:32
2

Respondendo na mesma ordem das perguntas:

  1. A maneira mais fácil seria acessar o site da Intel e fazer o download dos whitepapers. O Manual do SDK do processador do evento eh terá todos os detalhes necessários. Aqui é um desses links. Aqui é outro link para os mnemônicos e explicações do conjunto de instruções do SSE.
  2. O que você quer dizer exatamente com quais instruções estão sendo usadas? Você está procurando informações sobre seu processador ou uma aplicação específica?
    Para processadores, eu não sei sobre o Windows, mas no Linux, você simplesmente leia os sinalizadores do processador. Mais fácil feito através do comando # lshw .
    Por outro lado, específico do aplicativo, não tenho certeza, você sempre pode desmontar um executável e verificar as instruções que estão sendo usadas. Como a maioria dos aplicativos é cumprida para o público em massa, eles usarão apenas o Conjunto de instruções x86 genérico. Para usar as instruções mais específicas do processador, você deve compilar o aplicativo manualmente em seu sistema.
  3. Você sempre pode executar um simulador. Se você quiser usar o código Assembly dentro de seus projetos de programação, você pode fazê-lo em C e C ++. Eu usei apenas o código ASM dentro de C, então não sei se algum outro idioma o suporta. Para obter ajuda sobre como usar o ASM in-line, consulte este SO pergunta .
  4. Essa questão está no campo da arquitetura de computadores. Embora eu possa explicar aqui, não será fácil. Houve outra SU questão , que lidou com este assunto.
  5. Para responder à sua pergunta específica, o SSE Instruction Set saiu apenas em 1999, enquanto a instrução CMP existe desde muito antes disso. Fazia parte do conjunto de instruções em 8080 também. Em qualquer caso, com as nossas Máquinas sendo Turing-Complete, os microprocessadores mais antigos poderiam realizar comparações. Só que era mais difícil fazê-las sem uma instrução explícita. Cada conjunto de instruções é apenas uma maneira mais rápida, mais fácil e otimizada de executar certas instruções, mas dificilmente acrescenta novas funcionalidades, já que uma máquina Turing-Complete pode sempre compute everything that is computable
por 06.11.2012 / 02:44
1

If we do know which are being used, let's say I'm doing a comparison, (This may be the most stupid question I've ever asked, I don't know about assembly, though) Is it possible to directly use the instruction on an assembly code? (I've been looking at this: http://asm.inightmare.org/opcodelst/index.php?op=CMP)

A montagem é apenas uma versão legível por humanos do código da máquina. Os nomes que você vê são um mnemônico para o uso da instrução na montagem, então é claro que sempre foi usado diretamente na montagem

What would happen if I had a processor without any of the SSE instructions? (I suppose in the case we want to do a comparison, we wouldn't be able to, right?)

Se a CPU vir uma instrução / opcode inválida, irá gerar uma exceção. Normalmente, o sistema operacional simplesmente anuncia o erro e, em seguida, encerra o programa. Mas, se necessário, o software ou sistema operacional pode pegar a exceção e processar a instrução no software. Isso fará com que extremamente ineficiente por causa do estado de mudança entre programa e manipulador de exceção, mas o programa pode ser executado sem modificação.

Isso foi usado na passagem quando a CPU não tinha FPU incorporada e as matemáticas de ponto flutuante foram processadas em um coprocessador separado. Nesse caso, se o PC não tiver sido conectado a um coprocessador, as instruções de ponto flutuante causarão uma exceção e o identificador de exceção calculará a operação por software antes de transferi-las de volta ao programa.

Ele também foi usado por algum patch do Hackintosh para fazer com que o MacOS X (que requer SSE2 / 3 ou mais) rodasse em CPUs mais antigas

    
por 31.10.2013 / 02:28
0

Respondendo apenas a 5ª pergunta. Vamos supor que você execute o código de máquina em uma máquina semi-compatível. Assim, a CPU pode eventualmente entrar em uma instrução inválida.

Existe um protocolo, sistemas operacionais modernos e CPUs seguem cooperativamente para lidar com tais situações. A CPU armazena informações sobre o que acabou de acontecer e pula para o código OS para obter assistência, portanto o SO é capaz de avaliar corretamente a situação e muito provavelmente elimina o processo enganado (isto é, remove o processo de sua fila pronta e recicla estruturas de dados relacionadas).

Em sistemas UNIX, uma instrução ilegal corresponde a SIGILL, um sinal para o qual o processo pode ter registrado uma rotina de manipulador de sinal. Se o fizer, não será eliminado e o manipulador de sinal correspondente será chamado. Caso contrário, um dump de memória é gravado no disco. Você pode ler isto em signal (7) ou Rochkind, "Advanced UNIX Programming ", Capítulo 9.1.

    
por 20.06.2013 / 19:35