Programming with Linux on the 
         Playstation3
                              FOSDEM 2008
                         ol...
Who am I

    Java / Python developer at Nuxeo (FOSS document 
    management server)

    Interested in Artificial Inte...
PS3 architecture overview

    CPU: IBM Cell/BE @ 3.2GHz 
    
        218 GFLOPS
    
        Main RAM: 256MB XDR (64b...
The Cell Broadband Engine
             
                 1 PPE core @ 3.2GHz
                 
                     64bi...
PS3 Clusters
          
              Cheap cluster for 
              academic researchers
          
              Car...
PS3 GRID Computing

    PS3GRID project
    
        based on BOINC
    
        30,000 atoms simulation

    Folding@...
Linux on the PS3

    Lv1 Hypervisor shipped with the default firmware

    Partition utility in the Sony Game OS menu
...
Programming the Cell/BE in C

    Program the PPE as a chief conductor to spread the 
    numerical code to SPEs

    Us...
Introduction to SIMD programming

    128 bits registers (SSE2, Altivec, SPE)
     
         2 x double
     
         ...
SIMD programming – the big picture 




              
Not always SIMD­izable




            
SIMD programming with libspe2 and 
                                gcc­spu

    #include <spu_intrinsics.h>

    avoid s...
Branch elimination

    avoid branching (if / else)
    
        c = spu_sel(a, b, spu_cmpgt(a, d));




               ...
A sample SPE program
volatile union {
       vec_float4 vec;
       float part[4];
} sum;
float dot_product(const float* x...
DMA with the SPUs' Memory Flow 
                   Controllers

    #include <spu_mfcio.h>

    mfc_get(&local_data, mai...
Double­buffering – the problem




            
Double­buffering – the big picture




             
Double­buffering with MFC

    1. SPU queues MFC GET to fill buffer #1

    2. SPU queues MFC GET to fill buffer #2

  ...
Some resources

    Cell BE Programming Tutorial (ibm.com 190 pages)

    IBM developerworks short programming tutorials...
Thanks, credits, licensing

    Most schemas from excellent GFDL 'd tutorial by 
    Geoff Levand (Sony Corp)
    
     ...
7 differences




       
Upcoming SlideShare
Loading in …5
×

Programming the PS3

15,004 views

Published on

Talk given at FOSDEM 2008 to introduce how to program the Cell BE processor of the Playstation 3 under Linux.

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
15,004
On SlideShare
0
From Embeds
0
Number of Embeds
184
Actions
Shares
0
Downloads
130
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Programming the PS3

  1. 1. Programming with Linux on the  Playstation3     FOSDEM 2008 olivier.grisel@ensta.org  Architecture overview:   introducing the Cell BE   Installing Linux  SIMD programming in C/C++  Asynchronous data transfer with  the DMA    
  2. 2. Who am I  Java / Python developer at Nuxeo (FOSS document  management server)  Interested in Artificial Intelligence (and need fast  Support Vector Machines)  Slides to be published at: http://oliviergrisel.name    
  3. 3. PS3 architecture overview  CPU: IBM Cell/BE @ 3.2GHz   218 GFLOPS  Main RAM: 256MB XDR (64b@3.2GHz)  GPU: Nvidia RSX   1.8 TFLOPS (SP) / 356 GFLOPS programmable   VRAM: 256MB GDDR3 (2x128b@700MHz)  System Bus: 2.5 GB/s    
  4. 4. The Cell Broadband Engine  1 PPE core @ 3.2GHz  64bit hyperthreaded  PowerPC  512KB L2 cache  8 SPE cores @ 3.2GHz  128bit SIMD optimized  256KB SRAM    
  5. 5. PS3 Clusters  Cheap cluster for  academic researchers  Carolina State U. and  U. Massachusetts at D.  8+1 cluster with ssh and  MPI    
  6. 6. PS3 GRID Computing  PS3GRID project  based on BOINC  30,000 atoms simulation  Folding@Home  1 PFLOPS with 800  TFLOPS from PS3s  BlueGene == 280  TFLOPS    
  7. 7. Linux on the PS3  Lv1 Hypervisor shipped with the default firmware  Partition utility in the Sony Game OS menu  Choose your favorite distro:   Install a ­powerpc64­smp or ­ps3 kernel  Install gcc­spu + libspe2    
  8. 8. Programming the Cell/BE in C  Program the PPE as a chief conductor to spread the  numerical code to SPEs  Use POSIX threads to start SPE subroutines in  parallel  Use SPE intrinsics to perform vector instructions  Eliminate branches as much as possible in SPE code  Align your data to 16 bytes    
  9. 9. Introduction to SIMD programming  128 bits registers (SSE2, Altivec, SPE)  2 x double  4 x float  4 x int  introduce new vector types  1 vector float operation == 4 float operations  logical (and, or, cmp, ...), arithmetic (+, *, abs, ...),  shuffling    
  10. 10. SIMD programming – the big picture     
  11. 11. Not always SIMD­izable    
  12. 12. SIMD programming with libspe2 and  gcc­spu  #include <spu_intrinsics.h>  avoid scalar types use:  vector_float4  vector_double2  vector_char16 ...  d = spu_and(a, b); e = spu_madd(a, b, c);  spu­gcc  pure_spe_prog.c ­o pure_spe_prog.elf    
  13. 13. Branch elimination  avoid branching (if / else)  c = spu_sel(a, b, spu_cmpgt(a, d));    
  14. 14. A sample SPE program volatile union { vec_float4 vec; float part[4]; } sum; float dot_product(const float* xp, const float* yp, const int size) { sum.vec = (vec_float4) {0, 0, 0, 0};        vec_float4* xvp = (vec_float4*) xp;        vec_float4* yvp = (vec_float4*) yp;  vec_float4* xvp_end = xvp + size / 4; while(__builtin_expect(xvp < xvp_end, 1)) { sum.vec = spu_madd(*xvp, *yvp, sum.vec); xvp++; yvp++; } return sum.part[0] + sum.part[1] + sum.part[2] + sum.part[3]; }    
  15. 15. DMA with the SPUs' Memory Flow  Controllers  #include <spu_mfcio.h>  mfc_get(&local_data, main_mem_data_ea,  sizeof(local_data), DMA_TAG, 0, 0);  mfc_put(&local_data, main_mem_data_ea,  sizeof(&local_data), DMA_TAG, 0, 0);  mfc_getb(&local_data, main_mem_data_ea,  sizeof(local_data), DMA_TAG, 0, 0);  spu_mfcstat(MFC_TAG_UPDATE_ALL);    
  16. 16. Double­buffering – the problem    
  17. 17. Double­buffering – the big picture    
  18. 18. Double­buffering with MFC  1. SPU queues MFC GET to fill buffer #1  2. SPU queues MFC GET to fill buffer #2  3. SPU waits for buffer #1 to finish filling  4. SPU processes buffer #1  5. SPU queues MFC PUT back content of buffer #1  6. SPU queues MFC GETB to refill buffer #1  7. SPU waits for buffer #2 to finish filling  8. SPU processes buffer #2 (...)    
  19. 19. Some resources  Cell BE Programming Tutorial (ibm.com 190 pages)  IBM developerworks short programming tutorials   Search for articles by Jonathan Barlett  Barcelona Supercomputing Center (software)  http://www.bsc.es/projects/deepcomputing/linuxoncell/  PS3 programming workshops (videos)  http://www.cc.gatech.edu/~bader/CellProgramming.html  #ps3dev on freenode    
  20. 20. Thanks, credits, licensing  Most schemas from excellent GFDL 'd tutorial by  Geoff Levand (Sony Corp)  http://www.kernel.org/pub/linux/kernel/people/geoff/cell  Pictures and trade marks belong to their respective  owners (Sony, IBM, Universities, Folding@Home,  PS3GRID, ...)  All remaining work is GFDL    
  21. 21. 7 differences    

×