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;