Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας"

Transcript

1 Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:13 Δρ. Μηνάς Δασυγένης Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών arch.icte.uowm.gr/mdasyg

2 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ψηφιακά Μαθήματα του Πανεπιστημίου Δυτικής Μακεδονίας» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 2

3 Περιεχόμενα 1. Σκοπός της άσκησης Παραδοτέα Απαιτήσεις συστήματος για χρήση της CUDA Εγκατάσταση Βιβλιοθηκών Εγκατάσταση Linux Windows Mac Το πρώτο πρόγραμμα: Hello World Το παραδοτέο Α Το παραδοτέο Α Τα παραδοτέα C1 και C Υπολογισμός του π Το παραδοτέο Α Το παραδοτέο C Cuda και MPI Το παραδοτέο C

4 1. Σκοπός της άσκησης Ανάπτυξη Παράλληλων εφαρμογών σε GPU επεξεργαστές (CUDA) 1 #1. 2. Παραδοτέα (A) 4 ερωτήσεις (C) 4 ασκήσεις Με τον όρο CUDA, η Nvidia αναφέρεται σε μία αρχιτεκτονική παράλληλου υπολογισμού (Compute Unified Device Architecture), η οποία έχει ως στόχο να εκμεταλλευθεί την εξαιρετική δύναμη των επεξεργαστών γραφικών της εταιρείας, για εργασίες που δεν σχετίζονται με την απεικόνιση γραφικών. Σε πιο τεχνικό επίπεδο, θα λέγαμε ότι η αρχιτεκτονική CUDA αποτελεί μία μικρή επέκταση της γλώσσας C, βάσει της οποίας οι προγραμματιστές αποκτούν πρόσβαση στις δυνατότητες της κάρτας γραφικών και έτσι μπορούν να εκμεταλλευθούν την ισχύ της για την επίλυση διαφόρων προβλημάτων, συνήθως επιστημονικής φύσης. Αξίζει να σημειωθεί ότι η Nvidia δίνει τη δυνατότητα στους προγραμματιστές να εκμεταλλευθούν παράλληλα και τον κεντρικό επεξεργαστή του συστήματος (όπως γίνεται άλλωστε με κάθε γλώσσα προγραμματισμού) και έτσι να μπορούν να μοιράσουν τον φόρτο εργασίας του προγράμματός τους, τόσο στη CPU (Central Processing Unit), όσο και στη GPU (Graphics Processing Unit). Τι είδους εφαρμογές όμως είναι αυτές που θα μπορούν να εκμεταλλευτούν τη χρήση της αρχιτεκτονικής CUDA αλλά και της ισχύος των chips που φιλοξενούνται στις αντίστοιχες κάρτες γραφικών; Μπορείτε να πάρετε μία πρώτη γεύση στο site, αλλά σε γενικές γραμμές οι εν λόγω εφαρμογές έχουν επιστημονικό χαρακτήρα και απαιτούν πολύ μεγάλη επεξεργαστική ισχύ. Για παράδειγμα, η ανάλυση πρωτεϊνών στα αμινοξέα από τα οποία αποτελούνται, ο υπολογισμός καιρικών φαινομένων, η κίνηση υγρών, η ανάλυση χρηματιστηριακών συναλλαγών, οι προσομοιώσεις του ανθρώπινου εγκεφάλου, η κίνηση ουράνιων σωμάτων κ.λπ. είναι μερικές από τις περιπτώσεις στις οποίες η αρχιτεκτονική CUDA μπορεί να βρει εφαρμογή. Θα πρέπει να σημειώσουμε πάντως, ότι είναι πολύ διαφορετικό το να δημιουργήσει κανείς μία εφαρμογή με τη βοήθεια της αρχιτεκτονικής CUDA, και πολύ διαφορετικό με το απλά να συμμετάσχει σε ένα CUDA project. Στην πρώτη περίπτωση θα πρέπει να διαθέτει αυξημένες γνώσεις προγραμματισμού καθώς φυσικά και αντίστοιχες γνώσεις επί του αντικειμένου που θέλει να μελετήσει, ενώ στη δεύτερη περίπτωση χρειάζεται απλά την κατάλληλη εφαρμογή και ένα σύστημα με κάρτα γραφικών που είναι συμβατή με την αρχιτεκτονική CUDA. 1 Για τη δημιουργία του εργαστηριακού φυλλαδίου, βοήθησε ο φοιτητής Κεχαγιάς Απόστολος. 4

5 3. Απαιτήσεις συστήματος για χρήση της CUDA CUDA-enabled GPU Windows, Linux ή Mac Device driver CUDA software (διαθέσιμο δωρεάν από Microsoft Visual Studio 2005 or 2008, ή Microsoft Visual C++ Express ή gcc 4. Εγκατάσταση Βιβλιοθηκών (τα βήματα της εγκατάστασης έχουν γίνει στο εργαστήριο, οπότε καταγράφονται μόνο για λόγους πληρότητας) Μεταβείτε στην παρακάτω σελίδα: /developer.nvidia.com/object/cuda_3_2_downloads.html Βρίσκουμε τα παρακάτω αρχεία και τα κατεβάζουμε. Υπάρχουν διαθέσιμά για Windows linux και mac. Windows Linux Mac Developer Drivers for Win (263.06) CUDA Toolkit GPU Computing SDK code samples Compiler Developer Drivers for Linux ( ) CUDA Toolkit GPU Computing SDK code samples Developer Drivers for MacOS CUDA Toolkit GPU Computing SDK code samples Το πακέτο GPU Computing SDK code samples περιέχει κάποια παραδείγματα χρήσης όποτε είναι προαιρετικό, αλλά θα το χρησιμοποιήσουμε στην συνέχεια για να δούμε αν έχουν γίνει όλα σωστά στην εγκατάσταση και να δούμε κάποια παραδείγματα. 5. Εγκατάσταση 5.1 Linux Aλλάζουμε στο directory που έχουμε κατεβάσει τα αρχεία. 5

6 cd ~/Downloads βεβαιώνουμε ότι τα αρχεία είναι εκτελέσιμα: chmod +x devdriver_*.run chmod +x cudatoolkit_*.run chmod +x gpucomputingsdk_*.run Για να κάνουμε install τον devdriver πρέπει να σταματήσουμε τον xserver sudo /etc/init.d/gdm stop ή sudo /etc/init.d/kdm stop ή sudo /etc/init.d/xdm stop Σε αυτό το σημείο μπορεί να ζητηθεί ξανά να γίνει login. sudo./devdriver_*.run sudo./cudatoolkit_*.run./gpucomputingsdk_*.run αφού τελειώσουμε με επιτυχία τα παραπάνω, δίνουμε startx προσθέτουμε στο path τις απαραίτητες βιβλιοθήκες και εκτελέσιμα δίνοντας echo " PATH=\$PATH:/usr/local/cuda/bin LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/cuda/lib export PATH export LD_LIBRARY_PATH" >> ~/. profile αλλάζουμε directory στα παραδείγματα cd ~/NVIDIA_GPU_Computing_SDK/C και κάνουμε compile δίνοντας make 2 2 Τo compile μπορεί να αποτύχει γιατί υπάρχει περίπτωση στην διανομή σας να μην υπάρχουν οι απαραίτητες βιβλιοθήκες. Σε Ubuntu για παράδειγμα είναι απαιτούμενα τα buildessential, freeglut3-dev, libxmu-dev 6

7 Εικόνα: running oceanfft sample Τα προγράμματα έχουν κατάληξη.cu και αντί του gcc χρησιμοποιούμε το nvcc για compile. π.χ nvcc o my_cuda my_cuda.cu 5.2 Windows Για Windows θα πρέπει να χρησιμοποιήσουμε τον compiler του Visual Studio 2008 ή 2005 γιατί ο compiler του 2010 δεν υποστηρίζεται πλήρως ακόμη. Επίσης δεν είναι απαραίτητο να έχουμε εγκατεστημένο το Visual Studio. Αρκεί ο command line compiler (cl) που κατεβάσαμε προηγουμένως. Για χρήση με το Visual Studio χρειάζεται και το parallel Nsight (είναι free αλλά χρειάζεται register). 3 Εγκαθιστούμε τον driver, το cuda toolkit τον compiler και το gpu computing code samples όπως όλες τις windows εφαρμογές (next, next, ok, finish). Εδώ κάνουμε restart για να φορτωθεί ο καινούριος driver. Aν έχουν γίνει όλα σωστά θα πρέπει να λειτουργούν τα samples που εγκαταστήσαμε. Αν τρέξουμε το NVIDIA GPU Computing SDK 3.2 Browser βλέπουμε όλα τα διαθέσιμα παραδείγματα. 3 περισσότερες πληροφορίες /forums.nvidia.com/index.php?showtopic=

8 Εικόνα : running opengl sample Πλέον μπορούμε να κάνουμε compile μέσω command line. π.χ nvcc o my_win_cuda my_win_cuda.cu ή μέσω Visual Studio αν έχουμε ακολουθήσει τις παραπάνω οδηγίες. 5.3 Mac Με παρόμοιες διαδικασίες γίνεται η εγκατάσταση σε MAC. Links: Forum: b&showforum= 75 Install guide: Getting_Started_2.2_Mac OS.pdf Σημείωση: Μπορείτε να χρησιμοποιήσετε τα μηχανήματα CUDA με το ιδρυματικό σας λογαριασμό. Συνδεθείτε στο φοιτητικό server και ενεργοποιήσετε το account σας στα μηχανήματα CUDA του Τμήματος με την εντολή cuda_enable. Στη συνέχεια συνδεθείτε στις IP που αναγράφονται κατά την εκτέλεση του cuda_enable με τον 8

9 ιδρυματικό σας κωδικό. Επίσης, μπορείτε να εκτελέσετε το ssh-keygen (πατάτε συνεχώς enter) στο zafora, ώστε να δημιουργήσετε δυο κλειδιά, και να δώσετε: mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys ώστε να συνδέεστε χωρίς κωδικό στα CUDA από το zafora, δεδομένου ότι όλα τα μηχανήματα είναι συνδεδεμένα στο ίδιο NFS User Home Directory. 6. Το πρώτο πρόγραμμα: Hello World Το κλασσικό πρόγραμμα hello world δεν έχει κάποια ιδιαίτερη αξία για την παραλληλία αλλά είναι σημαντικό για να ξέρουμε ότι όντως μπορούμε να κάνουμε compile. #include <stdio.h> int main(int argc, char **argv) printf("hello World\n"); return 0; 6.1 Το παραδοτέο Α1 (A1) Κάντε compile στο μηχάνημα CUDA τον παραπάνω κώδικα και δώστε το screenshot εκτέλεσης, αφού χρησιμοποιήσετε το όνομα a1.c. Αφού κάνουμε compile και βεβαιωθούμε ότι λειτουργεί σωστά πρέπει να σκεφτούμε πως θα μπορούσε το hello world να παραλληλοποιηθεί. Μια σκέψη για το πώς μπορεί να γίνει αυτό, φαίνεται παρακάτω. #include <stdio.h> #include <stdlib.h> #define N 13 global void hello(char* c) char msg[n] = "Hello World!"; int idx = blockidx.x; c[idx] = msg[idx]; int main(int argc, char **argv) int i; char *d_msg; char *msg; size_t hello_size; hello_size = N*sizeof(char); msg = (char *)malloc(hello_size); cudamalloc((void **)&d_msg,hello_size); hello<<<ν,1>>>(d_msg); cudamemcpy(msg,d_msg,hello_size,cudamemcpydevicetohost); 9

10 for(i=0;i<n;i++) printf("%c",*(msg+i)); printf("\n"); cudafree(d_msg); free(msg); return 0; ***Να σημειώσετε ότι: ***Σε περίπτωση που κατά την εκτέλεση του κώδικα σας αναφερθεί το μήνυμα λάθους (ή κάτι παρόμοιο): "error while loading shared libraries: libcudart.so.5.0: cannot open shared object file: No such file or directory" τότε αυτό σημαίνει ότι δεν έχετε τροποποιήσει το LD_LIBRARY_PATH σύμφωνα με τις οδηγίες που αναφέρθηκαν προηγουμένως. Μπορείτε να το λύσετε με δυο τρόπους: είτε τροποποιείτε το LD_LIBRARY_PATH όπως προηγουμένως, ή πριν από κάθε εκτέλεση χρησιμοποιείτε την ειδική μεταβλητή περιβάλλοντος LD_PRELOAD στην οποία προ-φορτώνετε τις βιβλιοθήκες που θα χρειαστούν. Για παράδειγμα, αν θέλουμε να εκτελέσουμε το a.out με προφόρτωση βιβλιοθηκών θα δώσουμε: LD_PRELOAD= /usr/local/cuda-5.0/lib/libcudart.so.5.0./a.out ενώ αν έχουμε περισσότερες βιβλιοθήκες, θα δώσουμε: LD_PRELOAD= /usr/local/cuda-5.0/lib/libcudart.so.5.0 /lib/anotherlib.so./a.out 6.2 Το παραδοτέο Α2 (A2) Κάντε compile στο μηχάνημα CUDA τον παραπάνω κώδικα και δώστε το screenshot εκτέλεσης, αφού χρησιμοποιήσετε το όνομα a2.cu Για να γίνει κατανοητός ο παραπάνω κώδικας πρέπει να εξηγήσουμε μερικά πράγματα. Το declaration global που βλέπουμε σημαίνει ότι είναι κώδικας ο οποίος προορίζεται για εκτέλεση στην GPU. Υπάρχουν και άλλες τέτοιες δηλώσεις όπως device και shared. Ο λόγος που χρειάζεται να το κάνουμε αυτό, είναι γιατί ο κώδικας κατά το compilation μεταφέρεται σε διαφορετικούς μεταγλωττιστές για την CPU και για την GPU. Η συνάρτηση cudamalloc() είναι αντίστοιχη με την γνωστή malloc μόνο που η cudamalloc δεσμεύει μνήμη στην GPU. Αντίστοιχα όταν χρησιμοποιούμε την cudamalloc θα πρέπει να χρησιμοποιήσουμε την cudafree για να αποδεσμεύσουμε. cudaerror_t cudamalloc ( void ** devptr, size_t size ) Parameters: devptr size - Pointer to allocated device memory - Requested allocation size in bytes cudaerror_t cudafree ( void * devptr ) 10

11 Parameters: devptr - Pointer to allocated device memory Τέλος η cudamemcpy() χρησιμοποιείται για να αντιγράψουμε στοιχεία που βρίσκονται στην μνήμη της GPU. cudaerror_t cudamemcpy ( void *dst, const void *src, size_t count, enum cudamemcpykind kind ) Parameters: dst src count kind - Destination memory address - Source memory address - Size in bytes to copy - Type of transfer Σε αυτή την περίπτωση χρησιμοποιούμε το cudamemcpydevicetohost αφού θέλουμε να αντιγράψουμε δεδομένα από την μνήμη της GPU στην μνήμη του υπολογιστή. Η λογική είναι η εξής: Έχουμε ένα string το οποίο αποτελείται από ένα σύνολο χαρακτήρων Ν. Θέλουμε να αξιοποιήσουμε την παραλληλία οπότε θα έχουμε Ν επεξεργαστικές μονάδες. Κάθε μια από αυτές τις μονάδες θα έχει στην διάθεσή του το string Hello World!. Όμως κάθε μονάδα θα πρέπει να κάνει κάτι. Έτσι δεσμεύουμε έναν χώρο μνήμης Ν και κάθε μονάδα γράφει σε αυτόν τον χώρο έναν χαρακτήρα. Στην συνέχεια αντιγράφουμε το αποτέλεσμα στην μνήμη του υπολογιστή και το εμφανίζουμε. Τα ερωτήματα που προκύπτουν είναι το πως ορίζουμε σε πόσες επεξεργαστικές μονάδες θα εκτελεστεί ο κώδικας και πως μπορούμε να διαφοροποιήσουμε τι κάνει κάθε μια από αυτές. Εδώ αποκτά νόημα και το hello<<<ν,1>>>. Σημαίνει ότι ο κώδικας θα εκτελεστεί σε Ν blocks που το κάθε ένα θα έχει 1 thread. Εφόσον έχουμε ορίσει ότι θα εκτελεστούν Ν blocks, κατά την εκτέλεση του καθενός μπορούμε να έχουμε πρόσβαση στην global μεταβλητή blockidx που δείχνει το id του. Τα blocks μπορούν να έχουν μια ή δύο διαστάσεις. Εμείς χρησιμοποιούμε μια διάσταση για ευκολία, δηλαδή blockidx.x. Έτσι σύμφωνα με αυτό το id θα αναθέτουμε στον πίνακα την αντίστοιχη τιμή του string. Π.χ το block 0 θα πάρει το στοιχείο 0 του string (msg[0]= H ) και θα το γράψει στην θέση 0 του δεύτερου string (d_msg[0]= H ). Αντίστοιχη δουλειά θα γίνει και στα υπόλοιπα blocks. 11

12 Εικόνα: σχηματική αναπαράσταση εκτέλεσης Εκτός από τα blocks υπάρχουν όπως είπαμε τα threads τα οποία μπορούν να ενσωματωθούν μέσα σε grids. Τα grids μπορούν να περιέχουν blocks και τα blocks μπορούν να περιέχουν threads. Ta grids μπορεί να είναι 1D ή 2D όπως και τα blocks, ενώ τα threads μπορεί να είναι 1D, 2D και 3D. Κάποιος θα μπορούσε να αναρωτηθεί γιατί υπάρχουν δισδιάστατες και τρισδιάστατες δομές επεξεργαστικών μονάδων. Αυτό γίνεται γιατί έτσι απλοποιούνται πολύπλοκα προβλήματα στα οποία είναι απαραίτητη η ύπαρξη τους (πχ επεξεργασία εικόνας). Ουσιαστικά η αντιμετώπισή τους μπορεί να είναι πολύ πιο ρεαλιστική αφού δεν απαιτείται να σκεφτούμε πως θα λύσουμε το πρόβλημα χρησιμοποιώντας μια μόνο διάσταση για ένα δισδιάστατο πρόβλημα. Ένα καλό παράδειγμα είναι οι δισδιάστατοι πίνακες οι οποίοι υπάρχουν σε κάθε γλώσσα προγραμματισμού. Τώρα ας σκεφτούμε ότι χρησιμοποιούμε μια γλώσσα που δεν υποστηρίζει αυτή την δυνατότητα, δηλαδή έχει μόνο μονοδιάστατους πίνακες. Αν θέλαμε να πολλαπλασιάσουμε δύο δισδιάστατους πίνακες θα έπρεπε να χρησιμοποιήσουμε μονοδιάστατους πίνακες, κάτι το οποίο θα έκανε πολύπλοκη την υλοποίηση. 12

13 Εικόνα: Σχηματικό παράδειγμα δομής για grids blocks και threads Κάθε μια από αυτές τις νοητές δομές έχει ένα id με το οποίο μπορούμε να καθορίζουμε σε ποιο grid, block και thread θα κάνουμε μια εργασία. Για να ορίζουμε πιο εύκολα αυτές τις διαστάσεις υπάρχουν οι παρακάτω ενσωματωμένες μεταβλητές. Variables: dim3 griddim; Dimensions of the grid in blocks dim3 blockdim; Dimensions of the block in threads dim3 blockidx; Block index within the grid dim3 threadidx; Thread index within the block 6.3 Τα παραδοτέα C1 και C2 (C1) Άσκηση 1: Χρησιμοποιήστε τις μεταβλητές griddim και blockdim για να αντικαταστήσετε την δήλωση Ν,1 στην κλήση hello<<<n,1>>>. (όνομα αρχείου c2.cu) (C2) Άσκηση 2: Τροποποιήστε τον κώδικα έτσι ώστε να χρησιμοποιεί παραπάνω από ένα thread/block (όνομα αρχείου hello03.cu) 13

14 7. Υπολογισμός του π Θα υπολογίσουμε το π χρησιμοποιώντας την παρακάτω εξίσωση. Για να υπολογίσουμε τον παραπάνω τύπο θα χρησιμοποιήσουμε την αριθμητική ολοκλήρωση από 0 έως 1, η οποία καταλήγει στην παρακάτω σχέση: όπου: Ν ο αριθμός των διαστημάτων στον οποίον χωρίζουμε την περιοχή από 0 έως 1 (η ακρίβεια αυξάνεται με τον αριθμό των διαστημάτων) W το πλάτος του κάθε διαστήματος, το οποίο ισούται με 1/N Αν θέλαμε να προγραμματίσουμε σειριακά το παραπάνω κομμάτι θα το γράφαμε ως εξής: int i, N=512; float pi, W=1.0/N; pi=0.0; for (i=0;i<n;i++) pi+=4*w/(1+(i+0.5)*(i+0.5)*w*w); 7.1 Το παραδοτέο Α3 (A3) Να αντιγράψετε τον παραπάνω κώδικα στο αρχείο a3.c, να το κάνετε μεταγλώττιση και να το εκτελέσετε. Δώστε το αντίστοιχο screenshot. Παρατηρήστε ότι ο παραπάνω αλγόριθμος υπολογίζει σε Ν βήματα το παραπάνω άθροισμα. Θα μπορούσαμε λοιπόν να υπολογίζουμε το άθροισμα με το να χρησιμοποιήσουμε έναν αριθμό από blocks όπου θα χωρίσουμε τα Ν βήματα σε blocks και κάθε block θα υπολογίζει το άθροισμα στο διάστημα που της αντιστοιχεί. 14

15 #include <stdio.h> #include <stdlib.h> #include <cuda.h> #define NUMBLOCKS 3 //optional //number of blocks we will use global void calc(float *pi, int *N) int start; //starting point for each blockidx.x int end; //ending point int i; int div; //dividing the problem into smaller ones int idx = blockidx.x;//getting the id of the current blockidx.x running float W = 1.0/(*N); pi[idx] = 0; div = *N/(NUMBLOCKS); start = idx*div; // 0*div 1*div.. NUMBLOCKS*div if(idx==numblocks-1) end =*N ; //the last block will compute from idx*div - N else end = (idx+1)*div;//the rest from idx*div - idx*(div+1) for (i=start;i<end;i++) pi[idx]+=4*w/(1+(i+0.5)*(i+0.5)*w*w); //each cell will contain a temp sum int main(int argc, char** argv) int i; int N; int *dev_n; float *pi; float *dev_pi; float pi_sum = 0; //get N from the user N = atoi(argv[1]); 15

16 if(argv[1]) host //allocate an array that will contain our temp sums in pi = (float *)malloc(numblocks*sizeof(float)); //allocate the same array in device(gpu) cudamalloc((void**)&dev_pi,numblocks*sizeof(float)); //allocate some space for N in device and copy the value cudamalloc((void**)&dev_n,sizeof(int)); cudamemcpy(dev_n, &N, sizeof(int),cudamemcpyhosttodevice); //executing in device calc<<<numblocks,1>>>(dev_pi,dev_n); //copy the array of tmp sums to host cudamemcpy(pi, dev_pi, NUMBLOCKS*sizeof(float),cudaMemcpyDeviceToHost); //adding the tmp sums into a total one for(i=0;i<numblocks;i++) printf("block:%d sum:%f\n",i,pi[i]); pi_sum += pi[i]; printf("pi:%.20f\n",pi_sum); //eco programming cudafree(dev_pi); cudafree(dev_n); free(pi); else printf("usage: <n> <b> Number, blocks to use\n"); return 0; 16

17 Σε περίπτωση που ο compiler σας ενημερώσει ότι δεν υποστηρίζονται οι πραγματικοί αριθμοί διπλής ακρίβειας (warning: Double is not supported. Demoting to float), θα πρέπει να χρησιμοποιήσετε μια νεότερη αρχιτεκτονική συμβολομετάφρασης και όχι την 1.1 που είναι η προεπιλογή. Δηλαδή, θα πρέπει να χρησιμοποιήσετε στο nvcc την παράμετρο -arch=sm_20 που υποδηλώνει ότι απαιτούμε τη δημιουργία κώδικα για κάρτες γραφικών αρχιτεκτονικής 2.0 και ανώτερης. Η συνέπεια της παραμέτρου είναι ότι ο συγκεκριμένος κώδικας δε θα μπορεί να εκτελεστεί σε κάρτες γραφικών που έχουν αρχιτεκτονικές δυνατότητες μικρότερες από 2.0. Οι κάρτες γραφικών που έχουμε στο εργαστήριο είναι GTX 760, με αρχιτεκτονικές δυνατότητες έκδοσης 3.0. Στη διεύθυνση, gpus μπορείτε να δείτε τις αρχιτεκτονικές δυνατότητες (ή compute capability) όλων των CUDA καρτών. Η απλή εκτέλεση του ανωτέρω κώδικα ενδέχεται να μην είναι επιτυχής και να τερματίσει με "segmentation fault". Διαβάστε τον κώδικα προσεκτικά ή χρησιμοποιήστε το gdb για να βρείτε σε ποια γραμμή εμφανίζεται το segmentation fault, και θα καταλάβετε πως πρέπει να εκτελεστεί ο συγκεκριμένος κώδικας. (Α4) Κάντε compile στο μηχάνημα CUDA τον παραπάνω κώδικα, αφού δώσετε το όνομα pcalc.cu. Έχουμε ένα define που ορίζουμε σε πόσα block θα εκτελέσουμε τον κώδικα μας. Ο χρήστης δίνει τον αριθμό των διαστημάτων για το οποίο θα υπολογίσουμε το π και το περνάμε σαν παράμετρο στην συνάρτηση που θα εκτελεστεί στην GPU. Κάθε block υπολογίζει διαφορετικό διάστημα που προκύπτει από την διαίρεση του Ν με τον αριθμό των blocks. Τέλος, για να είμαστε σίγουροι ότι δεν θα εκτελέσουμε τον υπολογισμό για μικρότερο διάστημα δίνουμε στο τελευταίο block σαν άνω όριο το N. Κάτι που πρέπει να προσέξουμε σε αυτό το παράδειγμα είναι ότι οι δηλώσεις define είναι ορατές και στον κώδικα που εκτελείται στην GPU(NUMBLOCKS). Θα μπορούσαμε να είχαμε ορίσει και το Ν έτσι αλλά θα έπρεπε κάθε φορά που θέλουμε να το αλλάξουμε να κάνουμε compile τον κώδικα. Έτσι δεσμεύουμε μνήμη στην GPU και ταυτόχρονα αντιγράφουμε την τιμή του host σε εκείνη την θέση μνήμης 4. Δεν φτάνει όμως μόνο αυτό. Πρέπει να περαστεί και σαν παράμετρος στην συνάρτηση γιατί αλλιώς δεν είναι ορατή η τιμή από την συνάρτηση. Στο παραπάνω παράδειγμα χρησιμοποιούμε ένα thread/block. Αυτό δεν είναι καλή τακτική. Τα threads που βρίσκονται στο ίδιο block μπορούν να συνεργάζονται και να έχουν πρόσβαση σε κάποια κοινή μνήμη. Επίσης μπορούμε να χρησιμοποιήσουμε την συνάρτηση syncthreads() η οποία λειτουργεί σαν barrier. Δηλαδή βάζει ένα φράγμα στην εκτέλεση των threads ώστε να φτάσουν όλα στο ίδιο σημείο επεξεργασίας. Μόνο όταν φτάσουν όλα τα threads σε εκείνο το σημείο συνεχίζεται η εκτέλεση του υπόλοιπου κώδικα. Γενικά ισχύει ότι η υπάρχει μνήμη ιδιωτική για κάθε thread, διαμοιραζόμενη μνήμη μεταξύ των threads που βρίσκονται στο ίδιο block και η κοινή μνήμη. 4 Κάθε συνάρτηση που προορίζεται για εκτέλεση στην GPU πρέπει να παίρνει ορίσματα τα οποία υπάρχουν στην μνήμη της. Αν προσπαθήσουμε να βάλουμε ορίσματα που βρίσκονται στην κανονική μνήμη θα πάρουμε μήνυμα λάθους. 17

18 7.2 Το παραδοτέο C3 (C3) Κατασκευάστε κώδικα για CUDA που να κάνει την διανυσματική πράξη S=AX+Y, όπου Χ πίνακας ακεραίων 1024 θέσεων, Υ πίνακας ακεραίων 1024 θέσεων και Α ένας αριθμός. Τοποθετήστε τυχαίες τιμές στους πίνακες Χ και Y. Εκτυπώστε τους πίνακες S, Χ, Υ στο τέλος. Επίσης, θα εκτυπώνετε το χρόνο εκτέλεσης της πράξη. Ονοματίστε το αρχείο saxy.cu 8. Cuda και MPI Η Κίνα πλέον κατέχει την κορυφαία θέση στον κατάλογο με τους μεγαλύτερους και πιο γρήγορους υπολογιστές του κόσμου, χάρη στο νέο της υπερ-υπολογιστή Tianhe- 1, ο οποίος έχει την δυνατότητα να κάνει περισσότερους από τρισεκατομμύρια υπολογισμούς ανά δευτερόλεπτο. Αυτός ο κινεζικός ισχυρισμός επιβεβαιώθηκε από τον διεθνή οργανισμό «Top 500» που συντάσσει τη λίστα με τα 500 ισχυρότερα υπολογιστικά μηχανήματα του κόσμου. Σύμφωνα με το BBC, για να φτάσει αυτή την ασύλληπτη ταχύτητα, ο υπολογιστής εφοδιάζεται με περισσότερους από επεξεργαστές γραφικών της Nvidia και επεξεργαστές της Intel. To Πανεπιστήμιο Δυτικής Μακεδονίας δεν μπορούσε να αντέξει κάποια άλλη θέση εκτός από την πρώτη και έτσι αποφάσισε να φτιάξει τον δικό του υπερυπολογιστή ο οποίος θα είχε επεξεργαστές γραφικών της Nvidia και επεξεργαστές της Intel. Μάλιστα αυτός ο υπερυπολογιστής συναρμολογήθηκε σε χρόνο ρεκόρ ώστε να προλάβει την αλλαγή στο top 500. Όμως επειδή βρισκόμαστε στην Ελλάδα και επειδή έπρεπε να είμαστε σίγουροι ότι κατά την παραλαβή του υπερυπολογιστή όλα είναι σωστά, έπρεπε να ελέγξουμε τις κάρτες γραφικών. Ήταν όντως αυτές για τις οποίες είχε πληρώσει το Πανεπιστήμιο; Προφανώς αυτό δεν μπορούσαμε να το κάνουμε ανοίγοντας τον κάθε ένα υπολογιστή ξεχωριστά για να βλέπουμε αν όντως περιέχει την σωστή κάρτα γραφικών. Κάτι τέτοιο θα έπαιρνε μέρες. Επίσης υπήρχε ο κίνδυνος να χαλάσουμε κάτι στο ήδη στημένο μας cluster. Χρειαζόμαστε έναν τρόπο ώστε να εκτελέσουμε κώδικα σε πολλούς υπολογιστές. Αυτό θα το κάνουμε χρησιμοποιώντας το openmpi. Όλα τα υπόλοιπα θα γίνουν χρησιμοποιώντας την CUDA. Πρώτα χρειαζόμαστε μια συνάρτηση η οποία να παίρνει τις πληροφορίες για τις κάρτες γραφικών για έναν υπολογιστή. Αργότερα θα χρησιμοποιήσουμε αυτή την συνάρτηση μέσα σε ένα πρόγραμμα MPI ώστε να εκτελεστεί σε όσους υπολογιστές επιθυμούμε. Επειδή υπάρχει μια ιδιαιτερότητα για να χρησιμοποιήσουμε αυτές τις δύο βιβλιοθήκες (χρειάζεται να κάνουμε compile με nvcc και mpicc) θα πρέπει να κάνουμε link το ένα εκτελέσιμο που θα προκύψει από το compile με nvcc στο compile με mpicc. 18

19 #include <stdio.h> extern "C" void dev_info() int dev_count; int i; cudadeviceprop dev_prop; /* Count available devices */ cudagetdevicecount(&dev_count); if(dev_count>0) printf("\nfound %d device(s)",dev_count); /* For every device */ for(i=0;i<dev_count;i++) /* Get device properties */ cudagetdeviceproperties(&dev_prop, i); printf("\ndevice(%d) characteristics\n",i); printf(" \n"); printf("gpu: %s\n",dev_prop.name); printf("memory: %.0f Mbytes\n", ceil((float)dev_prop.totalglobalmem/(1024*1024))); printf("cores: %d\n",dev_prop.multiprocessorcount); printf("clock: %.2f Mhz\n",(float)dev_prop.clockRate/(1000*1000)); printf("threads/block: %d Max\n",dev_prop.maxThreadsPerBlock); printf(" \n"); else printf("\nno CUDA device found!\n"); Τα νέα στοιχεία που χρησιμοποιούνται εδώ είναι δύο. Το struct cudadeviceprop και η συνάρτηση cudagetdevicecount. Το struct cudadeviceprop περιέχει διάφορες πληροφορίες για την κάρτα γραφικών ενώ η συνάρτηση cudagetdevicecount επιστρέφει μια τιμή με τις συσκευές που υπάρχουν στο σύστημα. Εμείς πρώτα βλέπουμε πόσες συσκευές υπάρχουν στο σύστημα και έπειτα για κάθε συσκευή τυπώνουμε κάποια στοιχεία. 19

20 #include <stdio.h> #include <stdlib.h> #include <mpi.h> /*cuda function*/ void dev_info(); int main(int argc, char *argv[]) int err; int rank; int size; int len; char name[mpi_max_processor_name]; err = MPI_Init(&argc, &argv); if(err!=mpi_success) printf("initialization error\n"); MPI_Abort(MPI_COMM_WORLD,err); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Get_processor_name(name,&len); printf("rank:%d is running on node:%s",rank,name); dev_info(); MPI_Finalize(); return 0; Θεωρώντας ότι το αρχείο που περιέχει την συνάρτηση dev_info ονομάζεται dev_info.cu και το πρόγραμμα σε MPI, mpi_cuda.c δίνεται το παρακάτω Makefile. CUDAROOT=/usr/local/cuda-5.0 hosts= , CUDA=$CUDAROOT/bin/nvcc MPI=/usr/bin/mpicc RUN=LD_LIBRARY_PATH=$(CUDAROOT)/lib64 mpirun LIBS=-lcudart -L $CUDAROOT/lib64 INCLUDES=-I $CUDAROOT/include default: mpi_cuda.c dev_info.cu $(CUDA) -c dev_info.cu $(LIBS) $(MPI) -o mpi_cuda mpi_cuda.c dev_info.o $(LIBS) $(INCLUDES) execute: ifdef -H $hosts -n $(N) mpi_cuda "" 20

21 @echo "for multiple computers you need to specify N and hosts variable in "e.g make execute N=4" endif clean: rm dev_info.o rm mpi_cuda 8.1 Το παραδοτέο C4 (C4) Κάντε compile στο μηχάνημα CUDA τον παραπάνω κώδικα. Αν έχετε στη διάθεσή σας πρόσβαση και στο μηχάνημα CUDA_B, τότε θα έχετε ένα communicator, το οποίο θα έχει 2 υπολογιστές (CUDA_A και CUDA_B). Αν δεν έχετε πρόσβαση στο άλλο μηχάνημα CUDA, θα έχετε ένα communicator με ένα host. 21

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:05 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:04 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:11 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 5: MPI_Reduce Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:14 - ADVISOR Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 2: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 5: MPI_Reduce Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:16 INSPECTOR Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 2: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:03 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ ANDROID-DEVKIT No:01 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Δομημένος Προγραμματισμός Ενότητα 1: Εισαγωγή Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ ARDUINO Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 2: Δομή ενός προγράμματος C Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 10 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:08 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:02 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:06 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 9 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:12 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα Λειτουργικά Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:01 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Εισαγωγή στον GPGPU προγραμματισμό 50,000, ,000,000 (1 από 2) 19/5/2018

Εισαγωγή στον GPGPU προγραμματισμό 50,000, ,000,000 (1 από 2) 19/5/2018 Εισαγωγή στον GPGPU προγραμματισμό Ηλίας K. Σάββας Καθηγητής Τμ. Μηχ. Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας savvas@teilar.gr 50,000,000 Χρόνια που μας πήρε να φτάσουμε αυτό τον αριθμό χρηστών κάποιας υπηρεσίας:

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Εισαγωγή στη C θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Εργαστήριο

Αρχιτεκτονική Υπολογιστών Εργαστήριο Αρχιτεκτονική Υπολογιστών Εργαστήριο Ενότητα: ΠΑΡΑΔΕΙΓΜΑ ΑΠΟΣΦΑΛΜΑΤΩΣΗΣ Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No 05 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 04 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 7: Αποκωδικοποίηση Εντολής x86 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19) Κεφάλαιο 8.7 Πολυδιάστατοι Πίνακες (Διάλεξη 19) Πολυδιάστατοι πίνακες Μέχρι τώρα μιλούσαμε για Μονοδιάστατους Πίνακες. ή π.χ. int age[5]= {31,28,31,30,31; για Παράλληλους πίνακες, π.χ. int id[5] = {1029,1132,1031,9991,1513;

Διαβάστε περισσότερα

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προεπεξεργαστής Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Διαδικασία Μεταγλώττισης πρόγραµµα επεξεργασίας κειµένου if a

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης Στο εργαστήριο αυτό θα μελετήσουμε τον τρόπο με τον οποίο ορίζουμε στην C πολυδιάστατους πίνακες και θα δούμε πώς μπορούμε να δεσμεύουμε

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής Στο εργαστήριο αυτό θα δούμε πώς ορίζονται και πώς χρησιμοποιούνται οι συμβολοσειρές στην C. Επίσης, θα μελετήσουμε κάποιες από τις συναρτήσεις

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής Στο εργαστήριο αυτό θα δούμε πώς ορίζονται και πώς χρησιμοποιούνται οι συμβολοσειρές στην C. Επίσης, θα μελετήσουμε κάποιες από τις συναρτήσεις

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 10: Συναρτήσεις Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:09 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Δομημένος Προγραμματισμός Ενότητα 2: Τύποι μεταβλητών Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

Εισαγωγή στον δομημένο προγραμματισμό

Εισαγωγή στον δομημένο προγραμματισμό Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Εισαγωγή στον δομημένο προγραμματισμό Ενότητα 7 η : Δείκτες Αν. καθηγητής Στεργίου Κώστας e-mail: kstergiou@uowm.gr Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:00 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf(%u\n, x); Β. unsigned char ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Β Περιόδου 2015 (8/9/2015) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών

Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο, ΣΗΜΜΥ Εργαστήριο Υπολογιστικών Συστημάτων (CSLab) Νοέμβριος 2010 Περιεχόμενα...1 Σύντομη Ιστορική Αναδρομή...2

Διαβάστε περισσότερα

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 2ο Aντώνης Σπυρόπουλος v2_061015 Οροι που

Διαβάστε περισσότερα

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1 Δυναμική δέσμευση και αποδέσμευση μνήμης Προγραμματισμός II 1 lalis@inf.uth.gr Γιατί χρειάζεται η δυναμική μνήμη; Οι απαιτήσεις του προγράμματος σε μνήμη μπορεί να είναι άγνωστες την ώρα της συγγραφής

Διαβάστε περισσότερα

1 η ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ (Προγραμματισμός & MATLAB)

1 η ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ (Προγραμματισμός & MATLAB) ΣΧΟΛΗ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΕΜΠ ΜΕΘΟΔΟΙ ΕΠΙΛΥΣΗΣ ΜΕ Η/Υ 1 η ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ (Προγραμματισμός & MATLAB) Ν.Δ. Λαγαρός Μ. Φραγκιαδάκης Α. Στάμος Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης Κατηγορίες μνήμης εκτελέσιμου προγράμματος Στις καθολικές και στατικές μεταβλητές οι χώροι μνήμης δεσμεύονται κατά την διάρκεια της μεταγλώττισης.

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 2 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα της γλώσσας C, το Dev-C++, το οποίο είναι εφαρμογή που τρέχει

Διαβάστε περισσότερα

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προχωρημένα Θέματα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ανακατεύθυνση Εισόδου/Εξόδου Συνήθως η τυπική είσοδος ενός προγράμματος (stdin) προέρχεται

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: Μέτρηση χρόνου τοίχου κατά POSIX Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 02 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα της γλώσσας C, το Dev-C++, το οποίο είναι εφαρμογή που τρέχει

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Γ ) Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δείκτες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Τι είναι ο δείκτης Ένας δείκτης είναι μια μεταβλητή που περιέχει μια διεύθυνση μνήμης. Θυμηθείτε πως

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:07 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Β ) Λειτουργικό Σύστημα Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1 ΑΕΜ ΒΑΘΜΟΣ 449 PASS 451 PASS 476-1733 PASS 1779-1899 FAIL 1900 FAIL Page 1 1901 PASS 1904 PASS 1908 PASS 1909 PASS 1910 - Page 2 1911 PASS 1914 Οριακό PASS 1915 PASS 1926 PASS Page 3 1927 PASS 1928 Οριακό

Διαβάστε περισσότερα

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Ηλεκτρονική Υγεία. Εργαστήριο 4 ο : MATLAB

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Ηλεκτρονική Υγεία. Εργαστήριο 4 ο : MATLAB Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Ηλεκτρονική Υγεία Εργαστήριο 4 ο : MATLAB Αν. καθηγητής Αγγελίδης Παντελής e-mail: paggelidis@uowm.gr Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Άδειες

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα για τη γλώσσα C: τον gcc μεταγλωττιστή της C σε περιβάλλον

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2014-15

Διαβάστε περισσότερα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική Ενότητα 2: Μεταβλητές και Σταθερές Νικόλαος Στεργιούλας Τμήμα Φυσικής Άδειες Χρήσης

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 12 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Hase οδηγίες χρήσης.

Hase οδηγίες χρήσης. Hase οδηγίες χρήσης. Το Hase είναι ένα πρόγραμμα προσομοίωσης που έχει αναπτυχθεί στο πανεπιστήμιο του Εδιμβούργου (http://www.icsa.inf.ed.ac.uk/research/groups/hase/) και μπορεί να χρησιμοποιηθεί για

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 15 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 ❶ Προετοιµασία για το 1 ο Εργαστήριο

Διαβάστε περισσότερα

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Α Β Γ static; printf(%c\n, putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf(*); ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2016 (1/2/2016) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη Εισαγωγικά

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

Μεθόδων Επίλυσης Προβλημάτων

Μεθόδων Επίλυσης Προβλημάτων ΕΠΛ 032.3: 3: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy Κεφάλαιο 12 Πολυδιάστατοι Πίνακες Πολυδιάστατοι πίνακες

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:01 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Αλγόριθμοι και Προγράμματα

Διαβάστε περισσότερα

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι κ. ΠΕΤΑΛΙΔΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ 1 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται

Διαβάστε περισσότερα

Μεθόδων Επίλυσης Προβλημάτων

Μεθόδων Επίλυσης Προβλημάτων ΕΠΛ 032.3: 3: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy Κεφάλαιο 13 Πίνακες & Συναρτήσεις Εισαγωγή Στις προηγούμενες

Διαβάστε περισσότερα

CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο

CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο Project Phase 1 ΗΥ - 335α Χειμερινό εξάμηνο 2012-2013 Διδάσκουσα: Παπαδοπούλη Μαρία Υπεύθυνος βοηθός: Σουρλίγκας Μανώλης, surligas@csd.uoc.gr

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 8 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( ) ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Μορφές μεταβίβασης ορισμάτων σε συναρτήσεις (και μεθόδους) και οι επιπτώσεις τους Επιστροφή τιμών από κλήση συναρτήσεων Υπερφόρτωση

Διαβάστε περισσότερα

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128] ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 06 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική Ενότητα 7: Συναρτήσεις Νικόλαος Στεργιούλας Τμήμα Φυσικής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. Οδηγίες εργαστηρίου. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. Οδηγίες εργαστηρίου. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Οδηγίες εργαστηρίου 9 ο Εξάμηνο Λογαριασμοί Έχετε 2 accounts (και 2 διαφορετικά home directories!)

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 11 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 5 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Υπολογιστικά Συστήματα

Υπολογιστικά Συστήματα Υπολογιστικά Συστήματα Ενότητα 6: Ασκήσεις στη Visual Basic for Applications (VBA) Σαπρίκης Ευάγγελος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017 Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Εισαγωγή στο MPI Εγκατάσταση του Message Passing Interface,

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Εισαγωγή στον Προγραµµατισµό Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Hello World /* Αρχείο hello.c * Εµφανίζει στην οθόνη το * µήνυµα hello world */ #include

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 1: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Δομημένος Προγραμματισμός Ενότητα 3(γ): Εργαστηριακή Άσκηση Αναπλ. Καθηγητής: Κωνσταντίνος Στεργίου Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 6: Αλγόριθμοι / Προγραμματισμός Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται

Διαβάστε περισσότερα

Βασικές Αρχές Προγραμματισμού

Βασικές Αρχές Προγραμματισμού Βασικές Αρχές Προγραμματισμού Κεφάλαιο 2 ΗγλώσσαC Ιστορική Αναδρομή ΗανάπτυξητηςC ξεκίνησε το 1972 στα εργαστήρια Bell από τον Dennis Ritchie με σκοπό την ανάπτυξη ενός λειτουργικού συστήματος για τον

Διαβάστε περισσότερα

Hase οδηγίες χρήσης.

Hase οδηγίες χρήσης. Hase οδηγίες χρήσης. Το Hase είναι ένα πρόγραμμα προσομοίωσης που έχει αναπτυχθεί στο πανεπιστήμιο του Εδιμβούργου (http://www.icsa.inf.ed.ac.uk/research/groups/hase/) και μπορεί να χρησιμοποιηθεί για

Διαβάστε περισσότερα

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Δομημένος Προγραμματισμός Ενότητα 5(γ): Εργαστηριακή Άσκηση Αναπλ. Καθηγητής: Κωνσταντίνος Στεργίου Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα Αλφαριθμητικά Πίνακες: μια σύντομη εισαγωγή Πίνακες χαρακτήρων: τα "Αλφαριθμητικά" Πίνακες(Arrays): έννοιες και ορισμοί Ορισμός: Πίνακας (array) = σύνολο μεταβλητών του ιδίου τύπου (int, float, char,...) με ένα κοινό

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 6 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 4: MPI_ANY_TAG,MPI_ANY_SOURCE,MPI_Bcast, MPI_Wtime, MPI_Wait, MPI_Test, MPI_Scatter Δρ. Μηνάς Δασυγένης

Διαβάστε περισσότερα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact: nifantop@unipi.gr Συναρτήσεις (1/2) Στη C χρησιμοποιούμε συχνά τις συναρτήσεις (functions), οι οποίες είναι ρουτίνες που επαναλαμβάνονται

Διαβάστε περισσότερα