View Full Version : [C] algoritmo per programma bench
tecno789
23-10-2011, 14:52
Ciao a tutti i programmatori del forum :)
Allora premetto che sono un hardwarista e quindi di programmazione conosco solo html e il C, quindi non mi dite di scrivere in altri linguaggi.
Il punto è questo, sto provando a fare un programma che mi permetta di testare la potenza di calcolo della cpu, ma qualsiasi operazioni che io faccia non sono riuscito a mandare i core al 100%, qual'è l'algoritmo per poterlo fare?? esempio wprime e soci...
Non chiedo di poter smistare il carico sui multi-core, perchè va probabilmente aldilà delle mie capacità, però vorrei poter mandare al 100% la cpu, conoscete il modo?
int i=0;
while(i==i){
i=i+1;
if(i==1000)
i=0;
}
In ogni caso potresti fare, in modo molto semplice, un programma per la ricerca di numeri primi.
int num=3;
while(true){
boolean fail = false;
for(int div=3; div<=sqrt(num) && !fail; div+=2){
if(num%div == 0) fail = true;
}
if(!fail) cout<<num+"è un numero primo.";
num += 2;
}
tecno789
23-10-2011, 15:45
int i=0;
while(i==i){
i=i+1;
if(i==1000)
i=0;
}
In ogni caso potresti fare, in modo molto semplice, un programma per la ricerca di numeri primi.
int num=3;
while(true){
boolean fail = false;
for(int div=3; div<=sqrt(num) && !fail; div+=2){
if(num%div == 0) fail = true;
}
if(!fail) cout<<num+"è un numero primo.";
num += 2;
}
eh ma non manda i core al "massimo" :(
Purtroppo non l'ho provato perchè ho la CPU impegnata in una conversione.
In ogni caso può dipendere anche dalla politica di scheduling del SO.
Prova ad impostare la priorità a real-time.
tecno789
23-10-2011, 16:10
Purtroppo non l'ho provato perchè ho la CPU impegnata in una conversione.
In ogni caso può dipendere anche dalla politica di scheduling del SO.
Prova ad impostare la priorità a real-time.
impostando real-time, l'utilizzo dei core aumenta, ma non arriva al 100%, ma vorrei più che altro un escamotage a livello di codice per poter sfruttare appieno la cpu. possibile che non si può??
SerMagnus
23-10-2011, 18:46
se fai calcoli pesanti su grandi matrici su numeri reali, con ordinamenti e possibilmente e mediante programmazione multi thread dovresti occupare una buona percentuale della cpu.
come diceva Floris molto dipende dal SO, queste app piccole con semplici cicli su interi di per se non rappresentano calcoli complessi. se ci pensi anche concettualmente una cpu complessa come quelle moderne con queste cose non sono fruttate al 100%.
Con questi approcci analizzi più che altro il tempo di esecuzione, ecco perchè il so ti accoppa la % di utilizzo.
ora che ci penso potresti fare un programma per il calcolo del PI grego :D
tecno789
23-10-2011, 19:29
se fai calcoli pesanti su grandi matrici su numeri reali, con ordinamenti e possibilmente e mediante programmazione multi thread dovresti occupare una buona percentuale della cpu.
ora che ci penso potresti fare un programma per il calcolo del PI grego :D
Infatti, per occupare tutta la cpu, ci vuole per forza dietro una programmazione multi-thread. Speravo ci fosse una sorta di metodo per "allocare" o meglio occupare tutta la cpu in quel determinato processo.
Se sei sotto Linux dai un'occhiata alle librerie pthread ;).
tecno789
24-10-2011, 10:01
Se sei sotto Linux dai un'occhiata alle librerie pthread ;).
Ok mi informerò, in quanto non le conosco :) grazie
Ciao a tutti i programmatori del forum :)
Allora premetto che sono un hardwarista e quindi di programmazione conosco solo html e il C, quindi non mi dite di scrivere in altri linguaggi.
Il punto è questo, sto provando a fare un programma che mi permetta di testare la potenza di calcolo della cpu, ma qualsiasi operazioni che io faccia non sono riuscito a mandare i core al 100%, qual'è l'algoritmo per poterlo fare?? esempio wprime e soci...
Non chiedo di poter smistare il carico sui multi-core, perchè va probabilmente aldilà delle mie capacità, però vorrei poter mandare al 100% la cpu, conoscete il modo?
Ma cos'e' che devi testare di preciso ?
se devi solo mandare la cpu a manetta in teoria basta un qualche loop che continui fare calcoli a vuoto. Una cosa idiota tipo
int main()
{
while(1)
{
int y = 10*10;
}
}
compilata con -O0 manda tranquillamente al 100% la mia cpu. Se devi mandarci piu' core lancia piu' istanze del programma. Lo scheduler del s.o. dovrebbe fare il resto.
eh ma non manda i core al "massimo" :(
Che macchina e' e su che sistema operativo ?
Potrebbe in alternativa usare una fork-bomb :sofico:
while(1)
{
fork();
}
Potrebbe in alternativa usare una fork-bomb :sofico:
while(1)
{
fork();
}
Ma a questo punto non occorre manco un compilatore... bash e via :asd:
:(){ :|:& };:
Ma a questo punto non occorre manco un compilatore... bash e via :asd:
:(){ :|:& };:
:stordita:
Ma a questo punto non occorre manco un compilatore... bash e via :asd:
:(){ :|:& };:
:eek:
Chiamate un esorciccio :asd:
:eek:
Chiamate un esorciccio :asd:
E' solo scritto in modo esoterico
se scrivo
bomb()
{
bomb | bomb &
};
bomb
Non fa piu' cosi' paura :D
tecno789
24-10-2011, 16:47
Che macchina e' e su che sistema operativo ?
Windows e linux , entrambi, le caratteristiche tecniche le trovi in firma. Comunque quello che vorrei fare è un semplicissimo programma che mandi la cpu al 100%. Ma si fa con le fork quindi? Esempio io ho 6 core, come faccio a spostare il carico su tutti e 6?
Windows e linux , entrambi, le caratteristiche tecniche le trovi in firma. Comunque quello che vorrei fare è un semplicissimo programma che mandi la cpu al 100%. Ma si fa con le fork quindi? Esempio io ho 6 core, come faccio a spostare il carico su tutti e 6?
No, se fai quella cosa con le fork probabilmente ti crasha il sistema :asd:
Apre un numero infinito di processi che al loro volta aprono un numero infinito di processi, il 100% è assicurato :asd:
Per essere sicuro che il tuo programma usa il 100% della CPU probabilmente devi usare delle caratteristiche del sistema, tipo settare l'affinità del processore per assegnare un thread ad ogni core manualmente (altrimenti il SO lo sceglie man mano), e aumentando manualmente la priorità del processo all'interno del programma stesso.
Ma comunque non ho capito che te ne fai di un programma che va al 100% della CPU :stordita:
tecno789
24-10-2011, 17:23
No, se fai quella cosa con le fork probabilmente ti crasha il sistema :asd:
Apre un numero infinito di processi che al loro volta aprono un numero infinito di processi, il 100% è assicurato :asd:
Per essere sicuro che il tuo programma usa il 100% della CPU probabilmente devi usare delle caratteristiche del sistema, tipo settare l'affinità del processore per assegnare un thread ad ogni core manualmente (altrimenti il SO lo sceglie man mano), e aumentando manualmente la priorità del processo all'interno del programma stesso.
Ma comunque non ho capito che te ne fai di un programma che va al 100% della CPU :stordita:
Beh appunto per calcolare la potenza massima della cpu. Conosci wprime?? E tipo quello vorrei fare, ma ovviamente semplificato.
tecno789
24-10-2011, 17:33
No, se fai quella cosa con le fork probabilmente ti crasha il sistema :asd:
Apre un numero infinito di processi che al loro volta aprono un numero infinito di processi, il 100% è assicurato :asd:
Per essere sicuro che il tuo programma usa il 100% della CPU probabilmente devi usare delle caratteristiche del sistema, tipo settare l'affinità del processore per assegnare un thread ad ogni core manualmente (altrimenti il SO lo sceglie man mano), e aumentando manualmente la priorità del processo all'interno del programma stesso.
Ma comunque non ho capito che te ne fai di un programma che va al 100% della CPU :stordita:
edit. scusate errore, colpa del mio nokia :D
Scusa ma non capisco che significa mandare la CPU al 100%. In generale un programma di benchmark deve fissare uno scopo. Tipo: calcolo dei numeri fino ad una certa cifra, etc...
Trovati una serie di problemi ed implementa l'algoritmo per risolverlo e vedi quanto ci mettono.
tecno789
24-10-2011, 19:09
Scusa ma non capisco che significa mandare la CPU al 100%. In generale un programma di benchmark deve fissare uno scopo. Tipo: calcolo dei numeri fino ad una certa cifra, etc...
Trovati una serie di problemi ed implementa l'algoritmo per risolverlo e vedi quanto ci mettono.
hai mai provato ad usare wprime???
ecco volevo fare una cosa simile, per quanto riguarda problemi vari, ho già implementato tutto.
E' sufficiente un:
white(1);
per mandare in palla un core del processore. Se vuoi caricarli tutti:
#include <stdio.h>
#include <windows.h>
#define NCORE 4
int vai(void *) {
while(1);
}
int main(int argc, char *argv[]) {
for(int n = 0; n < NCORE; ++n)
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)vai, (LPVOID)0, 0, NULL);
getch();
}
hai mai provato ad usare wprime???
ecco volevo fare una cosa simile, per quanto riguarda problemi vari, ho già implementato tutto.
Non l'ho mai usato, ma come vedi dalla descrizione, il suo obiettivo è il seguente:
wPrime is a leading multithreaded benchmark for x86 processors that tests your processor performance by calculating square roots with a recursive call of Newton's method for estimating functions
Che non è "mandare la CPU al 100%". In questo thread chi più chi meno ti ha consigliato un ciclo infinito, no? Ammesso che ce la mandi con un while(1), che hai risolto? Che hai dimostrato sul processore che stai usando?
tecno789
24-10-2011, 22:19
Non l'ho mai usato, ma come vedi dalla descrizione, il suo obiettivo è il seguente:
wPrime is a leading multithreaded benchmark for x86 processors that tests your processor performance by calculating square roots with a recursive call of Newton's method for estimating functions
Che non è "mandare la CPU al 100%". In questo thread chi più chi meno ti ha consigliato un ciclo infinito, no? Ammesso che ce la mandi con un while(1), che hai risolto? Che hai dimostrato sul processore che stai usando?
forse non l'hai capito e sinceramente non ho la voglia di spiegartela, ma ti ho già detto che sto provando a fare un programma simile a wprime. Il che vuol dire che se riesco a mandare i core al 100% riesco a misurare le prestazioni massime del processore. capito?? scarica wprime e provalo al massimo, un pò di cultura non fa mai male, anche perchè non so più come spiegartelo :)
tecno789
24-10-2011, 22:32
E' sufficiente un:
white(1);
per mandare in palla un core del processore. Se vuoi caricarli tutti:
#include <stdio.h>
#include <windows.h>
#define NCORE 4
int vai(void *) {
while(1);
}
int main(int argc, char *argv[]) {
for(int n = 0; n < NCORE; ++n)
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)vai, (LPVOID)0, 0, NULL);
getch();
}
while(1) funziona eccome, ma non si adatta al mio contesto. Cioè io sto misurando un'operazione per poter misurare le capacità della cpu, ma se c'è un while che mi manda il loop infinito quell'operazione non finisce mai, quindi non posso utilizzarla.
A questo punto devi pensare ad un problema che comporti un uso massiccio di CPU.
Erano stati proposti calcoli su matrici o ordinamenti; altrimenti il solito calcolo del pi o dei numeri primi.
while(1) funziona eccome, ma non si adatta al mio contesto. Cioè io sto misurando un'operazione per poter misurare le capacità della cpu, ma se c'è un while che mi manda il loop infinito quell'operazione non finisce mai, quindi non posso utilizzarla.
Ora ti sei spiegato meglio.
In teoria qualsiasi algoritmo che usi solo la cpu va bene.
Se la cpu non va al 100% vuol dire che effettui qualche altra operazione che non fa uso della cpu. Questo potrebbe essere lettura/scrittura su disco, usare una notevole quantita' di memoria che causa swap, comunicazione di rete, altro ancora. Oppure semplicemente fai dei test che durano troppo poco...
pero' a questo punto senza capire cosa fa il tuo codice che non ti funziona, dare ulteriori suggerimenti e' difficile.
Certo, io ho banalizzato il tutto per farti vedere come caricare al 100% il processore partendo da una funzione. Dato che, senza multithreading, se hai più di un processore logico il carico del 100% non lo avrai mai.
Aggiungici qualcosa del tipo:
int calcola(void *) {
/* ciclo con calcoli a tua discrezione */
}
int main(int argc, char *argv[]) {
HANDLE *h = new HANDLE[200];
unsigned tempo;
tempo = GetTickCount();
for(int n = 0; n < 200; ++n)
h[n] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)calcola, (LPVOID)0, 0, NULL);
WaitForMultipleObjects(200, h, TRUE, INFINITE);
printf("\nSono passati %ums", GetTickCount() - tempo);
}
Così hai 200 thread che eseguono dei calcoli, la WaitForSingleObjects torna quando tutti e 200 avranno terminato l'elaborazione. Programmi come SuperPI calcolano le prime tot cifre di PI greco, ma qualsiasi altro calcolo andrà bene.
Dipende se vuoi un test che carichi solo il processore o un mix tra cpu e ram.
SuperPI utilizza uno sviluppo in serie per calcolare pi greco, ma puoi partire da qualcosa di più banale calcolando il rapporto tra l'area di un quadrato di raggio X (Q = X²) e quella del cerchi di raggio X/2 (C = PI * X² / 4). Da cui ricavi PI come 4 * C / Q.
L'area del cerchio è data dalla somma dei punti che distano meno di R dal cerntro, considerando il centro nel mezzo:
int calcola(void *) {
double y, x, Q, C = 0.0f, epsilon = .00001f;
for(y = -1.0f; y < 1.0f; y += epsilon) {
for(x = -1.0f; x < 1.0f; x += epsilon) {
if ((x * x) + (y * y) < 1.0f) C += epsilon * epsilon;
}
}
Q = 4.0f;
/* printf("\nPI=%.6f", C / Q * 4.0f); */
}
Quanto più piccolo sarà epsilon, tanto più lento e preciso sarà il calcolo. Se vuoi ottimizzare il numero di thread, anzichè crearne 200, puoi chiedere al sistema operativo quanti processori logici ci sono.
Sotto Windows:
SYSTEM_INFO si;
GetSystemInfo(&si);
printf("\nCi sono %u processori", si.dwNumberOfProcessors);
Ma qualsiasi altra cosa andrà altrettanto bene, fai lavorare la fantasia e divertiti.
Mirkolo ho una domanda:
if ((x * x) + (y * y) < 1.0f)
In generale, per moltiplicazione e divisione coi fp, si fa sempre così oppure si misura se il prodotto è < di un certo delta?
tecno789
25-10-2011, 08:25
Certo, io ho banalizzato il tutto per farti vedere come caricare al 100% il processore partendo da una funzione. Dato che, senza multithreading, se hai più di un processore logico il carico del 100% non lo avrai mai.
Aggiungici qualcosa del tipo:
int calcola(void *) {
/* ciclo con calcoli a tua discrezione */
}
int main(int argc, char *argv[]) {
HANDLE *h = new HANDLE[200];
unsigned tempo;
tempo = GetTickCount();
for(int n = 0; n < 200; ++n)
h[n] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)calcola, (LPVOID)0, 0, NULL);
WaitForMultipleObjects(200, h, TRUE, INFINITE);
printf("\nSono passati %ums", GetTickCount() - tempo);
}
Così hai 200 thread che eseguono dei calcoli, la WaitForSingleObjects torna quando tutti e 200 avranno terminato l'elaborazione. Programmi come SuperPI calcolano le prime tot cifre di PI greco, ma qualsiasi altro calcolo andrà bene.
Dipende se vuoi un test che carichi solo il processore o un mix tra cpu e ram.
SuperPI utilizza uno sviluppo in serie per calcolare pi greco, ma puoi partire da qualcosa di più banale calcolando il rapporto tra l'area di un quadrato di raggio X (Q = X²) e quella del cerchi di raggio X/2 (C = PI * X² / 4). Da cui ricavi PI come 4 * C / Q.
L'area del cerchio è data dalla somma dei punti che distano meno di R dal cerntro, considerando il centro nel mezzo:
int calcola(void *) {
double y, x, Q, C = 0.0f, epsilon = .00001f;
for(y = -1.0f; y < 1.0f; y += epsilon) {
for(x = -1.0f; x < 1.0f; x += epsilon) {
if ((x * x) + (y * y) < 1.0f) C += epsilon * epsilon;
}
}
Q = 4.0f;
/* printf("\nPI=%.6f", C / Q * 4.0f); */
}
Quanto più piccolo sarà epsilon, tanto più lento e preciso sarà il calcolo. Se vuoi ottimizzare il numero di thread, anzichè crearne 200, puoi chiedere al sistema operativo quanti processori logici ci sono.
Sotto Windows:
SYSTEM_INFO si;
GetSystemInfo(&si);
printf("\nCi sono %u processori", si.dwNumberOfProcessors);
Ma qualsiasi altra cosa andrà altrettanto bene, fai lavorare la fantasia e divertiti.
grandissimo..... il problema è che non ho capito bene come faccio a creare thread, nel tuo caso di codice 200, ma non mi torna, mi da errori in fase di compilazione.
guarda questo è un esempio STUPIDO:
#include <stdio.h>
#include <time.h>
#include <math.h>
int main(int argc,char **argv)
{
long int i,a;
const unsigned long int num=6000000000000000000000000000;
clock_t start_clock=clock();
printf("Calcolo secondi che impiega la vostra cpu a completare le operazioni \n");
for(i=0;i<num;i++)
a=(num*num*num*num*num*num*num*num*num*num);
double sqrt(a);
printf("Processor time used : %g sec.\n",(clock() - start_clock)/(double) CLOCKS_PER_SEC);
system("PAUSE");
return 0;
}
banryu79
25-10-2011, 08:42
[CODE]
...
const unsigned long int num=6000000000000000000000000000;
...
Forse è qua il problema.
Se non ricordo male, il range per gli unsigned long int va da 0 a ULONG_MAX.
ULONG_MAX è definita in limits.h, mi pare.
Forse sfori il range.
tecno789
25-10-2011, 11:34
Forse è qua il problema.
Se non ricordo male, il range per gli unsigned long int va da 0 a ULONG_MAX.
ULONG_MAX è definita in limits.h, mi pare.
Forse sfori il range.
Sisi lo si grazie, non era qui in cerca di una soluzione per quella cavolata di programma, più che altro vorrei capire come creare thread per caricare la cpu!
Mi sa che finchè sei in un sistema operativo "moderno" non riesci a caricare al 100% la cpu (o un core) con solo un tuo programma.
Principalmente per il fatto che l'OS si riserva sempre un tempo di Cpu per il modulo del kernel che si occupa dell'assegnazione della cpu ai processi. Mettendo il processo con priorità real time ottieni la massima priorità, ma non il massimo uso di cpu altrimenti il sistema potrebbe "perdere il controllo" sulla cpu.
Inoltre è anche vero che non tutte le istruzioni occupano solo il processore, un accesso a memoria (anche una semplice assegnazione) comporta l'accesso alla cache della cpu o alla memoria.
Poi dipende da cosa vuoi testare anche della cpu: l'alu, la cache di primo livello, di secondo... Per fare un lavoro preciso dovresti usare un linguaggio macchina come l'assembly così da dire per filo e per segno alla cpu che calcoli deve fare. L'assembly lo puoi facilmente embeddare in un programma scritto in C quindi a parte capire il significato di qualche comando non c'e' molto altro da fare, anche se diventa meno portabile rispetto a un programma scritto in C.
In ogni caso anche se la cpu lavora al 99% penso che sia sufficiente, di fatto i benchmark che ci sono in giro lavorano con questo presupposto. Da ciò deriva anche il fatto che lo stesso benchmark può fornire punteggi lievemente diversi ogni volta che lo fai in base a quali altri processi sono in esecuzione.
Ciao a tutti i programmatori del forum :)
Allora premetto che sono un hardwarista e quindi di programmazione conosco solo html e il C, quindi non mi dite di scrivere in altri linguaggi.
Il punto è questo, sto provando a fare un programma che mi permetta di testare la potenza di calcolo della cpu, ma qualsiasi operazioni che io faccia non sono riuscito a mandare i core al 100%, qual'è l'algoritmo per poterlo fare?? esempio wprime e soci...
Non chiedo di poter smistare il carico sui multi-core, perchè va probabilmente aldilà delle mie capacità, però vorrei poter mandare al 100% la cpu, conoscete il modo?
potenza di cosa? calcolo intero, calcolo fp, SSE ecc ecc per testare la potenza della cpu non basta mandare il carico al 100% devi anche usare le opportune istruzioni sulle quali vuoi organizzare il bench
SerMagnus
25-10-2011, 15:59
per quanto mi riguarda stai sbagliando approccio, capisco che è una cosa amatoriale, ma non cavi un ragno dal buco senza un minimo di approfondimento tecnico e teorico.
già dopo aver visto questo è meglio che ti dica: leva mano.
ti hanno già detto che hai sbagliato, se insisti senza un minimo di teoria stai sbagliando strada.
const unsigned long int num=6000000000000000000000000000;
a=(num*num*num*num*num*num*num*num*num*num);
a partire dal fatto che anche secondo me non hai le idee chiare.
non prendertela a male, ma voglio solo farti caprie dove sbagli.
tecno789
25-10-2011, 17:36
Mi sa che finchè sei in un sistema operativo "moderno" non riesci a caricare al 100% la cpu (o un core) con solo un tuo programma.
Principalmente per il fatto che l'OS si riserva sempre un tempo di Cpu per il modulo del kernel che si occupa dell'assegnazione della cpu ai processi. Mettendo il processo con priorità real time ottieni la massima priorità, ma non il massimo uso di cpu altrimenti il sistema potrebbe "perdere il controllo" sulla cpu.
Inoltre è anche vero che non tutte le istruzioni occupano solo il processore, un accesso a memoria (anche una semplice assegnazione) comporta l'accesso alla cache della cpu o alla memoria.
Poi dipende da cosa vuoi testare anche della cpu: l'alu, la cache di primo livello, di secondo... Per fare un lavoro preciso dovresti usare un linguaggio macchina come l'assembly così da dire per filo e per segno alla cpu che calcoli deve fare. L'assembly lo puoi facilmente embeddare in un programma scritto in C quindi a parte capire il significato di qualche comando non c'e' molto altro da fare, anche se diventa meno portabile rispetto a un programma scritto in C.
In ogni caso anche se la cpu lavora al 99% penso che sia sufficiente, di fatto i benchmark che ci sono in giro lavorano con questo presupposto. Da ciò deriva anche il fatto che lo stesso benchmark può fornire punteggi lievemente diversi ogni volta che lo fai in base a quali altri processi sono in esecuzione.
quindi in C dici che non si riesce a scrivere un programma del genere??
potenza di cosa? calcolo intero, calcolo fp, SSE ecc ecc per testare la potenza della cpu non basta mandare il carico al 100% devi anche usare le opportune istruzioni sulle quali vuoi organizzare il bench
potenza generale della cpu, perchè wprime si basa sulle istruzioni?? non esegue la radice quadrata di un range di numeri???
per quanto mi riguarda stai sbagliando approccio, capisco che è una cosa amatoriale, ma non cavi un ragno dal buco senza un minimo di approfondimento tecnico e teorico.
già dopo aver visto questo è meglio che ti dica: leva mano.
ti hanno già detto che hai sbagliato, se insisti senza un minimo di teoria stai sbagliando strada.
const unsigned long int num=6000000000000000000000000000;
a=(num*num*num*num*num*num*num*num*num*num);
a partire dal fatto che anche secondo me non hai le idee chiare.
non prendertela a male, ma voglio solo farti caprie dove sbagli.
uh si di sicuro quel programmino l'ho fatto alla cavolo, hai perfettamente ragione, ma non è il programma finale, cioè prima volevo capire solamente come utilizzare tutta la cpu e poi avrei fatto un programma decente, comunque non essendo un programmatore, le critiche sono ben accette :)
cdimauro
25-10-2011, 17:40
E' praticamente impossibile utilizzare tutta la CPU per ogni ciclo di clock, se è questo che vorresti ottenere: per un motivo o per un altro ci saranno delle sezioni e/o unità (di esecuzione) non utilizzate.
tecno789
25-10-2011, 17:56
E' praticamente impossibile utilizzare tutta la CPU per ogni ciclo di clock, se è questo che vorresti ottenere: per un motivo o per un altro ci saranno delle sezioni e/o unità (di esecuzione) non utilizzate.
e i programmi di bench come fanno ad ottenere ciò??
cdimauro
25-10-2011, 19:08
A ottenere cosa? Come ho già detto, è praticamente impossibile farlo.
Se hai conoscenze di architetture degli elaboratori, prenditi lo schema interno di una CPU, conta tutte le sezioni che ci sono, le unità di esecuzione, e cerca di immaginare un mix di istruzioni che potrebbe impegnarle tutte.
Girala quanto vuoi, vedrai che, a conti fatti, qualcuna rimarrà sempre a girarsi i pollici.
tecno789
25-10-2011, 19:10
A ottenere cosa? Come ho già detto, è praticamente impossibile farlo.
Se hai conoscenze di architetture degli elaboratori, prenditi lo schema interno di una CPU, conta tutte le sezioni che ci sono, le unità di esecuzione, e cerca di immaginare un mix di istruzioni che potrebbe impegnarle tutte.
Girala quanto vuoi, vedrai che, a conti fatti, qualcuna rimarrà sempre a girarsi i pollici.
a ottenere il 100% su tutti i core...
sinceramente ho sottovalutato la questione, non credevo fosse così complicato visto che ce ne sono a bizzeffe di programmi bench.
cdimauro
25-10-2011, 19:37
Se già non ci riesci su un solo core, figuriamoci su 4. :stordita:
tecno789
25-10-2011, 19:39
Se già non ci riesci su un solo core, figuriamoci su 4. :stordita:
ahahah
no ma ho visto che se metti in wprime 1 solo core, non riesce a caricartelo singolarmente ma viene utilizzato un pò da tutti, però quando li utilizza tutti, li spreme al massimo tutti. Comunque il codice BANALE che hai visto sopra, mi carica un core intero :D
Non diciamo cavolate, se vuole portare la CPU al 100% può farlo con il minimo sforzo, e i pezzi di codice riportarti da me sono un semplice esempio. Ovvio che un minimo punto percentuale verrà sfruttato dal sistema operativo, ma parliamo di nanosecondi. I programmi che fanno benchmark devono essere lanciati con un installazione pulita e senza troppi processi in esecuzione, proprio per avere misurazioni più attendibili.
Il problema semmai è sfruttare al 100% la cpu in un algoritmo generico. Non tutti gli algoritmi possono essere adattati facilmente e efficacemente al multithreading. Spesso sono necessarie sincronizzazioni che obbligano alcuni thread a mettersi in attesa dei risultati generati da altri thread, riducendo il carico di lavoro totale.
@Tecno789: i pezzi di sorgente da me riportati sono per Win32 e richiedono un #include<windows.h> all'inizio. Se hai altri problemi di compilazione basta che chiedi.
@dierre: è vero se devi fare verifica tipo a == b, in tal caso meglio controllare che il valore assoluto della differenza sia minore di un certo epsilon. Per per confronti tipo il mio a < b non serve a nulla.
tecno789
25-10-2011, 20:30
Non diciamo cavolate, se vuole portare la CPU al 100% può farlo con il minimo sforzo, e i pezzi di codice riportarti da me sono un semplice esempio. Ovvio che un minimo punto percentuale verrà sfruttato dal sistema operativo, ma parliamo di nanosecondi. I programmi che fanno benchmark devono essere lanciati con un installazione pulita e senza troppi processi in esecuzione, proprio per avere misurazioni più attendibili.
Il problema semmai è sfruttare al 100% la cpu in un algoritmo generico. Non tutti gli algoritmi possono essere adattati facilmente e efficacemente al multithreading. Spesso sono necessarie sincronizzazioni che obbligano alcuni thread a mettersi in attesa dei risultati generati da altri thread, riducendo il carico di lavoro totale.
@Tecno789: i pezzi di sorgente da me riportati sono per Win32 e richiedono un #include<windows.h> all'inizio. Se hai altri problemi di compilazione basta che chiedi.
@dierre: è vero se devi fare verifica tipo a == b, in tal caso meglio controllare che il valore assoluto della differenza sia minore di un certo epsilon. Per per confronti tipo il mio a < b non serve a nulla.
grazie mille..
comunque per quanto riguarda i tuoi sorgenti ho provato a compilarli ma mi da errori vari e non riesco a testarli.
Comunque volevo solo capire come fai ad utilizzare la funzione createthread, perchè non ho ancora capito poi sull'algoritmo di funzionamento ci lavorerò su io..
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)calcola, (LPVOID)0, 0, NULL);
Crea un nuovo thread il cui codice è quello della funzione "calcola", che deve tornare un int e prendere un puntatore a void come parametro. Dopo quella chiamata, se non ci sono stati errori, in memoria ci saranno due thread: quello principale che ha fatto la chiamata, che è quindi libero di proseguire, e quello dato dalla funzione calcola, che morirà quando il codice tornerà con una return.
Per fare in modo che il thread principale attenda il termine del thread che ha creato c'è la funzione WaitForSingleObjext, che prende in ingresso l'handle del thread (ritornato dalla CreateThread) e come secondo parametro il massimo tempo di attesa, o INFINITE se vuoi attendere senza limite.
Ricapitando: si parte con un solo thread, appena chiami h = CreateThread(...) ne avrai in esecuzione due. Per far sì che il padre attenda il termine del figlio chiami WaitForSingleObject(h, INFINITE); da questo punto in poi in memoria ci sarà nuovamente solo un thread.
tecno789
25-10-2011, 22:06
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)calcola, (LPVOID)0, 0, NULL);
Crea un nuovo thread il cui codice è quello della funzione "calcola", che deve tornare un int e prendere un puntatore a void come parametro. Dopo quella chiamata, se non ci sono stati errori, in memoria ci saranno due thread: quello principale che ha fatto la chiamata, che è quindi libero di proseguire, e quello dato dalla funzione calcola, che morirà quando il codice tornerà con una return.
Per fare in modo che il thread principale attenda il termine del thread che ha creato c'è la funzione WaitForSingleObjext, che prende in ingresso l'handle del thread (ritornato dalla CreateThread) e come secondo parametro il massimo tempo di attesa, o INFINITE se vuoi attendere senza limite.
Ricapitando: si parte con un solo thread, appena chiami h = CreateThread(...) ne avrai in esecuzione due. Per far sì che il padre attenda il termine del figlio chiami WaitForSingleObject(h, INFINITE); da questo punto in poi in memoria ci sarà nuovamente solo un thread.
grazie mille della delucidazione, io lavoravo con le fork e questo createthread non me lo ricordavo.
quanti thread mi consigli di aprire per eseguire un'operazione matematica?
cdimauro
26-10-2011, 05:59
ahahah
no ma ho visto che se metti in wprime 1 solo core, non riesce a caricartelo singolarmente ma viene utilizzato un pò da tutti, però quando li utilizza tutti, li spreme al massimo tutti. Comunque il codice BANALE che hai visto sopra, mi carica un core intero :D
Se per te "caricare un core intero" equivale a vedere la sua barretta al 100% nel task manager, è molto facile arrivarci.
Non diciamo cavolate, se vuole portare la CPU al 100% può farlo con il minimo sforzo, e i pezzi di codice riportarti da me sono un semplice esempio. Ovvio che un minimo punto percentuale verrà sfruttato dal sistema operativo, ma parliamo di nanosecondi. I programmi che fanno benchmark devono essere lanciati con un installazione pulita e senza troppi processi in esecuzione, proprio per avere misurazioni più attendibili.
Il problema semmai è sfruttare al 100% la cpu in un algoritmo generico. Non tutti gli algoritmi possono essere adattati facilmente e efficacemente al multithreading. Spesso sono necessarie sincronizzazioni che obbligano alcuni thread a mettersi in attesa dei risultati generati da altri thread, riducendo il carico di lavoro totale.
Vedi sopra, e peraltro mi sembrava di aver scritto in maniera chiara cosa intendessi.
Visto che sembri non aver capito, ecco qui:
http://www.hwupgrade.it/articoli/cpu/2997/slide_3.jpg
Questo è un "blocco funzionale" (che integra due core) dell'ultima architettura di AMD.
Fammi vedere con quale mistura di codice riusciresti a impegnare tutte sezioni e unità d'esecuzione di un solo core.
Io avevo capito che lui volesse scrivere un software per fare benchmark, se non è così allora ritiro tutto. In tal caso qualsiasi cosa giri sopra un sistema operativo non va bene, idem se utilizza linguaggi di alto livello. Oltre al fatto che va scritto un codice ad hoc diverso per ogni processore esistente. Ma non ne capisco l'utilizzo.
Se invece l'intento era di fare un software di benchmark, lo scopo di questi è di testare i tempi di calcolo del processore con algoritmi di uso frequente, come l'ordinamento, FFT o altre cose che ricapitano fuori in vari ambiti e quindi sono una buona base per avere un'idea di massima delle doti velocistiche del processore. Ovvio che un test del genere su un solo thread andrà a vantaggio di processori con pochi core e alte frequenze, piuttosto che con molti core e frequenze inferiori. Motivo per cui ho consigliato di lanciare tanti thread quanti sono i processori logici del sistema. Tutto qui.
tecno789
26-10-2011, 19:34
Se invece l'intento era di fare un software di benchmark, lo scopo di questi è di testare i tempi di calcolo del processore con algoritmi di uso frequente, come l'ordinamento, FFT o altre cose che ricapitano fuori in vari ambiti e quindi sono una buona base per avere un'idea di massima delle doti velocistiche del processore. Ovvio che un test del genere su un solo thread andrà a vantaggio di processori con pochi core e alte frequenze, piuttosto che con molti core e frequenze inferiori. Motivo per cui ho consigliato di lanciare tanti thread quanti sono i processori logici del sistema. Tutto qui.
si si avevi capito bene, sto studiando un modo per aprire i thread ma mi da errori in compilazione, purtroppo me lo sto facendo da autodidatta e ci devo sbattere la testa un pò.
poi vabbè rimane un programmino del "cavolo" non è che lo mando alla microsoft :D
no perchè il mio intento non era quello di mettere in mezzo le istruzioni.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.