Η **Intel Threading Building Blocks** (γνωστή και ως **TBB**) είναι βιβλιοθήκη προτύπων (templates) της C++ που έχει αναπτυχθεί από την Intel και βοηθά στη συγγραφή λογισμικού που εκμεταλλεύεται τους πολυπύρηνους επεξεργαστές. Η βιβλιοθήκη αποτελείται από δομές δεδομένων και αλγορίθμους που επιτρέπουν στον προγραμματιστή να αποφύγει την πολυπλοκότητα που μπορεί να έχει η χρήση νημάτων όπως τα νήματα POSIX, τα νήματα των Windows ή τα Boost Threads, όπου πρέπει να δημιουργεί, να συγχρονίζει και να καταστρέφει νήματα με ρητό τρόπο. Αντίθετα, στην περίπτωση της TBB, η βιβλιοθήκη δίνει έναν αφαιρετικό τρόπο όσον αφορά την πρόσβαση σε πολλαπλούς επεξεργαστές, επιτρέποντας στις λειτουργίες του προγράμματος να θεωρούνται "εργασίες" ("tasks"), οι οποίες και μπορούν να κατανεμηθούν δυναμικά στους πυρήνες από τη μηχανή χρόνου εκτέλεσης της βιβλιοθήκης, ενώ χρησιμοποιείται αποδοτικά η κρυφή μνήμη του επεξεργαστή. Ένα πρόγραμμα που χρησιμοποιεί την TBB δημιουργεί, συγχρονίζει και καταστρέφει γράφους αλληλεξαρτώμενων εργασιών σύμφωνα με κάποιους *αλγόριθμους*, οι οποίοι είναι παραδείγματα προγραμματισμού υψηλού (αλγοριθμικοί σκελετοί, Algorithmic Skeletons). Οι εργασίες εκτελούνται τότε ακολουθώντας τις εξαρτήσεις μεταξύ των κόμβων του γράφου. Η προσέγγιση αυτή τοποθετεί την TBB σε μια οικογένεια εργαλείων που προσπαθούν να λύσουν το πρόβλημα του παράλληλου προγραμματισμού διαχωρίζοντας τον ίδιο τον προγραμματισμό από τις λεπτομέρειες χαμηλού επιπέδου του εκάστοτε υπολογιστή.

Υλοποίηση
---------

Για να μοιράσει τον παράλληλο φόρτο εργασίας στους διαθέσιμους πυρήνες, η TBB υλοποιεί την "κλοπή εργασιών" ("task stealing"), ώστε να αυξηθεί το ποσοστό χρήσης κάθε πυρήνα και επομένως η δυνατότητα κλιμάκωσης της ταχύτητας ανάλογα με τους διαθέσιμους πόρους (scaling). Το μοντέλο κλοπής εργασιών της TBB μοιάζει με το αντίστοιχο της Cilk. Αρχικά ο φόρτος εργασίας μοιράζεται ισόποσα στους διαθέσιμους πυρήνες. Αν κάποιος πυρήνας τελειώσει τις εργασίες του ενώ άλλοι πυρήνες έχουν ακόμα αρκετές εργασίες στις ουρές αναμονής τους, η TBB αναθέτει κάποιες από τις εργασίες των πυρήνων αυτών στον διαθέσιμο πυρήνα. Η δυνατότητα αυτή απομακρύνει τον προγραμματιστή από τη μηχανή, επιτρέποντας τη συγγραφή εφαρμογών με τη χρήση της βιβλιοθήκης, οι οποίες να μπορούν να εκτελούνται πιο γρήγορα με την προσθήκη περισσότερων πυρήνων, χωρίς να χρειάζεται να αλλάξει ο κώδικάς τους.

Η TBB, όπως η STL, χρησιμοποιεί εκτενώς πρότυπα. Αυτό έχει το πλεονέκτημα ότι η χρήση πολυμορφισμού δεν επιβαρύνεται σημαντικά, επειδή τα πρότυπα είναι δομή που χρησιμοποιείται στον χρόνο μεταγλώττισης και οι σύγχρονοι μεταγλωττιστές της C++ μπορούν να τα βελτιστοποιήσουν σε μεγάλο βαθμό. Το αποτέλεσμα είναι πυκνός και γρήγορος κώδικας.

Η Intel TBB διατίθεται εμπορικά σαν εκτελέσιμη διανομή με υποστήριξη και ως ελεύθερο λογισμικό σε μορφή πηγαίου κώδικα και σε εκτελέσιμη μορφή.

Περιεχόμενα της βιβλιοθήκης
---------------------------

Η TBB είναι μια συλλογή από στοιχεία παράλληλου προγραμματισμού:

* Βασικοί αλγόριθμοι: `parallel_for`, `parallel_reduce`, `parallel_scan`
* Προχωρημένοι αλγόριθμοι: `parallel_while`, `parallel_do`, `parallel_pipeline`, `parallel_sort`
* Containers: `concurrent_queue`, `concurrent_vector`, `concurrent_hash_map`
* Δέσμευση μνήμης (Scalable memory allocation): `scalable_malloc`, `scalable_free`, `scalable_realloc`, `scalable_calloc`, `scalable_allocator`, `cache_aligned_allocator`
* Αμοιβαίος αποκλεισμός (Mutual exclusion): `mutex`, `spin_mutex`, `queuing_mutex`, `spin_rw_mutex`, `queuing_rw_mutex`, `recursive mutex`
* Ατομικές λειτουργίες (Atomic operations): `fetch_and_add`, `fetch_and_increment`, `fetch_and_decrement`, `compare_and_swap`, `fetch_and_store`
* Χρονισμός (Timing): καθολικός και ακριβής χρονικός δείκτης, μεταφέρσιμος (portable fine grained global time stamp)
* Χρονοπρογραμματιστής (Task Scheduler): απευθείας πρόσβαση στον έλεγχο της δημιουργίας και της ενεργοποίησης των εργασιών

Ιστορία
-------

Η έκδοση 1.0 διατέθηκε από την Intel στις 29 Αυγούστου 2006, ένα χρόνο μετά την εμφάνιση του πρώτου διπύρηνου επεξεργαστή x86 της Intel, του Pentium D.

Η έκδοση 1.1 εμφανίστηκε στις 10 Απριλίου 2007. Η έκδοση αυτή εισήγαγε τον auto\_partitioner, παρέχοντας μια αυτόματη εναλλακτική όσον αφορά τον προσδιορισμό της παραμέτρου μεγέθους εργασίας (grain size), που εκτιμούσε την καλύτερη ανάλυση για τις εργασίες που εκτελούνταν. Η έκδοση αυτή προστέθηκε στον Intel C++ Compiler 10.0 (Professional Edition) στις 5 Ιουνίου του ίδιου έτους.

Η έκδοση 2.0 εμφανίστηκε στις 24 Ιουλίου 2007. Περιλάμβανε τον πηγαίο κώδικα και τη δημιουργία ενός εγχειρήματος ανοιχτού κώδικα. Η άδεια ανοιχτού κώδικα του λογισμικού είναι η ίδια με αυτήν που χρησιμοποιήθηκε στο παρελθόν για την πρότυπη βιβλιοθήκη της C++ του GNU Compiler Collection, μια GPLv2 με "εξαίρεση συστήματος χρόνου εκτέλεσης" ("runtime exception"), γιατί χρησιμοποιούσε πολλά πρότυπα που γίνονταν μέρος του εκτελέσιμου μετά τη μεταγλώττιση. Η TBB διατίθεται ακόμα σαν εμπορική έκδοση (χωρίς πηγαίο κώδικα) και με υποστήριξη, χωρίς κάποια διαφορά σε σχέση με την έκδοση ελεύθερου λογισμικού.

Η έκδοση 2.1 εμφανίστηκε στις 22 Ιουλίου 2008. Περιείχε σύνδεση εργασιών με νήματα (task-to-thread affinity), υποστήριξη ματαίωσης (cancellation), χειρισμό εξαιρέσεων (exception handling) και ένα μεταφέρσιμο στρώμα αφαίρεσης για τα νήματα (portable thread wrapper).

Η έκδοση 2.2 εμφανίστηκε στις 5 Αυγούστου 2009.[*νεκρός σύνδεσμος*] Υποστήριζε τις λ-συναρτήσεις (lambda functions) της C++0x.

Η έκδοση 3.0 εμφανίστηκε στις 4 Μαΐου 2010 ().

Η έκδοση 4.0 εμφανίστηκε στις 8 Σεπτεμβρίου 2011 ().

Υποστηριζόμενα συστήματα
------------------------

Η εμπορική έκδοση της έκδοσης 3.0 της TBB υποστηρίζει τα Microsoft Windows (XP ή μεταγενέστερα), το Mac OS X (έκδοση 10.5.8 ή μεταγενέστερη) και το Linux χρησιμοποιώντας διάφορους μεταγλωττιστές (Visual C++ (από την έκδοση 8.0, μόνο για Windows), Intel C++ Compiler (από την έκδοση 11.1) ή GNU Compiler Collection (gcc)). Επιπλέον, η κοινότητα ανοιχτού λογισμικού της TBB έχει δημιουργήσει μετατροπές για τη χρήση της στα λειτουργικά συστήματα Sun Solaris, QNX Neutrino και FreeBSD, στους επεξεργαστές PowerPC και στην κονσόλα Xbox 360.

### Λειτουργικά συστήματα ανοιχτού κώδικα

Η TBB είναι διαθέσιμη για το FreeBSD και πακέτα της υπάρχουν για τις εξής διανομές GNU/Linux και Sun Solaris:

* Red Hat Fedora
* Novell openSUSE
* Canonical Ubuntu
* Arch Linux
* Turbolinux
* Red Flag Asianux
* Debian
* Gentoo
* Sun Solaris
* Sun OpenSolaris

Δείτε επίσης
------------

* Αλγοριθμικός σκελετός
* Παράλληλος προγραμματισμός
* Grand Central Dispatch
* Intel Array Building Blocks
* Cilk
* Intel Cilk Plus
* Intel Concurrent Collections
* Intel Parallel Building Blocks

Παραπομπές
----------

1. ↑   Intel Threading Building Blocks Commercial Version Homepage
2. 1 2   Threading Building Blocks Open Source Project Homepage
3. ↑  «Intel Threading Building Blocks - Release Notes Version 3.0». Ανακτήθηκε στις 8 Αυγούστου 2011.
4. ↑  «Using Intel's Threaded Building Blocks (TBB) With Sun Studio Express». Ανακτήθηκε στις 8 Μαΐου 2008.

Αναφορές
--------

* Reinders, James (2007, July). *Intel Threading Building Blocks: Outfitting C++ for Multi-core Processor Parallelism* (Paperback) Sebastopol: O'Reilly Media, ISBN 978-0-596-51480-8.
* Voss, M. (2006, October). "Demystify Scalable Parallelism with Intel Threading Building Blocks' Generic Parallel Algorithms." Αρχειοθετήθηκε 2012-02-05 στο Wayback Machine.
* Voss, M. (2006, December). "Enable Safe, Scalable Parallelism with Intel Threading Building Blocks' Concurrent Containers." Αρχειοθετήθηκε 2012-02-05 στο Wayback Machine.
* Hudson, R. L. B. Saha, et al. (2006, June). "McRT-Malloc: a scalable transactional memory allocator." Proceedings of the 2006 International Symposium on Memory Management. New York: ACM Press, pp. 74-83.

Εξωτερικοί σύνδεσμοι
--------------------

* Intel Threading Building Blocks, Συστήματα Παράλληλης Επεξεργασίας, ΕΜΠ.


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| π • σ • ε
Θέματα παράλληλου προγραμματισμού |
| --- |
|  |
| Επισκόπηση | 
Υπολογιστικό νέφος · Υπολογιστική συστάδα · Κατανεμημένος προγραμματισμός · Υπολογιστικό πλέγμα |
|  |
| Παραλληλισμός (επίπεδα) | 
Bit · Εντολής · Δεδομένων · Εργασιών |
|  |
| Νήματα υλικού | 
Υπερνημάτωση |
|  |
| Θεωρία | 
Νόμος του Άμνταλ · Νόμος του Γκούσταφσον · Κλιμακωσιμότητα · Μετρική Καρπ-Φλατ · Επιβράδυνση παραλληλισμού · Επιτάχυνση παραλληλισμού |
|  |
| Θεμέλια στοιχεία | 
Διεργασία · Νήμα · PRAM · Πράσινα νήματα |
|  |
| Συγχρονισμός | 
Πολυεπεξεργασία · Multithreading · Memory coherency · Cache coherency · Barrier · Synchronization · Application checkpointing |
|  |
| Προγραμματισμός | 
Μοντέλα (Έμμεσος παραλληλισμός · Ρητός παραλληλισμός · Ταυτοχρονισμός) · Ταξινομία του Φλυν (SISD • SIMD • MISD • MIMD (SPMD)) |
|  |
| Υλικό υπολογιστών | 
Πολυπεξεργασία (Συμμετρική · Ασυμμετρική) · Μνήμη (NUMA · COMA · κατανεμημένη · κοινή · κατανεμημένη κοινή) · SMT
MPP · Υπερβαθμωτός επεξεργαστής · Διανυσματικός επεξεργαστής · Υπερυπολογιστής · *Beowulf* |
|  |
| Βιβλιοθήκες και API | 
Νήματα POSIX · OpenMP · PVM · MPI · UPC · Intel Threading Building Blocks · Boost.Thread · Global Arrays · Charm++ · Cilk · Co-array Fortran · CUDA |

 |