ZealOS/src/Demo/MultiCore/MPAdd.ZC
TomAwezome 3a33e6baaf Rename CosmiC to ZealC.
Rename all .CC files to .ZC extension.
2021-12-11 06:21:22 -05:00

93 lines
1.9 KiB
HolyC
Executable file

I64 mp_n;
I64 MPSum(I64 my_mp_count)
{//We could use the formula n*(n+1)/2
I64 lo = mp_n * Gs->num / my_mp_count,
hi = mp_n * (Gs->num + 1) / my_mp_count,
res = 0, i;
for (i = lo; i < hi; i++)
res += i;
return res;
}
I64 Sum(I64 n, I64 my_mp_count)
{
CJob *tmpm[MP_PROCESSORS_NUM];
I64 res = 0, i;
mp_n = n + 1;
for (i = 0; i < my_mp_count; i++)
tmpm[i] = JobQueue(&MPSum, my_mp_count, i, 0);
for (i = 0; i < my_mp_count; i++)
res += JobResGet(tmpm[i]);
return res;
}
#define SAMPLE_SIZE 100
F64 Test(I64 n, I64 my_mp_count)
{
I64 i, val = 0;
F64 start, end;
start = tS;
for (i = 0; i < SAMPLE_SIZE; i++)
val += Sum(n, my_mp_count);
end = tS;
"Val:%,d\n", val / SAMPLE_SIZE;
"$$RED$$N:%12,d Time:%10.8f$$FG$$\n", n, (end - start) / SAMPLE_SIZE;
return end - start;
}
#define VAL_MIN 1000
#define TEST_MIN 3
#define TEST_MAX 7
#define TESTS_NUM (TEST_MAX - TEST_MIN + 1)
#define PERCENT_MAX 200
U0 MPAdd()
{
I64 i, n,
h = Fs->pix_width,
v = Fs->pix_height;
F64 t1, t2, ress[TESTS_NUM];
CDC *dc = DCAlias;
for (i = 0, n = VAL_MIN; i < TESTS_NUM; i++, n *= 10)
{
t1 = Test(n, 1);
t2 = Test(n, mp_count);
ress[i] = t2 * 100.0 / t1;
"$$GREEN$$%8.4f%%$$FG$$\n\n", ress[i];
}
PressAKey;
DocClear;
dc->color = BLUE;
for (i = PERCENT_MAX / 10; i < PERCENT_MAX; i += PERCENT_MAX / 10)
{
GrPrint(dc, 0, v - ToF64(i) / PERCENT_MAX * v - FONT_HEIGHT, "%3d%%", i);
GrLine(dc, 0, v - ToF64(i) / PERCENT_MAX * v, h, v - ToF64(i) / PERCENT_MAX * v);
}
for (i = 0; i < TESTS_NUM - 1; i++)
{
dc->color = RED;
dc->thick = 2;
GrLine3(dc, i * h / (TESTS_NUM - 1), v - ress[i] / PERCENT_MAX * v, 0,
(i + 1) * h / (TESTS_NUM - 1), v - ress[i + 1] / PERCENT_MAX * v, 0);
dc->color = GREEN;
GrPrint(dc, i * h / (TESTS_NUM - 1), v - FONT_HEIGHT, "10e%d", i + TEST_MIN);
GrLine(dc, i * h / (TESTS_NUM - 1), 0, i * h / (TESTS_NUM - 1), v);
}
PressAKey;
DCFill;
DCDel(dc);
}
MPAdd;