Articles of x86

Como implementar o atoi usando o SIMD?

Eu gostaria de tentar escrever uma implementação atoi usando instruções SIMD, para ser incluído no RapidJSON (uma biblioteca leitor / gravador JSON C ++). Atualmente, ele possui algumas otimizações SSE2 e SSE4.2 em outros lugares. Se for um ganho de velocidade, múltiplos resultados podem ser feitos em paralelo. As strings são originalmente provenientes de um […]

Vetorização com buffers desalinhados: usando VMASKMOVPS: gerando uma máscara a partir de uma contagem de desalinhamento? Ou não usar esse insn em tudo

O gcc 5.3 com -O3 -mavx -mtune=haswell para x86-64 -O3 -mavx -mtune=haswell código surpreendentemente volumoso para manipular inputs potencialmente desalinhadas para código como: // convenient simple example of compiler input // I’m not actually interested in this for any real program void floatmul(float *a) { for (int i=0; i<1024 ; i++) a[i] *= 2; } […]

Qual configuração o REP faz?

Citando o manual de referência de otimização de arquiteturas Intel® 64 e IA-32 , §2.4.6 “REP String Enhancement”: As características de desempenho da utilização da cadeia REP podem ser atribuídas a dois componentes: sobrecarga de boot e taxa de transferência de dados. […] Para a sequência REP de transferência de dados de granularidade maior, conforme […]

Diferença no desempenho entre o MSVC e o GCC para um código de multiplicação de matriz altamente otimizado

Estou vendo uma grande diferença no desempenho entre o código compilado no MSVC (no Windows) e no GCC (no Linux) para um sistema Ivy Bridge. O código faz multiplicação de matriz densa. Estou obtendo 70% dos flops de pico com GCC e apenas 50% com MSVC. Acho que posso ter isolado a diferença de como […]

Por que o sqr (x) escalar do SSE é mais lento que o rsqrt (x) * x?

Eu tenho perfilado alguns dos nossos principais matemática em um Intel Core Duo, e ao olhar para várias abordagens de raiz quadrada eu notei algo estranho: usando as operações escalares SSE, é mais rápido ter uma raiz quadrada recíproca e multiplicá-lo para obter o sqrt, do que usar o código de operação do sqrt nativo! […]

É possível dizer ao preditor de ramo como é provável seguir o ramo?

Só para deixar claro, eu não estou indo para qualquer tipo de portabilidade aqui, então qualquer solução que me amarre a uma certa checkbox está bem. Basicamente, eu tenho uma instrução if que 99% do tempo é avaliada como verdadeira, e estou tentando obter até o último clock de desempenho, posso emitir algum tipo de […]

Qual é o propósito de XORing um registro com ele mesmo?

xor eax, eax sempre eax a zero, certo? Então, por que o MSVC ++ às vezes o coloca no código do meu executável? É mais eficiente que mov eax, 0 ? 012B1002 in al,dx 012B1003 push ecx int i = 5; 012B1004 mov dword ptr [i],5 return 0; 012B100B xor eax,eax Além disso, o que […]

Bomba Binária – Fase 4

Estou tendo um tempo muito difícil de rastrear o código de assembly para a bomba binária a seguir (uma atribuição da escola onde uma bomba tem que ser desativada, esta bomba contém 6 fases que todos têm 1 input correta para prosseguir para a próxima fase). Eu estou atualmente em phase_4 e tem uma function […]

O que será usado para troca de dados entre threads estão sendo executados em um Core com HT?

A tecnologia Hyper-Threading é uma forma de tecnologia de multithreading simultânea introduzida pela Intel. Esses resources incluem o mecanismo de execução, caches e interface de barramento do sistema; o compartilhamento de resources permite que dois processadores lógicos trabalhem uns com os outros com mais eficiência e permite que um processador lógico bloqueado peça resources do […]

O hardware x86 moderno não pode armazenar um único byte na memory?

Falando do modelo de memory de C ++ para concorrência, a linguagem de programação C ++ da Stroustrup , 4ª ed., Seita. 41.2.1, diz: … (como o hardware mais moderno), a máquina não pode carregar ou armazenar nada menor que uma palavra. No entanto, meu processador x86, com alguns anos de idade, pode e armazena […]