Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16-ak0001nl combina RTX 5080 Laptop e Ryzen AI 9 HX 375 in un desktop replacement potente e ben raffreddato, con display 240 Hz e dotazione completa. Autonomia limitata e calibrazione non perfetta frenano l'entusiasmo, ma a 2.609 euro è tra le proposte più interessanti della categoria.
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-07-2009, 09:49   #1
alessia86
Member
 
Iscritto dal: Dec 2008
Messaggi: 125
[C++] programmazione multithreads

Salve..non ho capito bene come funziona la programmazione multithreads..ad es. ho questo problema:
Codice HTML:
Devo implementare qst funzione:



int * expr(int * X,int * Y,int * Z,int * W,int N);



Qst funzione prende in input i puntatori a 4 vettori X,Y,Z,W di dimensione N e deve ritornare ed allocare un puntatore al vettore R ottenuto calcolando l'espressione vettoriale :



R=X*X+Y*Y+Z*Z+W*W



La funzione deve essere ottimizzata in termini di prestazioni,tenendo conto di avere a disposizione 8 processori. Implementazioni sequenziali non vengono prese in considerazione.

Siccome i processori sono 8 come faccio metà gli faccio fare il quadrato e l'altra metà la somma?
poi non ho capito qnd partono i threads insieme come fanno ognuno ad eseguire il proprio lavoro?
Non ci ho capito nulla con qst programmazione multithreads
Spero mi aiuterete..
Grazie
alessia86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2009, 10:45   #2
alessia86
Member
 
Iscritto dal: Dec 2008
Messaggi: 125
io ho provato a risolverlo cosi:

Codice:

#include<JTC/JTC.h>
#include<iostream.h>

int * sum(int * X,int * Y,int N)
{
	int * result=new int[N];

	for(int i=0;i<N;i++){

		result[i]=X[i]+Y[i];

	}

	return result;
}


int * prod(int * X,int N)
{
	int * result=new int[N];

	for(int i=0;i<N;i++)
	{
		result[i]=X[i]*X[i];
	}

	return result;

}


class CalcolaEspressione:public JTCMonitor
{
	int nThreads;
	int ThreadsFiniti;

public:

	int * X;
	int * Y;
	int N;
	

	int * R;

	CalcolaEspressione(int nt)
	{
		nThreads=nt;

		ThreadsFiniti=0;
	};

	void setDone()
	{
		JTCSynchronized sync(*this);

		ThreadsFiniti++;

		if(ThreadsFiniti==nThreads)
			notify();

	}

	void waitForCompletion()
	{
		JTCSynchronized sync(*this);

		if(ThreadsFiniti<nThreads)
			wait();
	}

};

class Espressione:public JTCThread
{
	CalcolaEspressione * c;

	bool sp;

public:

	Espressione(CalcolaEspressione * c,bool sp)
	{
		this->c=c;

		this->sp=sp;

	}

	virtual void run()
	{
		c->R=(sp?sum(c->X,c->Y,c->N):prod(c->X,c->N));

		c->setDone();

	}

};


int * expr(int * X,int * Y,int * Z,int * W,int N)
{
	CalcolaEspressione * cal=new CalcolaEspressione(8);

	Espressione * e[8];

	

   for(int i=0;i<8;i++)
   {
	   e[i]=new Espressione(cal,false);
	   e[i]->start();

   }


   e[N-1]=new Espressione(cal,true);

   e[N-1]->start();

   cal->waitForCompletion();

   return cal->R;

}















int X[] = {1, 2, -1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0};
int Y[] = {1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0};
int Z[] = {1, 2, -1, 0, 3, 0, 0,0, 0, 1, 0, 0, 0, 0};
int K[] = {1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0};


int main()

{
   JTCInitialize init;
   int* R = expr(X,Y,Z,K,13);
   for(int i = 0; i < 13; i++)
   {
	   cout << R[i] << " ";
   }
   cout<<endl;
   return 0;
}
però quando lo faccio partire mi dice:

Codice PHP:
unknown exception 
qualcuno puoi aiutarmi a capire dove sbaglio...
alessia86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2009, 16:43   #3
alessia86
Member
 
Iscritto dal: Dec 2008
Messaggi: 125
cosi mi da..però

Allora l'ho risolto utilizzando la classe buffer
Codice:
#include<JTC/JTC.h>
#include<iostream.h>
#include"Buffer.h"

int * sum(int * X,int * Y,int N)
{
	int * result=new int[N];

	for(int i=0;i<N;i++)
	{
		result[i]=X[i]+Y[i];
	}
	return result;
}

int * prod(int * X,int N)
{
	int * result=new int[N];

	for(int i=0;i<N;i++)
	{
		result[i]=X[i]*X[i];
	}

	return result;
}


class Request
{
public:

	int * X;
	int * Y;
	//int * Z;
	//int * W;

	int N;

    bool sommaProd;

public:

	Request(int * X,int * Y,/*int * Z,int * W,*/int N,bool sp)
	{
		this->X=X;
		this->Y=Y;
		/*this->Z=Z;
		this->W=W;*/

		this->N=N;
		this->sommaProd=sp;

	}

};

class CalcolaEspressione:public JTCMonitor
{
	int nThreads;
	int threadsFiniti;

public:

	CalcolaEspressione(int n)
	{
		nThreads=n;
		threadsFiniti=0;
	};


void done()
{
	JTCSynchronized sync(*this);

	threadsFiniti++;

	if(threadsFiniti==nThreads)
		notify();

}

void waitForCompletion()
{
	JTCSynchronized sync(*this);

	if(threadsFiniti<nThreads)
		wait();
}

};

class Espressione:public JTCThread
{
	Buffer<Request*>* bufRichieste;

	Buffer<int*>* bufRisultati;

CalcolaEspressione * esp;

public:

	Espressione(Buffer<Request*>*bric,Buffer<int*>*bris,CalcolaEspressione * b)
	{
		bufRichieste=bric;
		bufRisultati=bris;
		this->esp=b;
	}
	
	virtual void run()
	{
		Request * r;

		while(r=bufRichieste->get())
		{
			bufRisultati->put(r->sommaProd?sum(r->X,r->Y,r->N):prod(r->X,r->N));

			delete r;

		}

		esp->done();
	}
};









int * expr(int * X,int * Y,int * Z,int * W,int N)
{
	Buffer<Request*> * bufRichieste=new Buffer<Request*>(0);
	Buffer<int*> * bufRisultati=new Buffer<int*>(0);
     

	CalcolaEspressione * c=new CalcolaEspressione(8);

	Espressione * e[8];

	for(int i=0;i<8;i++)
	{
		e[i]=new Espressione(bufRichieste,bufRisultati,c);

	    e[i]->start();
	}


	//moltiplicaz

//	for(i=0;i<4;i++)
//	{
		bufRichieste->put(new Request(X,X,/*Z,W,*/N,false));
		bufRichieste->put(new Request(Y,Y,N,false));
		bufRichieste->put(new Request(Z,Z,N,false));
		bufRichieste->put(new Request(W,W,N,false));


//	}

	//somma

	for(int j=0;j<3;j++)
	{
		int * r0=bufRisultati->get();
		int * r1=bufRisultati->get();
		//int * r2=bufRisultati->get();
		//int * r3=bufRisultati->get();

		bufRichieste->put(new Request(r0,r1,N,true));
	}

	int * result=bufRisultati->get();

	bufRichieste->close();

	c->waitForCompletion();

	delete bufRisultati;

	delete bufRichieste;

	delete c;

	return result;
}



int X[] = {1, 2, -1, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0};
int Y[] = {1, 1, 1,  0, 0, 0, 0, 0, 1, 0, 0, 0, 0};
int Z[] = {1, 2, -1, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0};
int K[] = {1, 1, 1,  0, 0, 0, 0, 0, 1, 0, 0, 0, 0};


int main()

{
   JTCInitialize init;
   int* R = expr(X,Y,Z,K,13);
   for(int i = 0; i < 13; i++)
   {
	   cout << R[i] << " ";
   }
   cout<<endl;
   return 0;
}

Cosi' mi da..però vorrei provare in un altro modo e cioè senza usare la classe buffer..Ma non riesco a capire poi come memorizzare i risultati..Spero che stavolta qualcuno mi risp
alessia86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 10:43   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Purtroppo credo che molti non conoscano la libreria che stai usando. Come si chiama ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 10:50   #5
alessia86
Member
 
Iscritto dal: Dec 2008
Messaggi: 125
Uso la libreria JTC-2.0.0...purtroppo il mio prof vuole che si usi questa..
alessia86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 17:27   #6
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Io penso si possa fare di meglio... Non conosco la libreria, ma cmq una volta stabilita la sincronizzazione è facile individuare i costrutti necessari in base al particolare formalismo usato. L'operazione è:

R = X^2 +Y^2 + Z^2 + W^2

Un'idea è quella di creare 4 threads che fanno singolarmente i 4 prodotti e poi altri 3 che calcolano le 3 somme. Tuttavia i 4 threads per i prodotti sono effettivamente paralleli, poi ci saranno i 2 threads per le somme S1=X^2+Y^2 e S2=Z^2+W^2 che saranno tra loro paralleli, ma cmq non potranno partire prima dei precedenti 4 threads di prodotto. Poi un ultimo thread di somma che parte quando anche questi 2 sono terminati sommando S1+S2. Tuttavia si nota che in questo modo il grado di parallelismo è troppo basso. Io non considererei una operazione in termini vettoriali, ma in termini scalari elemento per elemento. In tal senso gli elementi di R, cioè R[i] saranno calcolati come:

R[i] = X[i]^2 + Y[i]^2 + Z[i]^2 + W[i]^2

Adesso le vie sono 2. Una è ovvia anche se non troppo efficiente e sarebbe quella di strutturare i threads come ho detto prima in base alle operazioni in modo che operino in una sorta di pipeline: quando sono pronti X[i]^2 e Y[i]^2 allora l'atro thread calcola S1[i] nel frattempo sarà pronto Z[i]^2 e W[i]^2 quindi S2[i] pertanto l'altro thread si avvia e calcola R[i]. Nel frattempo gli altri threads stanno già calcolando gli indici i+1, i+2 ecc... I problemi di questa soluzione che si può implementare tanto così per esercizio è quella di avere soli 7 threads, inoltre ci saranno periodi in cui il numero di threads attivi sarà < 7! Tuttavia un buon modo è quello di considerare N threads, dove un generico thread lo indichiamo con l'indice i. In tal modo il thread i-esimo calcola R[i] con la formula detta prima. In questo modo se N>8 allora ogni processore elabora un elemento del risultato e appena uno finisce passa a schedulare il thread per un altro elemento. Questa soluzione è quella a max parallelismo in generale su una macchina ad M processori, dove M può anche essere 1! L'altra soluzione invece è subottimale e cmq è meglio se hai M<8. Tuttavia è interessante applicare entrambe le soluzioni, soprattutto quella non ottimale perchè richiede una maggiore complessità nel realizzare le sincronizzazioni tra i vari threads.

Una possibile altra soluzione è l'unione di entrambe:

R[i] = X[i]^2 + Y[i]^2 + Z[i]^2 + W[i]^2

Viene calcolato dal thread i-esimo... e se invece venisse calcolato da ben 7 threads organizzati come detto nella prima soluzione? Avresti per ogni elemento i 4 threads di prodotto, 2 threads di somma parziale e 1 thread di somma finale. Un totale di N*7 threads... più multithread di così si muore!!!

Ultima modifica di Ikon O'Cluster : 19-07-2009 alle 17:34.
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 19:15   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Imho la soluzione più semplice è questa: 4 thread che fanno i prodotti ed uno che fa le somme (può essere anche il chiamante).
4 semafori da incrementare alla fine di ogni prodotto e da decrementare quando il chiamante recupera i dati. In questo modo i thread svolgono tutti i prodotti in parallelo e man mano che i prodotti necessari ad ogni somma sono terminati, il chiamante effettua la somma.
Tra l'altro si possono implementare i 4 thread anche come una unica classe passando il puntatore al vettore ed al semaforo e questo rende la soluzione molto compatta
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2009, 04:46   #8
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Se il prof specifica di avere 8 processori forse è un chiaro avvertimento che li vuole tenere tutti occupati, nel senso che vuole che ci siano più di 8 threads...
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2009, 04:47   #9
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Se il prof specifica di avere 8 processori forse è un chiaro avvertimento che li vuole tenere tutti occupati, nel senso che vuole che ci siano più di 8 threads...
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Il nuovo MacBook Neo ha una memoria SSD ...
Xbox Project Helix, le prime specifiche ...
Annunci pubblicitari sulla TV quando cam...
Prezzi aumentati del 50% durante la nott...
Sconti studiati per singolo utente: Sony...
Addio alla Kia Niro EV, il crossover sar...
Apple crede nel suo iPhone Fold: la prod...
Fortnite, un nuovo listino per i pacchet...
Ecco i nuovi Sonos Play ed Era 100 SL: d...
Razer svela il futuro del gaming potenzi...
Tre robot Narwal in offerta: pulizia aut...
Gracenote denuncia OpenAI: ChatGPT addes...
Microsoft AI Tour Milano: dall'efficienz...
Asus ExpertBook Ultra: Intel Core Ultra ...
Intel presenta i processori desktop Core...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v