Intel Threading Building Blocks

Η 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 (http://software.intel.com/en-us/blogs/2010/05/04/tbb-30-new-today-version-of-intel-threading-building-blocks/).

Η έκδοση 4.0 εμφανίστηκε στις 8 Σεπτεμβρίου 2011 (https://web.archive.org/web/20111213150434/http://threadingbuildingblocks.org/whatsnew.php).

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

Η εμπορική έκδοση της έκδοσης 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

Παραπομπές

Αναφορές 
 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." 
 Voss, M. (2006, December). "Enable Safe, Scalable Parallelism with Intel Threading Building Blocks' Concurrent Containers." 
 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, Συστήματα Παράλληλης Επεξεργασίας, ΕΜΠ.

Νήματα