О "виртуалке" 9 ГГц

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Тут недавно в теме 

Было сообщение:

negavoid пишет:

А насчёт теста, ну, проведите. (очень условный тест)

#include <stdio.h>
#include <time.h>

void main()
{
	clock_t begin = clock();

	int a;
	for ( long i = 0; i < 1000000000; i++ )
	{
		a = 2 + 2;
	}

	clock_t end = clock();
	double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
	
	printf( "%.2f", time_spent );
}

gcc test.c && a.exe

Запустите сперва на своём компе, потом в виртуалке на нём же.

Это однопоточная программа, но в процессе выполнения ОС может перекидывать её на разные ядра (а может и не перекидывать), поэтому даже при выполнении несколько раз подряд на одном и том же компе результаты будут слегка разниться, ибо windows и linux - не ОСи реального времени.

Запустите потом на виртуалке "с 9 ГГц". Если ваш процессор быстрее, чем 2.26 ГГц, то вероятно, у вас результат посчитается быстрее, чем на той виртуалке.

О том, что данный исходник не может использоваться в качестве теста, я уже писал. 

Но вот любопытно, то покажет этот тест в немного измененном виде на "виртуалке" 9 ГГц.

#include <stdio.h>
#include <time.h>

void main()
{
	clock_t begin = clock();

	int a = 7;
	for ( long i = 0; i < 1000000000; i++ )
	{
		if(a & 1)
                  a = 3*a + 1;
                else
                  a = a/2;
	}

	clock_t end = clock();
	double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
	
	printf( "%d, %.2f", a, time_spent );
}
 
negavoid
Offline
Зарегистрирован: 09.07.2016

А, не даёт вам покоя-таки :)

Цитата:
О том, что данный исходник не может использоваться в качестве теста, я уже писал.

Разумеется, может. При соблюдении определённых условий, понимая, что измеряем, и что результат будет в условных попугаях, но в том случае это приемлемо.

Цитата:
Но вот любопытно, то покажет этот тест в немного измененном виде на "виртуалке" 9 ГГц.

То же самое, что и мой - что процессор считает гораздо быстрее обращений к памяти, и что компилятор слишком умный.

Тогда уж можно вот так, чтобы for не размотался во что там хочет компилятор:

#include <stdio.h>
#include <time.h>

void main()
{
	clock_t begin = clock();
	
	asm( R"(
		xor %eax, %eax
		xor %ecx, %ecx
		mov $2, %edx
		loop:
		mov $2, %eax
		add $2, %eax
		dec %ecx
		jnz loop
		dec %edx
		jnz loop
	)");
	
	clock_t end = clock();
	double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
	
	printf( "%.2f", time_spent );
}

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

как освобожусь, потестирую...
Чтобы не забылось - компилировать: gcc -Wall -o test test.c
Один тест на локалке 1, 4.32 второй 10.62

negavoid
Offline
Зарегистрирован: 09.07.2016

Дык, нет смысла, понятно же, что при прочих равных, один поток на 2 ГГц сложит 2+2 медленнее, чем на 3 ГГц. В вашей ситуации этот "тест" был нужен, чтобы вы поняли, что нет там на виртуалке 9 ГГц.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Так виртуализация и задумывалась для многих целей, одна из которых обойти не умение писать программы работающие с потоками

negavoid
Offline
Зарегистрирован: 09.07.2016

Цитата:
обойти не умение писать программы работающие с потоками

Конечно же нет!!!

Ну вот, смотрите, имеем условный алгоритм из двух действий:

b = 2 + a
c = 2 + b

Второе действие никак не может выполниться, пока не будет выполнено первое - b для второго действия неизвестно, пока не будет выполнено первое. Ну вот никак. Даже если с помощью хитрых трюков разнести эти два действия на два потока, второй всё равно будет вынужден ждать, пока первый не рассчитает ему значение b, да ещё и будет вынужден понести накладные расходы на синхронизацию и передачу значения от первого потока второму.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

а как работал Эльбрус?

sadman41
Offline
Зарегистрирован: 19.10.2016

Зовите кота с торшером, сейчас мы узнаем для чего на самом деле была задумана виртуализация.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:

Зовите кота с торшером, сейчас мы узнаем для чего на самом деле была задумана виртуализация.

да ладно )))
сдаётся мне, что виртуальная машина умеет выделять потоки под отдельные задачи...
ждём авторитетов ...

negavoid
Offline
Зарегистрирован: 09.07.2016

Цитата:
а как работал Эльбрус?

Точно так же. Просто хитрожопый компилятор пытается найти в исходном коде те куски, которые таки можно распараллелить. Но и х86й так умеет.

Цитата:
что виртуальная машина умеет выделять потоки под отдельные задачи...

Простите, у меня на сегодня лимит на переваривание бреда заканчивается уже. Виртуальная машина всего лишь распределяет имеющиеся ресурсы настоящей машины на много маленьких виртуальных, изолируя их друг от друга (и то иногда получается плохо, и можно выйти из виртуалки в настоящую и выполнить код на хосте).

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

а что там за цифирьки магические получились?

negavoid
Offline
Зарегистрирован: 09.07.2016

где? ))

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

negavoid пишет:

где? ))

запустил оба ваших теста на локалке - Один тест на локалке показывает - 1, 4.32 второй  - 10.62

negavoid
Offline
Зарегистрирован: 09.07.2016

А теперь запустите оба там, на виртуалке с 9 ГГц, и сравните полученные цифры.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

negavoid пишет:

А теперь запустите оба там, на виртуалке с 9 ГГц, и сравните полученные цифры.

Первый тест 1, 4.49
Второй тест 7.91

На локальной 4 гиг озу проц двухядерный 3Ггц XUBUNTU 14 64x
На виртуалке 4 гиг озу одно ядро 2.23  (общая мощность виртуальной 9 Ггц) проц MINT18 32-х битная

negavoid
Offline
Зарегистрирован: 09.07.2016

ну, мейджик :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Ничо не понял. Виртуалка, ядро одно 2.23, но общая мощность 9 - как это понимать вообще? Во втором запуске %d утерян в выводе. Где чистота эксперимента?

Капец какой-то, а не айти-отдел.

Хотя, по тайму - xubuntu обогнало mint.

 
negavoid
Offline
Зарегистрирован: 09.07.2016

А вот в 2+2 mint обогнал xubuntu аж на две секунды, магия )) Может, на хубунту что-нибудь было запущено?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

test запускался этот пример:
 

#include <stdio.h>
#include <time.h>

void main()
{
	clock_t begin = clock();

	int a = 7;
	for ( long i = 0; i < 1000000000; i++ )
	{
		if(a & 1)
                  a = 3*a + 1;
                else
                  a = a/2;
	}

	clock_t end = clock();
	double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
	
	printf( "%d, %.2f", a, time_spent );
}

test1 запускался этот пример:

#include <stdio.h>
#include <time.h>

void main()
{
	clock_t begin = clock();
	
	asm( R"(
		xor %eax, %eax
		xor %ecx, %ecx
		mov $2, %edx
		loop:
		mov $2, %eax
		add $2, %eax
		dec %ecx
		jnz loop
		dec %edx
		jnz loop
	)");
	
	clock_t end = clock();
	double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
	
	printf( "%.2f", time_spent );
}

На обоих машинах работает только ОСЬ

для чистоты эксперимента надо и на виртуалку поставить UBUNTU, да и машинёшку надо с поддержкой виртуализации, подумаю, попробую на HP поставить убунту и точно такую машину (по объему памяти) создать в виртуальной и сравнить...правда надо времени немного

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:

Ничо не понял. Виртуалка, ядро одно 2.23, но общая мощность 9 - как это понимать вообще? Во втором запуске %d утерян в выводе. Где чистота эксперимента?

Капец какой-то, а не айти-отдел.

Хотя, по тайму - xubuntu обогнало mint.

ты мне льстишь, нету тут никакого IT отдела )))
Неужели кто-то из молодёжи будет заниматься такими глупостями коими занимаюсь я...

sadman41
Offline
Зарегистрирован: 19.10.2016

\Для пущего треша ещё и исходники разные взяты. Зачёт.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:

\Для пущего треша ещё и исходники разные взяты. Зачёт.

да, на двух машинах запускались оба теста...
первый тест на локалке показывает - 1, 4.32 второй тест на локалке  - 10.62

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

negavoid пишет:

 В вашей ситуации этот "тест" был нужен, чтобы вы поняли, что нет там на виртуалке 9 ГГц.

да уже давно понял, архикад использовал возможности процессора в многопоточной обработке когда рэйндерил, это он умеет оказывается