Кто подскажет, что я делаю не так?
Это:
clock_t strt = clock();
...
clock_t bk1 = clock() - strt;
...
clock_t bk2 = clock() - bk1;
bk1 -- это разность абсолютных времён, т.е. продолжительность, а bk2 -- это разность абсолютного времени и продолжительности, т.е. абсолютное время.
Ок, после исправления этого бага я вижу проблему с переполнением стека сопроцессора: fadd не сдвигает стек обратно и fld его очень быстро переполняет.
С переполнением стека я тоже наблюдаю, что fpu работает ~ в 1000 раз медленнее чем ALU. Но если сбалансировать загрузки, операции и выгрузки так, чтобы стек не переполнялся у меня все работает со сравнимой скоростью. Подозреваю, что там случается исключение, но оно не фатальное и молча глотается ядром.
Я тестировал следующий код (выкинул вообще всё лишнее):
#include <stdio.h>
#include <inttypes.h>
#include <time.h>
#define MAX_I 4000000
int32_t rezult[64];
void StartPR(int str)
{
asm volatile ("mov $4000000, %%eax\n\t"
"xor %%ebx, %%ebx\n\t"
"xor %%ecx, %%ecx\n\t"
"xor %%edx, %%edx\n"
"circle:\n\t"
"add %%eax, %%ebx\n\t"
"add %%eax, %%ecx\n\t"
"add %%eax, %%edx\n\t"
"dec %%eax\n\t"
"jnz circle\n\t" ::: "memory");
}
void StartMMX(int str)
{
double v = 4000000;
asm volatile ("mov $4000000, %%eax\n\t"
"fldz\n\t"
"circle2:\n\t"
"fld %0\n\t"
"faddp \n\t"
"fld %0\n\t"
"faddp \n\t"
"fld %0\n\t"
"faddp \n\t"
"fld %0\n\t"
"faddp \n\t"
"sub $4, %%eax\n\t"
"jnz circle2\n\t"
"fstp %0" :"+m"(v):: "memory");
}
void stardThreads(int numOfThread)
{
printf("threads: %i", numOfThread);
int i = 0;
clock_t strt = clock();
StartPR(0);
clock_t strt2 = clock();
clock_t bk1 = strt2 - strt;
StartMMX(i);
clock_t bk2 = clock() - strt2;
printf("time block1:%i, block2:%i, tics per second:%i\n", (int32_t)bk1, (int32_t)bk2, CLOCKS_PER_SEC);
}
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < 9; i++)
stardThreads(i);
return 0;
}
Результат:
threads: 1time block1:6949, block2:9311, tics per second:1000000
threads: 2time block1:4061, block2:7872, tics per second:1000000
threads: 3time block1:3901, block2:7398, tics per second:1000000
threads: 4time block1:3615, block2:7045, tics per second:1000000
threads: 5time block1:3389, block2:6716, tics per second:1000000
threads: 6time block1:3250, block2:6342, tics per second:1000000
threads: 7time block1:3189, block2:6036, tics per second:1000000
threads: 8time block1:3032, block2:5885, tics per second:1000000