grundlagen der cell programmierungra.ziti.uni-heidelberg.de/pages/student_work/seminar/ws... ·...
TRANSCRIPT
1
Grundlagen der CELLProgrammierung
Seminarvortrag im Rahmen des Seminars
„Ausgewählte Themen in Hardwareentwurf und Optik“
WS 2005/2006
von
Benjamin Kalisch
2InhaltInhalt
� Was ist Cell
� Erste Generation (Hardware)
� Programmierung
� Spezialregister & Channels
� MFC
� SPE
� Linux und Bibliotheken
� Programmierbeispiel
� SchlussfolgerungenQuelle: [16]
...
...
...
3
Die Cell Broadband Engine Architecture (CBEA), kurz Cell, ist ein, von Sony Toshiba und IBM entwickelter, heterogener Multi-Core Prozessor.
Ziele
� Hohe Leistung in Multimedia Anwendungen
� Energieeffizienz (GFLOPS/Watt)
• Verzicht auf out-of-order Execution � höherer Takt
Daten
• Transistoren 234 Millionen
• Chip-Fläche 235 mm²
• Technologie 90 nm SOI
Was ist Was ist CellCell
4
Hardware
Quellen [1], [2], [6], [7], [14], [24]
5
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ]
Erste GenerationErste Generation
5
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ]
Erste GenerationErste Generation
Grundidee:
1 Hauptprozessorunterstützt von 8„Anwendungs-beschleunigern“
5
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ]
Erste GenerationErste Generation
Grundidee:
1 Hauptprozessorunterstützt von 8„Anwendungs-beschleunigern“
SSXXUU
MFCMFC
LLSS
6
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ] © IBM
Erste Generation Erste Generation -- PPEPPEPower Processor Element (PPE)
� L2 Cache: 512kB, kohärent
� Optimierter 64bit POWER Prozessor
• 2-way simultaneous Multithreading
• SIMD Erweiterung (AltiVec)
• kompatibel zu POWER Anwendungen
• Führt das Betriebssystem aus
7
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ]
Erste Generation Erste Generation -- SPE (SXU)SPE (SXU)Synergistic Processing Element (SPE)
Synergistic Execution Unit (SXU)
� SIMD Prozessor auf 128bit Vektoren� 4-Wege SIMD Einheit
� Register File 128 Einträge à 128bit
� Loop-unrolling
� Instruktionen ähnlich AltiVec
� Hauptspeicherzugriff nur per DMA
8
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ]
Erste Generation Erste Generation -- SPE (LS)SPE (LS)Synergistic Processing Element (SPE)
Local Store (LS)
� 256kB für Instruktionen und Daten
� Single ported SRAMZugriffsprioritäten Granularität1. DMA 128B2. Load + Store 16B3. Instruction Fetch 128B
� Abgebildet in Hauptspeicher Domäne
� Lokaler Zugriff: Keine Adressübersetzung
Kein Adressschutz
9
© IBM[ Quelle: http://www.research.ibm.com/cell/cell_chip.html ]
Erste Generation Erste Generation -- SPE (MFC)SPE (MFC)Synergistic Processing Element (SPE)
Memory Flow Controller (MFC)
� DMA Controller inklusive MMU
� Transfergrößen 1B bis 16kBAlignment 128 Byte
� 2 Befehls Queues: lokal � SPU Queue (16 E.)
global � Proxy Queue (8 E.)
� Kommunikation zum MFC:lokal � Channel Interfaceglobal � MMIO Register
Quelle: [24]
10
Programmierung
Quellen
Allgemein [22], [13], [17], [25], [26]
Skalar, SIMDization [19], [20], [21]
MFC, Channels [24]
11MMIO Register MMIO Register (1/3)(1/3)
32bit Spezialregister sind in Hauptspeicherdomäne verfügbar.
Kommunikationsregister
� SPU_Out_Mbox Nachrichten SPE � PPE
� SPU_In_Mbox Nachrichten PPE � SPE (Queue)
� SPU_Sig_Notify_1(/2) Kommunikation SPE � SPE oder I/O
Modi: „Logical-Or“ Many-to-One
„Overwrite“ One-to-One
� MFC_MSSync Stellt Abschluss ausstehender DMA Befehle sicher
� Wichtig für sicheren Prozesswechsel
Memory Mapped I/O Register
C-Mnemonics
12MMIO Register MMIO Register (2/3)(2/3)
Adressierung relativ zu BE_MMIO_Base
DMA Befehlsregister
Beispiel: Reihenfolge für DMA Befehl initialisiert durch PPE
1. S: Local Store Adresse � MFC_LSA
2. S: Hauptspeicheradresse � MFC_EAL (+ MFC_EAH)
3. S: Größe und Tag zur Kontrolle � MFC_Size_Tag
4. S: Auszuführender Befehl � MFC_ClassID_CMD
� Startet Hinzufügversuch
5. L: Hinzufügen erfolgreich? MFC_CMDStatus
DMA Informationsregister
� Tag-Gruppe ausgeführt? Prxy_TagStatus
PPE Interrupt möglich
Adresse SPE(n):
BE_MMIO_Base+ n � 0x80000+ 0x43004
13MMIO Register MMIO Register (3/3)(3/3)
SPE Kontrollregister
� SPU_NPC LS Adresse der nächsten InstruktionNur gültig, wenn SPU idle (SPU_Status[R] = 0)
� SPU_RunCntl Startet und Stoppt SPU
• Stop Request � Stoppt SPE
• Run Request � Startet SPE bei SPU_NPC
� SPU_Status SPE Status Register, wichtige Bitfelder:
� SPU angehaltenStop-and-Signal InstruktionP
SPU_Status enthält in diesem Fall auch den Stoppcode
Ungültige Instruktion
SPU running
Bedeutung (falls Bit = 1)
R
Bit
� SPU angehaltenI
14SPU SPU Channel Channel InterfaceInterface
Registerinhalte bei MMIO und Channel Interface größtenteils identisch.
Unterschiede: Store+Load/DMA Befehle Channel Read/Write Befehle
SPU Assembler
RDCH RT, CH Channel CH � Register RT
WRCH CH, RA Register RA � Channel CH
RCHCNT RT, CH #Einträge in CH � Register RT
SPU Channel C-Intrinsics
d = spu_readch( channel );
d = spu_readchcnt( channel ); d,a = u32
spu_writech( channel, a );
Nichts, wrch blockiert bis Platz istMFC_CMDStatus
MFC_Size & MFC_TagIDMFC_Size_Tag
Channel ÄquivalentMMIO Register
15MFC ProgrammierungMFC ProgrammierungSPU DMA C-Intrinsics
� spu_mfcdma64 (ls, eahi, ealow, size, tag, cmd);
� d = spu_mfcstat( type );
MFC Assembler Befehle (cmd):
MFC_PUTLLC_CMDAtomic put, entspricht PowerPC stwcxputllc
MFC_GETLLAR_CMDAtomic get, entspricht PowerPC lwarxgetllar
MFC_BARRIER_CMDErzeugt Speicherbarrierebarrier
MFC_GET*_CMDKopiert: LS Hauptspeicherget*
MFC_PUTL_CMDDMA Befehlsliste aus dem LS (nur SPU)� putl
MFC_PUTB_CMDOrdnet diesen Befehl relativ zu vorherigen� putb
MFC_PUTS_CMDStartet SPU nach Kopieren (nur Proxy)� puts
MFC_PUT_CMDKopiert: LS ���� Hauptspeicherput
15MFC ProgrammierungMFC ProgrammierungSPU DMA C-Intrinsics
� spu_mfcdma64 (ls, eahi, ealow, size, tag, cmd);
� d = spu_mfcstat( type );
MFC Assembler Befehle (cmd):
MFC_PUTLLC_CMDAtomic put, entspricht PowerPC stwcxputllc
MFC_GETLLAR_CMDAtomic get, entspricht PowerPC lwarxgetllar
MFC_BARRIER_CMDErzeugt Speicherbarrierebarrier
MFC_GET*_CMDKopiert: LS Hauptspeicherget*
MFC_PUTL_CMDDMA Befehlsliste aus dem LS (nur SPU)� putl
MFC_PUTB_CMDOrdnet diesen Befehl relativ zu vorherigen� putb
MFC_PUTS_CMDStartet SPU nach Kopieren (nur Proxy)� puts
MFC_PUT_CMDKopiert: LS ���� Hauptspeicherput
Channel writes:ls � MFC_LSA
eahigh � MFC_EAH
ealow � MFC_EAL
size � MFC_Size
tag � MFC_TagID
cmd � MFC_CMD
16SPE ProgrammzuweisungSPE Programmzuweisung
16SPE ProgrammzuweisungSPE Programmzuweisung
Einige Alternativen
1. Instr. & Daten direkt per store
2. Interrupt auf PPE möglich
3. Kann man sich mit getbs sparen
4. Stop-and-Signal InstruktionAssembler stop u14
� Interrupt auf PPE
1.
2.
3.
4.
17SPE Instruktionssatz (Auszug)SPE Instruktionssatz (Auszug)LS Instruktionen
lqx rt, ra, rb Load Quadword
stqx rt, ra, rb Store Quadword
Integer Instruktionen
a rt, ra, rb Add Word
Logik Instruktionen
xor rt, ra, rb Logical XOR
Shift and Rotate Instruktionen
rotqby rt, ra, rb Rotate Quadword left by Bytes
Compare and Branch Instruktionen
ceq rt, ra, rb Compare Equal Word
brz rt, i16 Branch if zero
Floating Point Instruktionen
fma rt, ra, rb, rc Floating Point Multiply and Add
fcgt rt, ra, rb Floating Point Compare Greater Than
Kontroll Instruktionen
Channel Instruktionen
18Spezielles an Spezielles an SPEsSPEs
� SPE Error-Handling & System-Calls nur auf PPE � Weiterleitung
� Run-to-Completion Nutzung empfohlen (preemptive möglich)
� Branch-Hint Instruktion
Verbessert Static Branch Prediction (‘not taken‘)
• Rechtzeitiger und korrekter Hint � keine Penalty
• Maximal ein ausstehender Branch-Hint
hbr s11, ra
hbrp Instruction-Fetch-HintErhöht I-Fetch Priorität
19Predication Predication auf auf SPEsSPEs
� Bitwise Select
Vermeidung kleiner Branches durch Predication
Assembler: selb rt, ra, rb, rc
C-Intrinsic: d = spu_sel(a, b, pattern);
Beispiel:
cmp x � cond
add y � d+a
add z � d+1
selb d, z, y, x
cmp x � cond
bra x, else
then: add d � d+1
bra done
else: add d � d+a
done:
�
20SkalararithmetikSkalararithmetik auf auf SPEsSPEs
� SPEs besitzen keine dedizierte Skalarlogik
� LS Zugriffe 16B aligned + Register 16B breit
� Position in Register = Offset im LS
Bsp.1: a[0] = c[0] + b[0] �
Bsp.2: a[1] = c[2] + b[3] �[i] = Offset relativ zum 16B Alignment
Quelle: [19]
20SkalararithmetikSkalararithmetik auf auf SPEsSPEs
� SPEs besitzen keine dedizierte Skalarlogik
� LS Zugriffe 16B aligned + Register 16B breit
� Position in Register = Offset im LS
Bsp.1: a[0] = c[0] + b[0] �
Bsp.2: a[1] = c[2] + b[3] �[i] = Offset relativ zum 16B Alignment
Quelle: [19]
Add
20SkalararithmetikSkalararithmetik auf auf SPEsSPEs
� SPEs besitzen keine dedizierte Skalarlogik
� LS Zugriffe 16B aligned + Register 16B breit
� Position in Register = Offset im LS
Bsp.1: a[0] = c[0] + b[0] �
Bsp.2: a[1] = c[2] + b[3] �[i] = Offset relativ zum 16B Alignment
Quelle: [19]
Add
20SkalararithmetikSkalararithmetik auf auf SPEsSPEs
� SPEs besitzen keine dedizierte Skalarlogik
� LS Zugriffe 16B aligned + Register 16B breit
� Position in Register = Offset im LS
Bsp.1: a[0] = c[0] + b[0] �
Bsp.2: a[1] = c[2] + b[3] �[i] = Offset relativ zum 16B Alignment
Quelle: [19]
Add
RotateAdd
� Lösung: Register Rotieren
Speichern auch problematisch
a[1] geändert, was mit a[0],a[2],a[3] ?
20SkalararithmetikSkalararithmetik auf auf SPEsSPEs
� SPEs besitzen keine dedizierte Skalarlogik
� LS Zugriffe 16B aligned + Register 16B breit
� Position in Register = Offset im LS
Bsp.1: a[0] = c[0] + b[0] �
Bsp.2: a[1] = c[2] + b[3] �[i] = Offset relativ zum 16B Alignment
Quelle: [19]
Add
RotateAdd
� Lösung: Register Rotieren
Speichern auch problematisch
a[1] geändert, was mit a[0],a[2],a[3] ?
� Lösung: Read, Insert, Write
20SkalararithmetikSkalararithmetik auf auf SPEsSPEs
� SPEs besitzen keine dedizierte Skalarlogik
� LS Zugriffe 16B aligned + Register 16B breit
� Position in Register = Offset im LS
Bsp.1: a[0] = c[0] + b[0] �
Bsp.2: a[1] = c[2] + b[3] �[i] = Offset relativ zum 16B Alignment
Quelle: [19]
Add
RotateAdd
� Lösung: Register Rotieren
Speichern auch problematisch
a[1] geändert, was mit a[0],a[2],a[3] ?
� Lösung: Read, Insert, Write
Einfachere Lösung für Beides:
Pro Skalar 16B und Position 0
GCC: float example __attribute__ ((aligned (16)));
21
Linux und Bibliotheken
Quellen
Linux [3], [4], [18]
libspe [11]
spu_intrinsics [13]
22
� Anpassungen: Spezieller Interrupt Controller und SPEs
� SPE Thread Verwaltung durch SPU File System (spufs)
� Verzeichnisse entsprechen logischem SPE Kontext
� Mapping auf SPEs übernimmt BS (Virtualisierung)
� SPU starten: System-Call mit Parametern auf run
Übergabepointer auf: struct spufs_run_arg {u32 npc;u32 status; };
� Aufrufender Thread blockiert
Linux Linux auf auf CellCell
Outb. Inter. MBox
Outbound MBox
Local Store
Register File
RUN
Inbound MBoxQuelle: [3]
23libspelibspe.h .h (1/2)(1/2)
libspe.h = SPE Runtime Management Library
� Ist PPE C-Bibliothek
� POSIX-Thread ähnliche SPE Nutzung auf User-Level Basis
� Unterscheidung: SPE Group SPE Threadspe_gid_t speid_t
� Gang-Scheduling für Gruppen möglich
Kommunikationsfunktionen:
u32 = spe_read_out_mbox( speid );
spe_write_in_mbox( speid, u32 );
spe_write_signal( speid, reg, u32 );
24libspelibspe.h .h (2/2)(2/2)
Verwaltungsfunktionen:
program* = spe_open_image( *filename );
gid = spe_create_group( policy, priority, spe_events );
speid = spe_create_thread( gid, *program, *argp, *envp, mask, flags );
succ = spe_wait( speid, *status, options );
Funktionen zum Zugriff auf SPE Ressourcen (z.B.)
void* = spe_get_ls( speid );
Ändernung gewählter Einstellungen (z.B.)
succ = spe_set_affinity( speid, mask );
Form einer Thread Funktion
int main( speid, argp, envp );
25spuspu__intrinsicsintrinsics.h.h
� Ist SPE C-Bibliothek
� Enthält alle bisher gezeigten C-Intrinsics
� Führt Vektor-Datentypen ein
vector unsigned int vec_uint4
vector float vec_float4
qword
� Ermöglicht direkte Vektor-Operationen
d = spu_add(a, b); //a, b, c, d Vektoren
d = spu_madd(a, b, c);
d = spu_compeq(a, b);
26Programmierbeispiel PPEProgrammierbeispiel PPE
/* --------------------------------------- context.h --------------------------------------- */
typedef struct {
vector float pos;
vector float vel;
float delta_t;
} context;
/* ------------------------------------ ppeprogram.c ------------------------------------ */
extern spe_program_handle_t speprogram;
int main() {
int status;
context ctx;
speid_t speid;
// [ . . . ]
speid = spe_create_thread(0, &speprogram, &ctx, NULL, -1, 0);
(void) spe_wait(speid, &status, 0);
}
27Programmierbeispiel SPEProgrammierbeispiel SPE
/* ------------------------------------ speprogram.c ------------------------------------ */
int main(unsigned long long spu_id, unsigned long long parm) {
unsigned int tag_id = 0;
vector float delta_t_vec;
context ctx;
spu_mfcdma32(&ctx, parm, sizeof(context), tag_id, MFC_GET_CMD);
(void) spu_mfcstat(2);
delta_t_vec = spu_splats(ctx.delta_t);
ctx.pos = spu_madd(ctx.vel, delta_t_vec, ctx.pos);
spu_mfcdma32(&ctx, parm, sizeof(context), tag_id, MFC_PUT_CMD);
(void) spu_mfcstat(2);
}
delta_tdelta_tdelta_tdelta_t
28
Schlussfolgerungen
29SchlussfolgerungenSchlussfolgerungen
� MMIO Register und Channels wichtiger Bestandteil der Architekturausnutzung
� In Hochsprache (C/C++) programmierbar
� Höherer Programmieraufwand
• Vereinfacht durch Bibliotheken
• Mehraufwand = Performance
• XL C Compiler
� Hohe Maximalperformance
• SP FP 204 GFLOPS
• DP FP 20 GFLOPS
Quelle [26]
SP FP MatrixmultiplikationP4 (SSE3, 3.2GHz): 25.6GFLOPS
3.2 GHZ Cell:
30QuellenQuellen
“Hardware and Software Architectures for the Cell Broadband Engine processor”
Michael Day, Peter Hofstee
http://www.casesconference.org/cases2005/pdf/Cell-tutorial.pdf
[8]
“Introduction to the Cell multiprocessor”
Autoren: J.A. Kahle, M.N. Day, H.P. Hofstee, C.R. Johns, T.R. Maeurer, D. Shippy
http://www.research.ibm.com/journal/rd/494/kahle.html
[7]
“Cell Architecture Explained Version 2”
Autor: Nicholas Blachford
http://www.blachford.info/computer/Cell/Cell0_v2.html
[6]
“Just like being there: Papers from the Fall Processor Forum 2005: Unleashing the power of the Cell Broadband Engine”
Autor: developerWorks
http://www-128.ibm.com/developerworks/power/library/pa-fpfunleashing/
[5]
“Meet the Experts: Arnd Bergmann on Cell”
Autoren: Arnd Bergmann, developerWorks
http://www-128.ibm.com/developerworks/power/library/pa-expert4
[4]
“Spufs: The Cell Synergistic Processing Unit as a virtual file system”
Autor: Arnd Bergmann
http://www-128.ibm.com/developerworks/power/library/pa-cell/
[3]
“The Design and Implementation of a First-Generation CELL Processor”
Autoren: D. Pham, S. Asano, M. Bollinger, M.N. Day, H.P. Hofstee, C. Johns, J. Kahle, A. Kameyama, J. Keaty, Y. Masubuchi, M. Riley, D. Shippy, D. Stasiak, M. Suzuoki, M. Wang, J. Warnock, S. Weitzel, D. Wendel, T. Yamazaki, K. Yazawa
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/7FB9EC5D5BBF51ED87256FC000742186
[2]
„A Streaming Processing Unit for a CELL Processor“
Autoren: B. Flachs, S. Asano, S.H. Dhong, P. Hofstee, G. Gervais, R. Kim, T. Le, P. Liu, J. Leenstra, J. Liberty, B. Michael, H. Oh, S.M. Mueller, O. Takahashi, A. Hatakeyama, Y. Watanabe, N. Yano
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/E815CC047A60914687256FC000734156
[1]
31QuellenQuellen
“Unleashing the Power: A programming example of large FFTs on Cell“
Autoren: Alex Chow, Gordon Fossum, Daniel A.Brokenshire
http://www.power.org/news/events/barcelona/
[16]
“Porting the GNU Tool Chain to the Cell Architecture”
Autor: Ulrich Weigand
http://www.gccsummit.org/2005/2005-GCC-Summit-Proceedings.pdf
[15]
“Cell Moves into the Limelight”
Autor: Kevin Krewell
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/D9439D04EA9B080B87256FC00075CC2D
[14]
“SPU C/C++ Language Extensions”
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/30B3520C93F437AB87257060006FFE5E[13]
“Optimizing Compiler for a CELL Processor”
Autoren: Alexandre E. Eichnberger, Kathryn O’Brien, Kevin O’Brian, Peng Wu, Tong Chen, Peter H. Oden, Daniel A. Prenner, Janice C. Shepherd, Byoungro So, Zehra Sura, Amy Wang, Tao Zhang, Peng Zhao, Michael Gschwind
http://cag.csail.mit.edu/crg/papers/eichenberger05cell.pdf
[12]
“SPE Runtime Management Library”
http://www.bsc.es/projects/deepcomputing/linuxoncell/development/release2.0/libspe/libspe_v1.0.pdf[11]
“CELL: A New Platform for Digital Entertainment”
Autoren: Dominic Mallinson, Mark DeLoura
http://www.research.scea.com/research/html/CellGDC05/index.html
[10]
“A remote Procedure Call Implementation for the Cell Broadband Architecture”
Part of: “Cell Broadband Engine (Cell BE) Software Sample and Library Source Code”
http://www.alphaworks.ibm.com/tech/cellsw?open&S_TACT=105AGX16&S_CMP=DWPA
[9]
32QuellenQuellen
“Synergistic Processor Unit Instruction Set Architecture”
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/76CA6C7304210F3987257060006F2C44/[25]
“Cell Broadband Engine Architecture”
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/1AEEE1270EA2776387257060006E61BA[24]
Cell Broadband Engine Architecture and its first implementation – A Performance View
http://www-128.ibm.com/developerworks/power/library/pa-cellperf/[26]
“Meet the experts: Alex Chow on Cell Broadband Engine programming models”
Alex Chow
http://www-128.ibm.com/developerworks/power/library/pa-expert8/
[23]
“Cell Broadband Engine Programming Tutorial”
Cell Broadband Engine Architecture Joint Software Reference Environment Series[22]
”Vectorization for SIMD Architectures with Alignment Constraints”
Alexandre Eichenberger, Peng Wu, Kevin O’Brian
http://www.research.ibm.com/cellcompiler/slides/pldi04.pdf
[21]
”An Integrated Simdization Framework using virtual vectors”
Peng Wu, Alexandre Eichenberger, Amy Wang, Peng Zhao
http://www.research.ibm.com/cellcompiler/slides/ics05.pdf
[20]
“Efficient SIMD Code Generation for Runtime Alignment & Length Conversion”
Peng Wu, Alexandre Eichenberger, Amy Wang
http://www.research.ibm.com/cellcompiler/slides/cgo05.pdf
[19]
“Cell Broadband Engine Linux Reference Implementation Application Binary Interface Specification”
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/44DA30A1555CBB73872570B20057D5C8/[18]
“SPU Application Binary Interface Specification”
http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/02E544E65760B0BF87257060006F8F20[17]
33
Fragen ?