cilk plus: paralelismo easy level em c

60
globo .com Cilk Plus Paralelismo easy level em C Saturday, July 13, 13

Upload: francisco-souza

Post on 15-Jan-2015

524 views

Category:

Technology


1 download

DESCRIPTION

Palestra apresentada no TDC Sampa 2013. Códigos de exemplo e referências: https://github.com/fsouza/tdc_cilk_plus

TRANSCRIPT

Page 1: Cilk Plus: Paralelismo easy level em C

globo.com Cilk PlusParalelismo easy level em C

Saturday, July 13, 13

Page 2: Cilk Plus: Paralelismo easy level em C

Por que?

Saturday, July 13, 13

Page 3: Cilk Plus: Paralelismo easy level em C

The free lunch is over

Saturday, July 13, 13

Page 4: Cilk Plus: Paralelismo easy level em C

“Most classes of applications have enjoyed free and regular performance gains for several decades, even without releasing new versions or doing anything special...

- Herb Sutter, 2005 ”Saturday, July 13, 13

Page 5: Cilk Plus: Paralelismo easy level em C

Lei de Moore

Saturday, July 13, 13

Page 6: Cilk Plus: Paralelismo easy level em C

Saturday, July 13, 13

Page 7: Cilk Plus: Paralelismo easy level em C

Como?

Saturday, July 13, 13

Page 8: Cilk Plus: Paralelismo easy level em C

Saturday, July 13, 13

Page 9: Cilk Plus: Paralelismo easy level em C

Fork-Join

Message passing

SIMDSaturday, July 13, 13

Page 10: Cilk Plus: Paralelismo easy level em C

Fork-Join

Message passing

SIMDSaturday, July 13, 13

Page 11: Cilk Plus: Paralelismo easy level em C

https://secure.flickr.com/photos/paulscott56/7771883174/

dafuq is Cilk Plus?!Saturday, July 13, 13

Page 12: Cilk Plus: Paralelismo easy level em C

Cilk Plus‣ Fruto de 15+ anos de trabalho no MIT‣ Extensão da linguagem C

‣ Especificação aberta‣ Comercializado pela Intel‣ Disponível em compiladores open source

Saturday, July 13, 13

Page 13: Cilk Plus: Paralelismo easy level em C

Cilk++

Saturday, July 13, 13

Page 14: Cilk Plus: Paralelismo easy level em C

Cilk++

Saturday, July 13, 13

Page 15: Cilk Plus: Paralelismo easy level em C

Saturday, July 13, 13

Page 16: Cilk Plus: Paralelismo easy level em C

https://secure.flickr.com/photos/rainiernavidad/2679301542/

Saturday, July 13, 13

Page 17: Cilk Plus: Paralelismo easy level em C

1 Task parallelism

Saturday, July 13, 13

Page 18: Cilk Plus: Paralelismo easy level em C

Palavras chave‣ cilk_spawn‣ cilk_sync‣ cilk_for

Saturday, July 13, 13

Page 19: Cilk Plus: Paralelismo easy level em C

spawn + syncintfib(int  n){    if(n  <  2)  {        return  n;    }    int  x,  y;    x  =  cilk_spawn  fib(n-­‐1);    y  =  fib(n-­‐2);    cilk_sync;    return  x  +  y;}

Saturday, July 13, 13

Page 20: Cilk Plus: Paralelismo easy level em C

spawn + syncintfib(int  n){    if(n  <  2)  {        return  n;    }    int  x,  y;    x  =  cilk_spawn  fib(n-­‐1);    y  =  fib(n-­‐2);    cilk_sync;    return  x  +  y;}

           cilk_spawn

   cilk_sync;

Saturday, July 13, 13

Page 21: Cilk Plus: Paralelismo easy level em C

spawn + sync

int  i;for(i  =  0;  i  <  N;  i++)  {   cilk_spawn  do_something(i);}cilk_sync;

Saturday, July 13, 13

Page 22: Cilk Plus: Paralelismo easy level em C

cilk_for

int  i;cilk_for(i  =  0;  i  <  N;  i++)  {   do_something(i);}

Saturday, July 13, 13

Page 23: Cilk Plus: Paralelismo easy level em C

Reducers

long  result  =  0;cilk_for(i  =  0;  i  <  N;  i++)  {   result  +=  values[i]  *  2;}printf("%ld\n",  result);

Saturday, July 13, 13

Page 24: Cilk Plus: Paralelismo easy level em C

Reducers

long  result  =  0;cilk_for(i  =  0;  i  <  N;  i++)  {   result  +=  values[i]  *  2;}printf("%ld\n",  result);

%  ./double_sum140735583143608%  ./double_sum140735391864504%  ./double_sum140735461627576%  ./double_sum140735348451000

Saturday, July 13, 13

Page 25: Cilk Plus: Paralelismo easy level em C

Reducers

long  result  =  0;cilk_for(i  =  0;  i  <  N;  i++)  {     result  +=  values[i]  *  2;}printf("%ld\n",  result);

Saturday, July 13, 13

Page 26: Cilk Plus: Paralelismo easy level em C

Reducers

long  result  =  0;cilk_for(i  =  0;  i  <  N;  i++)  {     mtx_lock(&m);

  mtx_unlock(&m);   result  +=  values[i]  *  2;

}printf("%ld\n",  result);

Saturday, July 13, 13

Page 27: Cilk Plus: Paralelismo easy level em C

https://secure.flickr.com/photos/jenko2k5/7165647503/

#FAIL

Saturday, July 13, 13

Page 28: Cilk Plus: Paralelismo easy level em C

Reducers

CILK_C_REDUCER_OPADD(result,  long,  0);cilk_for(i  =  0;  i  <  N;  i++)  {   REDUCER_VIEW(result)  +=  values[i]  *  2;}printf("%ld\n",  result.value);

Saturday, July 13, 13

Page 29: Cilk Plus: Paralelismo easy level em C

Reducers

cilk::reducer_opadd<long>  result;cilk_for(int  i  =  0;  i  <  N;  i++)  {   result  +=  values[i]  *  2;}printf("%ld\n",  result.get_value());

Saturday, July 13, 13

Page 30: Cilk Plus: Paralelismo easy level em C

Reducers disponíveis‣ reducer_max‣ reducer_max_index‣ reducer_min‣ reducer_min_index‣ reducer_opand‣ reducer_opor‣ reducer_opxor

Saturday, July 13, 13

Page 31: Cilk Plus: Paralelismo easy level em C

2 Data parallelism

Saturday, July 13, 13

Page 32: Cilk Plus: Paralelismo easy level em C

Thread parallelism

Saturday, July 13, 13

Page 33: Cilk Plus: Paralelismo easy level em C

Vector Parallelism

Saturday, July 13, 13

Page 34: Cilk Plus: Paralelismo easy level em C

Vector Parallelismvoidmultiply(int  *a,  int  *b,  int  *c,  int  n){   int  i;   for(i  =  0;  i  <  n;  i++)  {     c[i]  =  a[i]  *  b[i];   }}

Saturday, July 13, 13

Page 35: Cilk Plus: Paralelismo easy level em C

Vector Parallelismvoidmultiply(int  *a,  int  *b,  int  *c,  int  n){   int  i;   __m128i  *pa,  *pb,  pc;   for(i  =  0;  i  <  n;  i  +=  4)  {     pa  =  (__m128i  *)&a[i];     pb  =  (__m128i  *)&b[i];     pc  =  _mm_mullo_epi32(*pa,  *pb);     memcpy(&c[i],  &pc,  4*sizeof(int));   }}

Saturday, July 13, 13

Page 36: Cilk Plus: Paralelismo easy level em C

Vector Parallelismvoidmultiply(int  *a,  int  *b,  int  *c,  int  n){   int  i;   for(i  =  0;  i  <  n;  i++)  {     c[i]  =  a[i]  *  b[i];   }}

Saturday, July 13, 13

Page 37: Cilk Plus: Paralelismo easy level em C

Vector Parallelismvoidmultiply(int  *a,  int  *b,  int  *c,  int  n){   int  i;

  for(i  =  0;  i  <  n;  i++)  {     c[i]  =  a[i]  *  b[i];   }}

#pragma  simd

Saturday, July 13, 13

Page 38: Cilk Plus: Paralelismo easy level em C

#pragma simd

long  result  =  0;#pragma  simd  reduction(+:result)for(i  =  0;  i  <  N;  i++)  {   result  +=  values[i]  *  2;}

Saturday, July 13, 13

Page 39: Cilk Plus: Paralelismo easy level em C

#pragma simd‣ private‣ firstprivate‣ lastprivate‣ vectorlength‣ vectorlengthfor‣ linear

Saturday, July 13, 13

Page 40: Cilk Plus: Paralelismo easy level em C

#pragma simdvoidmultiply(int  *a,  int  *b,  int  *c,  int  n){   int  i;#pragma  simd   for(i  =  0;  i  <  n;  i++)  {     c[i]  =  multi(a[i],  b[i]);   }}

Saturday, July 13, 13

Page 41: Cilk Plus: Paralelismo easy level em C

#pragma simdvoidmultiply(int  *a,  int  *b,  int  *c,  int  n){   int  i;#pragma  simd   for(i  =  0;  i  <  n;  i++)  {     c[i]  =  multi(a[i],  b[i]);   }}

Saturday, July 13, 13

Page 42: Cilk Plus: Paralelismo easy level em C

Elemental functions

__declspec(vector)  intmulti(int  x,  int  y){   return  x  *  y;}

Saturday, July 13, 13

Page 43: Cilk Plus: Paralelismo easy level em C

FortranSaturday, July 13, 13

Page 44: Cilk Plus: Paralelismo easy level em C

SAXPY

subroutine  saxpy(x,  y,  a,  n)      integer,  intent(in)  ::  n      real(kind=4),  dimension(n),  intent(in)  ::  x      real(kind=4),  dimension(n),  intent(inout)  ::  y      real(kind=4),  intent(in)  ::  a

end  subroutine      y  =  y  +  a*x

Saturday, July 13, 13

Page 45: Cilk Plus: Paralelismo easy level em C

SAXPY

subroutine  saxpy(x,  y,  a,  n)      integer,  intent(in)  ::  n      real(kind=4),  dimension(n),  intent(in)  ::  x      real(kind=4),  dimension(n),  intent(inout)  ::  y      real(kind=4),  intent(in)  ::  a

end  subroutine

     y  =  y  +  a*x

Saturday, July 13, 13

Page 46: Cilk Plus: Paralelismo easy level em C

Array Notation

voidsaxpy(float  *x,  float  *y,  float  a,  int  n){   y[0:n]  +=  a  *  x[0:n];}

Saturday, July 13, 13

Page 47: Cilk Plus: Paralelismo easy level em C

Array Notationfloatmultiply(float  a,  float  b){   return  a  *  b;}

voidsaxpy(float  *x,  float  *y,  float  a,  int  n){   y[0:n]  +=  multiply(a,  x[0:n]);}

Saturday, July 13, 13

Page 48: Cilk Plus: Paralelismo easy level em C

Array Notation

array[first:length:stride]

Saturday, July 13, 13

Page 49: Cilk Plus: Paralelismo easy level em C

Array Notation

array[first:length:stride]length

Saturday, July 13, 13

Page 50: Cilk Plus: Paralelismo easy level em C

Qual usar?

Saturday, July 13, 13

Page 51: Cilk Plus: Paralelismo easy level em C

Qual usar?

%  clang  -­‐Wall  -­‐o  pragma  pragma.cpragma.c:7:9:  warning:  unknown  pragma  ignored  [-­‐Wunknown-­‐pragmas]#pragma  simd                ^1  warning  generated.

Saturday, July 13, 13

Page 52: Cilk Plus: Paralelismo easy level em C

Qual usar?

%  clang  -­‐Wall  -­‐o  pragma  pragma.cpragma.c:7:9:  warning:  unknown  pragma  ignored  [-­‐Wunknown-­‐pragmas]#pragma  simd                ^1  warning  generated.

%  clang  -­‐o  array  array.carray.c:6:5:  error:  expected  ']'                c[0:n]  =  a[0:n]  *  b[0:n];                      ^array.c:6:3:  note:  to  match  this  '['                c[0:n]  =  a[0:n]  *  b[0:n];                  ^array.c:6:14:  error:  expected  ']'                c[0:n]  =  a[0:n]  *  b[0:n];                                        ^array.c:6:12:  note:  to  match  this  '['                c[0:n]  =  a[0:n]  *  b[0:n];                                    ^array.c:6:23:  error:  expected  ']'                c[0:n]  =  a[0:n]  *  b[0:n];                                                          ^array.c:6:21:  note:  to  match  this  '['                c[0:n]  =  a[0:n]  *  b[0:n];                                                      ^3  errors  generated.

Saturday, July 13, 13

Page 53: Cilk Plus: Paralelismo easy level em C

Cilk Plus SDK

Saturday, July 13, 13

Page 54: Cilk Plus: Paralelismo easy level em C

Ferramentas‣ Intel Cilk Screen race detector‣ Intel Cilk View scalability analyzer

Saturday, July 13, 13

Page 55: Cilk Plus: Paralelismo easy level em C

Compiladores

Saturday, July 13, 13

Page 56: Cilk Plus: Paralelismo easy level em C

icc‣ Suporte completo, nativo.

‣ http://software.intel.com/en-us/intel-cilk-plus

%  icc  -­‐o  source  source.c

Saturday, July 13, 13

Page 57: Cilk Plus: Paralelismo easy level em C

gcc‣ Suporte completo em uma branch‣ [WIP] merge com o trunk para GCC 4.9

‣ http://gcc.gnu.org/wiki/cilkplus-merge

%  gcc  -­‐o  source  -­‐lcilkrts  -­‐ldl  source.c

Saturday, July 13, 13

Page 58: Cilk Plus: Paralelismo easy level em C

clang‣ WIP‣ Suporte parcial‣ cilk_spawn‣ cilk_sync‣ cilk_for

‣ http://cilkplus.github.com/

%  clang  -­‐o  source  -­‐fcilkplus  source.c

Saturday, July 13, 13

Page 60: Cilk Plus: Paralelismo easy level em C

Cilk PlusParalelismo easy level em C

Francisco [email protected]@franciscosouzaslideshare.net/franciscosouza

globo.comSaturday, July 13, 13