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