Medição de largura de banda de memória principal

Eu quero medir a largura de banda da memória principal e, ao procurar a metodologia, descobri que,

  1. muitos usam a função ' bcopy ' para copiar bytes de uma origem para o destino e, em seguida, medir o tempo que eles relatam como a largura de banda.
  2. Outras maneiras de fazer isso são alocar e ordenar e percorrer o array (com algum passo) - isso basicamente dá tempo para ler o array inteiro.

Eu tentei fazer (1) para tamanho de dados de 1GB ea largura de banda que eu tenho é '700MB/sec' (eu usei rdtsc para contar o número de ciclos decorridos para a cópia). Mas eu suspeito que isso não está correto porque minha configuração de RAM é a seguinte:

  1. Velocidade: 1333 MHz
  2. Largura do barramento: 32 bits

Conforme a wikipedia, a largura de banda teórica é calculada da seguinte forma:

velocidade do clock * largura do barramento * # bits por ciclo de clock por linha (2 para ddr 3   ram) 1333 MHz * 32 * 2 ~ = 8 GB/seg.

Então, o meu é completamente diferente da largura de banda estimada. Qualquer ideia do que estou fazendo errado?

=========

Outra questão é que o bcopy envolve ler e escrever. Então, isso significa que eu deveria dividir a largura de banda calculada por dois para obter apenas a largura de banda de leitura ou somente a de gravação? Eu gostaria de confirmar se a largura de banda é apenas o inverso da latência? Por favor, sugira quaisquer outras formas de medir a largura de banda.

2
Você parece ter esquecido a importância do cache nas máquinas atuais. E como você define sua largura de banda de memória? Do ponto de vista de um programador, é essencialmente o que o memcpy está obtendo. Além disso, você provavelmente tem outros processos em execução na sua máquina (assim, comutadores de contexto extras, etc.). Eu não entendo o que você está querendo medir exatamente !!
adicionado o autor Basile Starynkevitch, fonte
O comentário de Basile vai ao cerne da questão ... PCs modernos para o consumidor são feras ferozmente complicadas e o desempenho que você vê depende intimamente do que você está fazendo. Existem vários níveis de cache; previsão de ramificação, pipelines de execução especulativa na CPU; interrompe; outros processos; Periféricos DMA que desejam usar os barramentos (múltiplos!); Essa pergunta teria feito muito mais sentido na minha Apple] [+.
adicionado o autor dmckee, fonte

1 Respostas

Não posso comentar sobre a eficácia do bcopy, mas a abordagem mais direta é o segundo método que você declarou (com um passo de 1). Além disso, você está confundindo bits com bytes em sua equação de largura de banda de memória. 32 bits = 4 bytes. Computadores modernos usam barramentos de memória de 64 bits. Então, sua taxa de transferência efetiva (assumindo tecnologia DDR3)

1333MHz * 64bit/(8bits/byte) = 10666MB/s (também classificado como PC3-10666)

O 1333Mhz já tem o 2 transferência/relógio consignado.

Check out the wiki page for more info: http://en.wikipedia.org/wiki/DDR3_SDRAM

Quanto aos seus resultados, tente novamente com o acesso à matriz. Malloc 1GB e atravessar a coisa toda. Você pode somar cada elemento da matriz e imprimi-lo para que seu compilador não pense que é código morto.

Algo assim:

double time;
int size = 1024*1024*1024;
int sum;
*char *array = (char*)malloc(size);
//start timer here
for(int i=0; i < size; i++)
  sum += array[i];
//end timer
printf("time taken: %f \tsum is %d\n", time, sum);
0
adicionado