Pergunta

O máximo teórico de largura de banda de memória para um processador Core 2 com memória DDR3 dual channel é impressionante: De acordo com a Wikipedia artigo na arquitetura, 10+ ou 20+ gigabytes por segundo. No entanto, as ações memcpy () chamadas não atingir este. (3 GB / s é o mais alto que eu já vi em tais sistemas.) Provavelmente, isso é devido à exigência fornecedor do sistema operacional que memcpy () ser ajustado para cada linha de processadores com base nas características do processador, de modo a memcpy estoque (implementação) deve ser razoável em um grande número de marcas e linhas.

A minha pergunta: Existe uma versão disponível livremente, altamente sintonizado para Core 2 ou Core i7 que pode ser utilizado em um programa C? Tenho certeza de que eu não sou a única pessoa que necessite de um, e seria um grande desperdício de esforço para que todos possam micro-otimizar seu próprio memcpy ().

Foi útil?

Solução

Se você especificar / ARCH:. SSE2 para MSVC deve fornecê-lo com um memcpy sintonizado (pelo menos, mina faz)

Se isso falhar, use as SSE alinhados intrínsecos carga / store-se a copiar a memória em pedaços grandes, empregando um dispositivo da palavra de Duff lê quando necessário, para lidar com a cabeça ea cauda de dados para obtê-lo para um limite alinhados. Você vai precisar usar os intrínsecos de gerenciamento de cache, bem como para obter um bom desempenho.

O fator limitante é provavelmente erros de cache e southbridge largura de banda, em vez de ciclos de CPU. Dado que há sempre vai ser lotes de outro tráfego no barramento de memória, normalmente estou feliz por chegar a cerca de 90% da largura de banda de memória teórica rendimento em tais operações.

Outras dicas

Quando a largura de banda de medição se você levar em conta memcpy era tanto uma leitura e uma escrita, de modo 3 GB / s de memória copiado é realmente 6 GB / s de largura de banda?

Lembre-se, a largura de banda é máximo teórico - uso no mundo real será muito menor. Por exemplo, uma falha de página e sua banda vai cair para MB / s.

memcpy / memmove são intrínsecos do compilador e normalmente irá ser embutido para movsd representante (ou as instruções SSE apropriadas se o seu compilador pode direcionar isso). Pode ser impossível para melhorar a codegen sobre isso, pois modernos de CPU vai lidar com instruções rep como este muito, muito bem.

Você pode escrever o seu próprio. Tente usar o intel otimizar compilador para diretamente direcionar a arquitetura?

A Intel também produzir algo chamado VTune (compilador e independente da linguagem) para otimizar aplicações.

Aqui está um artigo na otimização de um motor de jogo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top