Intel Nehalem однопоточная пиковая производительность - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь достичь пиковой производительности однопоточного FP для моего процессора nehalem, чтобы обнаружить аномалии производительности моего приложения, но, похоже, я не могу этого достичь.Тактовая частота составляет 3,2 ГГц, и я хочу достичь максимальной производительности процессора без использования инструкций SSE и многопоточности.

Насколько я понимаю, сложение и умножение FP одинарной точности может выполняться параллельно каждому такту, обеспечивая максимальную производительность 2 * 3,20 = 6,4 ГФЛОПС / сек.

Однако я не могу достичь этой производительности с помощью простого куска кода:

int iterations = 1000000;
int flops_per_iteration = 2;
int num_flops = iterations * flops_per_iterations;

for(int i=0; i<iterations; i++)
{
    a[i] = i; 
    b[i] = i*2;
    c[i] = i*3;
}

tick(&start_time);

for(int i = 0; i < iterations; i++){
    a[i] *= b[i];
    c[i] += b[i];
}

time = tock(&start_time);

printf("Performance: %0.4f GFLOPS \n", flops/(time*pow(10,-3)*pow(10,9)));

Этот фрагмент кода дает мне производительность: ~ 1,5 GFLOPS вместо 6,4 GFLOPS.

У кого-нибудь есть другой пример, который может приблизиться к пиковой производительности без использования MT и SSE, или есть идеи, которых нет у моего кода?

Заранее спасибо

* Обновление: добавлен код сборки горячей петли: *

Address Assembly
Block 17:
0x4013a5    movssl  (%rdi,%rax,4), %xmm2
0x4013aa    movssl  (%r8,%rax,4), %xmm0
0x4013b0    movssl  (%rsi,%rax,4), %xmm1
0x4013b5    mulss %xmm2, %xmm0
0x4013b9    addss %xmm1, %xmm2
0x4013bd    movssl  %xmm0, (%r8,%rax,4)
0x4013c3    movssl  %xmm2, (%rsi,%rax,4)
0x4013c8    inc %rax
0x4013cb    cmp %rcx, %rax
0x4013ce    jb 0x4013a5 <Block 17>

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Чтобы обеспечить производительность 6,4 GFLOPS, ваш процессор должен выполнять 10 инструкций за один такт.Или 7 инструкций, если развернуты.Это просто невозможно.Вы не можете получить более 4 команд / часов на этом процессоре.

2 голосов
/ 05 марта 2012

Разве вы не используете развертывание цикла для заполнения конвейера ЦП?

2 голосов
/ 05 марта 2012

Насколько велик ваш кэш L3? 4 МБ? Таким образом, вы можете дать немного больше места для кэша. Попробуйте уменьшить рабочий размер на 50%.

Однако «параллелизм» в операции FP в основном означает, что операция FP может быть запущена, пока другие еще обрабатываются и не завершаются. Но вам вряд ли удастся получить настоящий параллелизм без

  • с использованием многопоточного подхода и / или
  • с использованием регистров SSE.
...