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;
