Skocz do zawartości
xacti

Skrypt W C++ Mocno Obciazajacy Procesor

Rekomendowane odpowiedzi

dobra.

 

mam kod mojego bardzo zaawansowanego programu ;)

 

#include <cstdlib>#include <iostream>#include <windows.h>void main (void){long double a,b,c,d;	 int t1, t2, h, m, s;	 	 t1=GetTickCount();for (a = 1; a <= 1024000; a++)	 {		 b=a;		 c=a * 24 * a;		 d=a * 102400 / 3;		 std::cout << a * b << std::endl;		 std::cout << a * c << std::endl;		 std::cout << a * d << std::endl;		 std::cout << c * d << std::endl;		 if(a&&b==2&&c==9||a==2&&b||c!=2&&c>0){}	 }	 std::cout << "Test passed.\n" << std::endl;t2=GetTickCount() - t1;s = t2 / 1000; m = (s / 60) % 60;h = s / 3600;s = (t2 / 1000) - (60 * m);std::cout << h << std::endl; std::cout << m << std::endl; std::cout << s << std::endl; 			  	 system("Pause");}

*nie smiac sie ;)

 

 

no i jest problem. bo gdy przed petla ustawilem zeby szlo w REALTIME to i tak obciaza antka @ 2.5GHz max w 30% .. moglby ktos podac cos prostego i krotkiego obciazajacego mozno procesor? :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

spróbuj zaangażować oprócz jednostek stałoprzecinkowych także zmiennoprzecinkowe procesora, czyli zapodaj w programie jakieś obliczenia na float'ach.

Edytowane przez hary

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

'float' zamiast np. 'int' stawiasz deklarując zmienną.

 

edit:

a w sumie masz w kodzie 'long double' którego wcześniej nie zauważyłem a to jest zmiennoprzecinkowa wiec juz nie ważne (tak to jest jak się nie czyta tylko patrzy) :P

Edytowane przez hary

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Słuchaj, wydaje mi się, że problemem może być cout, który zaczyna wypluwać do konsoli swoje dane i wtedy prawdopodobnie proces zostaje wywłaszczony. Jak chcesz zrobić rzeźnię, to po prostu forkuj proces pare razy i potem wiooo, na kazdym procesie taka petla. Jestem pewien, ze zasoby zostana uzyte w 100%. Ew, uzyj watkow.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jakis czas temu program osiagnal wersje finalna. Juz nic wiecej przy moich umiejetnosciach nie wykombinuje.

Jestem w pelni swiadomy tego, ze moj program nie potrafi pokazac roznicy wydajnosci pomiedzy prockami (a przynajmniej nie dokladnie), ale jestem z niego dumny ;)

 

Jesli ktos ma czas i ochote to prosil bym o zassanie go, i zrobienie testu. Nastepnie albo przez PM, albo lepiej tutaj napisac na jakim procku bylo testowane i jaki wynik programik wyplul ;)

 

XCPU 1.2 ;)

Edytowane przez xacti

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie! Bo chce na tym zarobic. :P

 

/Tylko nie smiac sie. :lol:

 

» Naciśnij, żeby pokazać/ukryć tekst oznaczony jako spoiler... «

 

XCPU:

////////////////////////////////////////XCPU 1.2 (c) xacti///Source Code/////////////////////////////////////#include <cstdlib>#include <iostream>#include <windows.h>#include <cmath>#include "progress.h"int me ();int main (){	 me ();}int me (){	long double a,b,c,d,g,z,i;	 int t1,t2,h,m,s,e,f,k,x,x2,w;	 progress test;	 x=1;	 std::cout << "1 - Test" << std::endl;	 std::cout << "2 - Exit" << std::endl;	 std::cin >> w;	 switch (w)	 {			case 1:				 system("cls");				 std::cout << "Test" <<std::endl;	 t1=GetTickCount();for (k = 1; k<=1; k++){for (a = 1; a <= 1024000000; a++)	 {		 b=a;		 c=a * 24 * i;		 d=(i * 102400 / 3) * (c / 4);		 e+2;		 f=(e * e) / 4;		 a * b;		 a * c;		 a * d;		 c * d;		 e * c;		 e * f;		 f / e;		 if(a&&b==2&&c==9||a==2&&b||c!=2&&c>0){}				 for (g = 1; g <= 16; g++)		 {			 g=(a * c * d) / f;			 z=g / a;			 i=(g * z) / f;			 if(g&&b==10&&z==2||i==2&&c||g!=2&&d>2){}		 }		 x++;		 if(x % 10240000 == 0)		 {		 test.draw(x/10240000,0);		 }	 }	 }	 std::cout << "Test passed.\n" << std::endl;t2=GetTickCount() - t1;s = t2 / 1000; m = (s / 60) % 60;h = (m / 60);s = (t2 / 1000) - (60 * m);floor(h);m = m - (60 * h);std::cout << h<< "h " << m<< "m "<< s<< "s "<< std::endl;std::cout << std::endl;system("Pause");system("cls");me ();break;					case 2:system("cls");std::cout << "XCPU 1.2 (c) xacti"<< std::endl;std::cout<< std::endl;std::cout<< std::endl;	 system("Pause");	 break;					 default:							 system("cls");							 me ();					 break;	 }	}

progress.h :

////////////////////////////////////////////////File: progress.h//Version: 1.0//////////////////////////////////////////////#ifndef PROGRESS_H_#define PROGRESS_H_#include <conio.h>#include <stdio.h>class progress{	public:	int draw(int a,int b=0)	{if(b==1){		printf ("%c", '[');		for(int i=0;i<a;i++)		{			if(i%2)			{			printf ("%c", '=');			}		}		printf ("%c " , ']'); }  printf("%d", a);		printf("%s\r", "%");	}};#endif

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

błagam, precz z tym g... :|

O co ci chodzi?

Nie podoba sie tobie program?

 

Spojrz na to:

Jestem w pelni swiadomy tego, ze moj program nie potrafi pokazac roznicy wydajnosci pomiedzy prockami (a przynajmniej nie dokladnie), ale jestem z niego dumny ;)

Czy to, ze moj program praktycznie do niczego sie nie nadaje, zostal napisany w celach edukacyjnych, pozwala tobie pisac takie rzeczy? Obojetnie jakie bzdury tam nawypisywalem, to napracowalem sie nad tym mocno i prosilbym, abys uszanowal moja prace. Jesli cos jest zle to po prostu powiedz.

Edytowane przez xacti

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a jak mi zaszyłeś wirusa jakiego w nim i wykradniesz hasła? :D.. już raz se włączyłem program od sąsiada... że nazwiska nie wypowiem zero700 :D i cieszyłem się szybkim formatem dysku :lol: - ale to było za czasów 98 :)

 

3:29 @ venice 1933MHz :)

Edytowane przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

no bo zwykły program obciażą połowę procka.. taka jest zaleta 2 rdzeniowych... Program Ci ssa niby 100% a tu masz jeszcze połowę proca wolnego żeby robić co innego :).

 

Przykładowo, visual studio 2k5 potrafi kompilować kilka projektów na raz, w przypadku np kompilacji 2 projektów na 2 rdzeniach wykorzystane są oba.. ale jeśli kompilujemy jeden projekt, lub sobie nie życzymy wykorzystania 2 to będzie używany tylko 1... To jest dobre gdy robimy coś obciążającego i jeszcze chcemy pracować na kompie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiem, i to jest wlasnie problem, bo moja wiedza nie pozwala na odpalenie tego programu na 2 rdzeniach :P

tukamon cos wspominal o kompilatorze od intela, ale nie moglem go skonfigurowac z moim kompilatorem, wiec zostanie tak jak jest. ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Prosty benchmark

 

Wyniki dla athlona xp 2400+ to:

 

whetstone took: 4.14 secs for 2414 MFLOPS (w/ math lib)

whetstone took: 0.47 secs for 21278 MFLOPS (w/o math lib)

 

/* *  Whetstone benchmark in C.  This program is a translation of the *	original Algol version in "A Synthetic Benchmark" by H.J. Curnow *  and B.A. Wichman in Computer Journal, Vol  19 #1, February 1976. * *	Used to test compiler optimization and floating point performance. * *	Compile by:		cc -O -s -o whet whet.c *	or:			cc -O -DPOUT -s -o whet whet.c *	if output is desired. */#include "stdio.h"#include "math.h"#ifndef __GNUC__extern "C" int __stdcall timeGetTime();#else#include <sys/time.h>#include <sys/resource.h>#endif/* *Original double ITERATIONS declared as integer to make compatible with Delphi *const double ITERATIONS = 1000.0; // 100 Million Whetstone instructions */const int ITERATIONS = 100000; /* 100 Million Whetstone instructions */bool useMathLib = true;void run( void );void pa( double e[4] );void p3( double x, double y, double *z );void p0( void );#ifdef POUTvoid pout( int n, int j, int k, double x1, double x2, double x3, double x4 );#endifdouble second();double		x1, x2, x3, x4, x, y, z, t, t1, t2;double		e1[4];int			i, j, k, l, n1, n2, n3, n4, n6, n7, n8, n9, n10, n11;int main(int argc, char* argv[]){run:	double s = second();	run();	s = second() - s;	if(useMathLib == true) {		printf("whetstone took: %2.2f secs for %2.0f MFLOPS (w/  math lib)\r\n",s,(ITERATIONS / 10.0) / (s));		useMathLib = false;		goto run;	} else {		printf("whetstone took: %2.2f secs for %2.0f MFLOPS (w/o math lib)\r\n",s,(ITERATIONS / 10.0) / (s));	}}void run( void ){	/* initialize constants */	t   =   0.499975;	t1  =   0.50025;	t2  =   2.0;	/* set values of module weights */	n1  =   0 * ITERATIONS;	n2  =  12 * ITERATIONS;	n3  =  14 * ITERATIONS;	n4  = 345 * ITERATIONS;	n6  = 210 * ITERATIONS;	n7  =  32 * ITERATIONS;	n8  = 899 * ITERATIONS;	n9  = 616 * ITERATIONS;	n10 =   0 * ITERATIONS;	n11 =  93 * ITERATIONS;/* MODULE 1:  simple identifiers */	x1 =  1.0;	x2 = x3 = x4 = -1.0;	for(i = 1; i <= n1; i += 1) {		x1 = ( x1 + x2 + x3 - x4 ) * t;		x2 = ( x1 + x2 - x3 - x4 ) * t;		x3 = ( x1 - x2 + x3 + x4 ) * t;		x4 = (-x1 + x2 + x3 + x4 ) * t;	}#ifdef POUT	pout(n1, n1, n1, x1, x2, x3, x4);#endif/* MODULE 2:  array elements */	e1[0] =  1.0;	e1[1] = e1[2] = e1[3] = -1.0;	for (i = 1; i <= n2; i +=1) {		e1[0] = ( e1[0] + e1[1] + e1[2] - e1[3] ) * t;		e1[1] = ( e1[0] + e1[1] - e1[2] + e1[3] ) * t;		e1[2] = ( e1[0] - e1[1] + e1[2] + e1[3] ) * t;		e1[3] = (-e1[0] + e1[1] + e1[2] + e1[3] ) * t;	}#ifdef POUT	pout(n2, n3, n2, e1[0], e1[1], e1[2], e1[3]);#endif/* MODULE 3:  array as parameter */	for (i = 1; i <= n3; i += 1)		pa(e1);#ifdef POUT	pout(n3, n2, n2, e1[0], e1[1], e1[2], e1[3]);#endif/* MODULE 4:  conditional jumps */	j = 1;	for (i = 1; i <= n4; i += 1) {		if (j == 1)			j = 2;		else			j = 3;		if (j > 2)			j = 0;		else			j = 1;		if (j < 1 )			j = 1;		else			j = 0;	}#ifdef POUT	pout(n4, j, j, x1, x2, x3, x4);#endif/* MODULE 5:  omitted *//* MODULE 6:  integer arithmetic */	j = 1;	k = 2;	l = 3;	for (i = 1; i <= n6; i += 1) {		j = j * (k - j) * (l -k);		k = l * k - (l - j) * k;		l = (l - k) * (k + j);		e1[l - 2] = j + k + l;		/* C arrays are zero based */		e1[k - 2] = j * k * l;	}#ifdef POUT	pout(n6, j, k, e1[0], e1[1], e1[2], e1[3]);#endif/* MODULE 7:  trig. functions */	if( useMathLib ) {		x = y = 0.5;		for(i = 1; i <= n7; i +=1) {			x = t * atan(t2*sin(x)*cos(x)/(cos(x+y)+cos(x-y)-1.0));			y = t * atan(t2*sin(y)*cos(y)/(cos(x+y)+cos(x-y)-1.0));	   	}	}#ifdef POUT   	pout(n7, j, k, x, x, y, y);#endif/* MODULE 8:  procedure calls */	x = y = z = 1.0;	for (i = 1; i <= n8; i +=1)		p3(x, y, &z);#ifdef POUT	pout(n8, j, k, x, y, z, z);#endif/* MODULE9:  array references */	j = 1;	k = 2;	l = 3;	e1[0] = 1.0;	e1[1] = 2.0;	e1[2] = 3.0;	for(i = 1; i <= n9; i += 1)		p0();#ifdef POUT	pout(n9, j, k, e1[0], e1[1], e1[2], e1[3]);#endif/* MODULE10:  integer arithmetic */	j = 2;	k = 3;	for(i = 1; i <= n10; i +=1) {		j = j + k;		k = j + k;		j = k - j;		k = k - j - j;	}#ifdef POUT	pout(n10, j, k, x1, x2, x3, x4);#endif/* MODULE11:  standard functions */   	if( useMathLib ) {		x = 0.75;   			for(i = 1; i <= n11; i +=1) 			x = sqrt( exp( log(x) / t1));	}#ifdef POUT   	pout(n11, j, k, x, x, x, x);#endif}void pa( double e[4] ){/* remove register declaration for compatibility with Delphi	register int j;*/	int j;	j = 0;	 lab:	e[0] = (  e[0] + e[1] + e[2] - e[3] ) * t;	e[1] = (  e[0] + e[1] - e[2] + e[3] ) * t;	e[2] = (  e[0] - e[1] + e[2] + e[3] ) * t;	e[3] = ( -e[0] + e[1] + e[2] + e[3] ) / t2;	j += 1;	if (j < 6)		goto lab;}void p3(double x, double y, double *z){	x  = t * (x + y);	y  = t * (x + y);	*z = (x + y) /t2;}void p0( void ){	e1[j] = e1[k];	e1[k] = e1[l];	e1[l] = e1[j];}#ifdef POUTvoid pout( int n, int j, int k, double x1, double x2, double x3, double x4){/*	printf("%6d%6d%6d  %5e  %5e  %5e  %5e\n",		n, j, k, x1, x2, x3, x4);*/	printf("%6d%6d%6d  %5e %5e %5e %5e\n",		n, j, k, x1, x2, x3, x4);}#endif#ifndef __GNUC__double second(){	return((timeGetTime()/1000.0));}#elsedouble second(){	struct rusage ru;	getrusage(RUSAGE_SELF,&ru); 	return((ru.ru_utime.tv_sec+ru.ru_stime.tv_sec) + ((ru.ru_utime.tv_usec+ru.ru_stime.tv_usec)/1.0e6));}#endif

EDIT:

 

Nie wiem jak jest teraz, moze sie cos zmienilo w jezyku c++, jednak jeszcze jakis czas temu aby wykorzystywac watki w programach trzeba bylo uzywac biblioteki ZThread. Jak bede mial czas to napisze prosty przyklad z kilkoma watkami przy uzyciu tej biblioteki.

 

EDIT2:

 

Tak sobie mysle ze obciazyc dwa rdzenie to najlatwiej bedzie wykorzystujac jave... Watki sie tam latwo tworzy i nie trzeba zewnetrznych bibliotek.

 

EDIT3:

 

Przyklad w javie:

 

Plik SimpleThread.java

class SimpleThread extends Thread {  	public void run() {		double time1,time2,a;				time1 = System.currentTimeMillis(); // pobranie czasu przed wejsciem do glownej petli 							for (int i = 0; i < 1000000; i++) {					// Tutaj mozna wladowac cos co ma liczyc np. algorytm na liczenie liczb pierwszych		a=i/2;		a=i*a;						}				time2 = System.currentTimeMillis(); // pobranie czasu po skonczeniu glownej petli				time2=time2-time1;						System.out.println("Czas: "+ time2); //wyswietlenie czasu}	}

Plik main.java

class main {	public static void main (String[] args) {		new SimpleThread().start();   //uruchomienie watku 1		new SimpleThread().start();	  //uruchomienie watku 2	}}

 

Aby skompilowac przyklad potrzeba java JDK. Kompilujemy poleceniem: javac main.java

Po kompilacji uruchamiamy: java main

Aplikacja w sumie nic powaznego nie robi, uruchamia dwa watki ktore cos tam mnoza. Na koniec podawany jest czas trwania kazdego watku.

Edytowane przez TT05

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...