Я пытаюсь достичь пиковой производительности однопоточного 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>