Επισκέπτης
Λίγο μετά την αρχή της νέας χιλιετίας, άρχισαν σιγά - σιγά να ξεπροβάλλουν οι πρώτοι διπύρηνοι επεξεργαστές. Τόσο η Intel αλλά και η AMD τα βρίσκουν δύσκολα να ανεβάζουν τον πήχη των GHz κι αυτό οφείλεται στην τεχνολογία του πυριτίου. Έτσι κυκλοφορούν πλέον πολυπύρηνοι επεξεργαστές, αλλά αυτό δε σημαίνει ότι κάθε εφαρμογή τους εκμεταλλεύεται πλήρως. Για να γίνει αυτό, θα πρέπει να γραφτεί κατάλληλος κώδικας.
Βέβαια, δε γίνεται όλοι οι αλγόριθμοι να παραλληλιστούν. Ένα παράδειγμα είναι η εύρεση (αν υπάρχει) της ρίζας μιας συνάρτησης με τη μέθοδο των Newton - Raphson. Η δε αριθμητική μέθοδος υπολογισμού ενός ορισμένου ολοκληρώματος με τη μέθοδο του τραπεζίου παρόλο που μαθαίναμε εμείς οι μεγαλύτεροι την προηγούμενη χιλιετία ότι συγκλίνει αργά, με τους πολυπύρηνους επεξεργαστές μετατρέπεται πανεύκολα. Όμως δεν είναι το αντικείμενο της συζήτησης μας η Αριθμητική Ανάλυση!
Το επόμενο τμήμα κώδικα δείχνει πώς καλώ τέσσερα νήματα στη C#.
Βάζω μια άνω κάτω τελεία, υπάρχουν κάποια σχόλια που επεξηγούν κάποια πράγματα (ΟΚ γενικά προφανώς, γιατί δεν παραθέτω ολόκληρο κώδικα).
Αυτό που θέλω να δείξω είναι πώς με τη χρήση των λάμδα εκφράσεων www.dotnetperls.com/lambda]δείτε εδώ τα βασικά[/url] μπορώ όχι μόνο να καλέσω διαφορετικά νήματα, αλλά και να περάσω παραμέτρους σε αυτά. O Διαχειριστής Διεργασιών δείχνει ότι στο περίπου η χρήση του επεξεργαστή είναι στο 100% (μεταβάλλεται ανάλογα από 90-98%).
Βέβαια, δε γίνεται όλοι οι αλγόριθμοι να παραλληλιστούν. Ένα παράδειγμα είναι η εύρεση (αν υπάρχει) της ρίζας μιας συνάρτησης με τη μέθοδο των Newton - Raphson. Η δε αριθμητική μέθοδος υπολογισμού ενός ορισμένου ολοκληρώματος με τη μέθοδο του τραπεζίου παρόλο που μαθαίναμε εμείς οι μεγαλύτεροι την προηγούμενη χιλιετία ότι συγκλίνει αργά, με τους πολυπύρηνους επεξεργαστές μετατρέπεται πανεύκολα. Όμως δεν είναι το αντικείμενο της συζήτησης μας η Αριθμητική Ανάλυση!
Το επόμενο τμήμα κώδικα δείχνει πώς καλώ τέσσερα νήματα στη C#.
Κώδικας:
string penintaria="penintaria.txt";
FileInfo filepenintaria;
StreamWriter grapse_penintaria;
private void menu_Mathematica_Click(object sender, EventArgs e)
{
int prin=int.Parse(combo_before.Text);
int bets=int.Parse(combo_bet.Text);
int sample=int.Parse(text_sample.Text);
int kato_orio=int.Parse(combo_orio1.Text);
int pano_orio=int.Parse(combo_orio2.Text);
int shift=int.Parse(textBox_shift.Text);
Common_functions jh=new Common_functions();
jh.create_test_file(inputFile,linesize,kato_orio,pano_orio,shift,sample,prin,bets); // Δημιούργησε τα αρχεία εισόδου=input.txt & το ελέγχου=test.txt
jh.create_input_file(inputFile,linesize,kato_orio,pano_orio,shift,sample);
jh.read_and_sort_data("test.txt",linesize,kato_orio,pano_orio,200); // Ταξινόμησε αρχικά το αρχείο ελέγχου αποθηκεύοντας τις τιμές τοu
string fileContent=File.ReadAllText("sorted.txt");
string[] integerStrings=fileContent.Split(new char[] {' ','t','r','n'},StringSplitOptions.RemoveEmptyEntries);
int[] integers=new int[integerStrings.Length+1];
for (int i=1; i<=integerStrings.Length; i++)
integers[i]=int.Parse(integerStrings[i-1]);
int draws=jh.read_and_sort_data("input.txt",linesize,kato_orio,pano_orio,200); // Πάρε το πλήθος των κληρώσεων της εισόδου & ταξινόμησε το
int total=0;
for (int n1=kato_orio; n1<pano_orio; n1++)
for (int n2=n1+1; n2<=pano_orio; n2++)
for (int n3=n2+1; n3<=pano_orio; n3++)
for (int n4=n3+1; n4<=pano_orio; n4++)
total++;
int num1,num2,num3,num4,num5;
num1=1;
num2=total/4;
num3=total/2;
num4=num3+num2;
num5=total;
filepenintaria=new FileInfo(penintaria);
grapse_penintaria=filepenintaria.CreateText();
var nima1=new Thread (()=> Mathematica(integers,num1,num2,1,draws,prin,bets,pano_orio,kato_orio)); // Πέρασε τον πίνακα δεδομένων του αρχείου ελέγχου, οι δε τιμές
var nima2=new Thread (()=> Mathematica(integers,num2+1,num3,2,draws,prin,bets,pano_orio,kato_orio)); // του αρχείου εισόδου λαμβάνονται με τις κλήσεις των ρουτινών
var nima3=new Thread (()=> Mathematica(integers,num3+1,num4,3,draws,prin,bets,pano_orio,kato_orio)); // stats εντός της ρουτίνας του Mathematica
var nima4=new Thread (()=> Mathematica(integers,num4+1,num5,4,draws,prin,bets,pano_orio,kato_orio));
nima1.Start(); nima2.Start(); nima3.Start(); nima4.Start();
}
/***********************************************************************************************************************************************************************************/
void Mathematica(int[] integers, int apo, int eos, int thread_number, int draws, int prin, int bets, int pano_orio, int kato_orio)
{
// Κώδικας διαφόρων υπολογισμών....
}
Βάζω μια άνω κάτω τελεία, υπάρχουν κάποια σχόλια που επεξηγούν κάποια πράγματα (ΟΚ γενικά προφανώς, γιατί δεν παραθέτω ολόκληρο κώδικα).
Αυτό που θέλω να δείξω είναι πώς με τη χρήση των λάμδα εκφράσεων www.dotnetperls.com/lambda]δείτε εδώ τα βασικά[/url] μπορώ όχι μόνο να καλέσω διαφορετικά νήματα, αλλά και να περάσω παραμέτρους σε αυτά. O Διαχειριστής Διεργασιών δείχνει ότι στο περίπου η χρήση του επεξεργαστή είναι στο 100% (μεταβάλλεται ανάλογα από 90-98%).