a proposal for user-defined reductions in openmp · a proposal for user-defined reductions in...

36
A proposal for User-Defined Reductions in OpenMP A. Duran 1 , R. Ferrer 1 , M. Klemm 2 , B. de Supinski 3 , E. Ayguadé 1 1 BSC, 2 Intel, 3 LLNL June 16th 2010

Upload: trinhcong

Post on 11-Apr-2019

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

A proposal for User-Defined Reductions in OpenMP

A. Duran1, R. Ferrer1, M. Klemm2, B. de Supinski3, E. Ayguadé1

1BSC, 2Intel, 3LLNL

June 16th 2010

Page 2: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 2 / 28

Page 3: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 3 / 28

Page 4: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Reductions in OpenMP 3.0

Current OpenMP supports reduction:basic scalar typessimple arithmetic operators (+,-,*,&,...)array reductions (Fortran only)min and max operators (Fortran only)

Users with other reductions must find their way manually:Using critical

Using atomic (when possible)Adding complex code to implement the reduction

Duran et al. () UDRs in OpenMP June 16th 2010 4 / 28

Page 5: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Reductions in OpenMP 3.0

Current OpenMP supports reduction:basic scalar typessimple arithmetic operators (+,-,*,&,...)array reductions (Fortran only)min and max operators (Fortran only)

Users with other reductions must find their way manually:Using critical

Using atomic (when possible)Adding complex code to implement the reduction

Duran et al. () UDRs in OpenMP June 16th 2010 4 / 28

Page 6: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Reductions by hand

1 complex_t complex_mul ( complex_t a , complex_t b ) ;2

3 void example ( complex_t ∗array , s i z e _ t N) {4 complex_t prd = { 1 . 0 , 0 . 0 } ;5

6

7

8

9 #pragma omp parallel reduction ( prd )10 {11

12 #pragma omp for13 for ( s i z e _ t i = 0 ; i < N; i ++)14 prd = complex_mul ( prd , a r ray [ i ] ) ;15

16 }17

18

19 }

Duran et al. () UDRs in OpenMP June 16th 2010 5 / 28

Page 7: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Reductions by hand

1 complex_t complex_mul ( complex_t a , complex_t b ) ;2

3 void example ( complex_t ∗array , s i z e _ t N) {4 complex_t prd = { 1 . 0 , 0 . 0 } ;5

6 i n t nthreads = omp_get_max_threads ( ) ;7 complex_t par t_prd [ nthreads ] ;8

9 #pragma omp parallel shared ( par t_prd ) private ( prd )10 {11 prd = { 1 . 0 , 0 . 0 } ;12 #pragma omp for13 for ( s i z e _ t i = 0 ; i < N; i ++)14 prd = complex_mul ( prd , a r ray [ i ] ) ;15 par t_prd [omp_get_thread_num ( ) ] = prd ;16 }17

18 for ( i n t t h r = 0 ; t h r < nthreads ; t h r ++)19 prd = complex_mul ( prd , par t_prd [ t h r ] ) ;20

21 }

Duran et al. () UDRs in OpenMP June 16th 2010 5 / 28

Page 8: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Not goodDrawbacks

More complex user codeError proneDoesn’t benefit from implementation improvements

SolutionAdd user-defined reductions to OpenMP

Duran et al. () UDRs in OpenMP June 16th 2010 6 / 28

Page 9: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

Not goodDrawbacks

More complex user codeError proneDoesn’t benefit from implementation improvements

SolutionAdd user-defined reductions to OpenMP

Duran et al. () UDRs in OpenMP June 16th 2010 6 / 28

Page 10: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

User-defined reductions

Allow the user to inform OpenMP about new reductions by providing:A typeAn operation over that typeThe identity value for that operation and type

Presented to the OpenMP language committee (still on discussion)

Duran et al. () UDRs in OpenMP June 16th 2010 7 / 28

Page 11: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Motivation

User-defined reductions

Allow the user to inform OpenMP about new reductions by providing:A typeAn operation over that typeThe identity value for that operation and type

Presented to the OpenMP language committee (still on discussion)

Duran et al. () UDRs in OpenMP June 16th 2010 7 / 28

Page 12: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

UDR Design rationale

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 8 / 28

Page 13: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

UDR Design rationale

Driving design goals

follow OpenMP directive-based philosophysupport all OpenMP base languages

but mantain a common syntax as much as possible

follow a declaration/usage patternAllow code re-useAllow efficient implementation

require associativity and commutativity

Duran et al. () UDRs in OpenMP June 16th 2010 9 / 28

Page 14: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Declaring UDRs

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 10 / 28

Page 15: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Declaring UDRs

Declaring an UDRSyntax

C:1 #pragma omp declare reduction ( operator− l i s t : type ) [ c lause ]

C++:1 #pragma omp declare reduction ( [ template <template−params >] operator−l i s t : type−l i s t ) [ c lause ]

Fortran:1 !$omp declare reduction ( operator− l i s t : typename ) [ c lause ]

where clause is:1 identity ( expression | brace−i n i t i a l i z e r C/C++ | constructor [ ( argument−l i s t ) ] C++ )

Duran et al. () UDRs in OpenMP June 16th 2010 11 / 28

Page 16: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Declaring UDRs

Example

1 complex_t complex_mul ( complex_t a , complex_t b ) ;2

3 #pragma omp declare reduction ( complex_mul : complex_t ) \4 identity ( { 1 . 0 , 0 . 0 } )5

6 void example ( complex_t ∗array , s i z e _ t N) {7 complex_t prd = { 1 . 0 , 0 . 0 } ;8

9 #pragma omp parallel for reduction ( complex_mul : prd )10 for ( s i z e _ t i = 0 ; i < N; i ++)11 prd = complex_mul ( prd , a r ray [ i ] ) ;12

13 }

Duran et al. () UDRs in OpenMP June 16th 2010 12 / 28

Page 17: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Declaring UDRs

Operator requisites

binary operators with compatible arguments with UDR typeReturn value either by return or parameter (*,&)

Return value priority: function return, left parameter, right parameter

Allow const and references(C++) Unary member functions

specified by prepending a dot to the operator name

(C++) valid overloaded operatorsassociativecommutativeavailable using base language “symbol“ lookup

both at declaration and usage

Duran et al. () UDRs in OpenMP June 16th 2010 13 / 28

Page 18: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Declaring UDRs

Identity value

By default:C/Fortran Zero initialization

C++ C++ rules for value-initializationCan be overrided by the identity clause

The identity expression must evaluate always to the same value

An implementation can evaluate it one or more times

Duran et al. () UDRs in OpenMP June 16th 2010 14 / 28

Page 19: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Array reductions

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 15 / 28

Page 20: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Array reductions

Array UDRs

DeclarationTypes can be prepended with [] that indicate that is going to be anarray UDR

One [] per dimensionDimension size is not fix at declaration

Operators can have additional integer parameters to get the actualsize

UsageArray UDRs can be applied to variables of:

Array typesPointer to array types

allows to ”recover” arrays through function calls

Support for VLA (pointers to) arrays is limited to C.

Duran et al. () UDRs in OpenMP June 16th 2010 16 / 28

Page 21: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Array reductions

Example

1 const i n t N = 10;2 void vector_add ( i n t ∗A, i n t ∗B, i n t n ) ;3

4 #pragma omp declare reduction ( vector_add : i n t [ ] )5

6 void foo ( i n t ∗ a , i n t ∗ b , i n t n )7 {8 i n t v1 [N ] ;9 i n t (∗ v2 ) [N] = ( i n t (∗ ) [N ] ) a ;

10 i n t (∗ v3 ) [ n ] = ( i n t (∗ ) [ n ] ) b ; / / VLA ; Only v a l i d i n C11

12 #pragma omp for reduction ( vector_add : v1 , v2 , v3 )13 for ( . . . ) { . . . }14 }

Duran et al. () UDRs in OpenMP June 16th 2010 17 / 28

Page 22: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 18 / 28

Page 23: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Constructed indentities

The special constructor keyword can be used in the identityclause

Private copies will be initialized with a constructor instead ofby-assignment

1 #pragma omp declare reduction ( ∗ : Complex ) identity (constructor ( 1 . 0 , 0 . 0 ) )

Duran et al. () UDRs in OpenMP June 16th 2010 19 / 28

Page 24: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Constructed indentities

The special constructor keyword can be used in the identityclause

Private copies will be initialized with a constructor instead ofby-assignment

1 #pragma omp declare reduction ( ∗ : Complex ) identity (constructor ( 1 . 0 , 0 . 0 ) )

Duran et al. () UDRs in OpenMP June 16th 2010 19 / 28

Page 25: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Inheritance support

IdeaSupport the C++ philosophy of allowing to use methods defined overbase classes with derived classes

UDR of base classes can be used for derived classesOnly if it does not create object slicing

operator parameters must be pointers or references

Duran et al. () UDRs in OpenMP June 16th 2010 20 / 28

Page 26: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Inheritance support

IdeaSupport the C++ philosophy of allowing to use methods defined overbase classes with derived classes

UDR of base classes can be used for derived classesOnly if it does not create object slicing

operator parameters must be pointers or references

Duran et al. () UDRs in OpenMP June 16th 2010 20 / 28

Page 27: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Template UDRs

Allows to declare an UDR on all (or partial) instantiations of templatetype

1 #pragma omp declare \2 reduction ( template <class T> std : : l i s t <T > : : merge : s td : : l i s t <T> )3

4 void foo ( )5 {6 s td : : l i s t < int > l i ;7 s td : : l i s t < f loa t > l f ;8

9 #pragma omp parallel for reduction ( s td : : l i s t < int > : : merge : l i )10 reduction ( s td : : l i s t < f loa t > : : merge : l f )11 for ( . . . ) { . . . }12 }

Duran et al. () UDRs in OpenMP June 16th 2010 21 / 28

Page 28: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Template UDRs

Allows to declare an UDR on all (or partial) instantiations of templatetype

1 #pragma omp declare \2 reduction ( template <class T> std : : l i s t <T > : : merge : s td : : l i s t <T> )3

4 void foo ( )5 {6 s td : : l i s t < int > l i ;7 s td : : l i s t < f loa t > l f ;8

9 #pragma omp parallel for reduction ( s td : : l i s t < int > : : merge : l i )10 reduction ( s td : : l i s t < f loa t > : : merge : l f )11 for ( . . . ) { . . . }12 }

Duran et al. () UDRs in OpenMP June 16th 2010 21 / 28

Page 29: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Dot syntax

Simplify qualification for C++ by doing auto-qualification based on theUDR type

1 /∗ #pragma omp dec lare \2 reduc t ion ( template <c lass T> . merge : s td : : l i s t <T> ) ∗ /3

4 #pragma omp declare \5 reduction ( . merge : s td : : l i s t < int > , s td : : l i s t < f loa t > )6

7 void foo ( )8 {9 s td : : l i s t < int > l i ;

10 s td : : l i s t < f loa t > l f ;11

12 #pragma omp parallel for reduction ( . merge : l i , l f )13 for ( . . . ) { . . . }14 }

Duran et al. () UDRs in OpenMP June 16th 2010 22 / 28

Page 30: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

C++ specific extensions

Dot syntax

Simplify qualification for C++ by doing auto-qualification based on theUDR type

1 /∗ #pragma omp dec lare \2 reduc t ion ( template <c lass T> . merge : s td : : l i s t <T> ) ∗ /3

4 #pragma omp declare \5 reduction ( . merge : s td : : l i s t < int > , s td : : l i s t < f loa t > )6

7 void foo ( )8 {9 s td : : l i s t < int > l i ;

10 s td : : l i s t < f loa t > l f ;11

12 #pragma omp parallel for reduction ( . merge : l i , l f )13 for ( . . . ) { . . . }14 }

Duran et al. () UDRs in OpenMP June 16th 2010 22 / 28

Page 31: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Conclusions

Outline

1 Motivation

2 UDR Design rationale

3 Declaring UDRs

4 Array reductions

5 C++ specific extensions

6 Conclusions

Duran et al. () UDRs in OpenMP June 16th 2010 23 / 28

Page 32: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Conclusions

Conclusions

Proposal allows users to extend OpenMP with their own reductionoperations

aggregated typesarraystemplate types

Still in discussion for OpenMP 3.1We’re looking for user codes

Duran et al. () UDRs in OpenMP June 16th 2010 24 / 28

Page 33: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Conclusions

The End

Thanks for your attention!

Duran et al. () UDRs in OpenMP June 16th 2010 25 / 28

Page 34: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Conclusions

Min/Max

1 #pragma omp declare \2 reduction ( template <typename T> std : : min : T ) \3 identity ( s td : : numer ic_ l im i ts <T > : : max ( ) )4 #pragma omp declare \5 reduction ( template <typename T> std : : max : T ) \6 identity ( s td : : numer ic_ l im i ts <_T > : : min ( ) )

Duran et al. () UDRs in OpenMP June 16th 2010 26 / 28

Page 35: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Conclusions

Some example

1 i n l i n e void poin tMin ( Po in t ∗a , Po in t ∗b )2 {3 i f ( a−>x < b−>x ) a−>x = b−>x ;4 i f ( a−>y < b−>y ) a−>y = b−>y ;5 }67 i n l i n e void pointMax ( Po in t ∗a , Po in t ∗b )8 {9 i f ( a−>x > b−>x ) a−>x = b−>x ;

10 i f ( a−>y > b−>y ) a−>y = b−>y ;11 }1213 #pragma omp declare reduction ( pointMax : Po in t ∗)14 #pragma omp declare reduction ( po in tMin : Po in t ∗)1516 void f indMinMax ( Po in tVec tor po in ts , index_ t n , Po in t∗ minPoint ,17 Po in t∗ maxPoint )18 {1920 #pragma omp parallel for schedule ( s t a t i c ) \21 reduction ( po in tMin : minPoint ) reduction ( pointMax : maxPoint )22 for ( index_ t i = 1 ; i < n ; i ++) {23 i f ( po in t s [ i ] . x < min . x ) minPoint−>x = po in t s [ i ] . x ;24 i f ( po in t s [ i ] . y < min . y ) minPoint−>y = po in t s [ i ] . y ;25 i f ( po in t s [ i ] . x > max . x ) maxPoint−>x = po in t s [ i ] . x ;26 i f ( po in t s [ i ] . y > max . y ) maxPoint−>y = po in t s [ i ] . y ;27 }28 }29 }

Duran et al. () UDRs in OpenMP June 16th 2010 27 / 28

Page 36: A proposal for User-Defined Reductions in OpenMP · A proposal for User-Defined Reductions in OpenMP ... 1BSC, 2Intel, 3LLNL June 16th 2010. Outline 1 Motivation 2 UDR Design rationale

Conclusions

Gromacs1 void array_rvec_add ( rvec ∗a , rvec ∗b , i n t n )2 {3 for ( i n t i = 0 ; i < n ; i ++) {4 a [ i ] . xx += b [ i ] . xx ;5 a [ i ] . yy += b [ i ] . yy ;6 a [ i ] . zz += b [ i ] . zz ;7 }8 }9

10 void rea l_array_add ( r e a l ∗a , r e a l ∗b , i n t n )11 {12 for ( i n t i = 0 ; i < n ; i ++) a [ i ] += b [ i ] ;13 }1415 #pragma omp declare reduction ( array_rvec_add : rvec [ ] ) identity ( { 0 . 0 , 0 . 0 , 0 . 0 } )16 #pragma omp declare reduction ( ar ray_real_add : r e a l [ ] ) identity ( 0 . 0 )1718 . . .19 neg2 = mdatoms−>nenergrp∗mdatoms−>nenergrp ;2021 rvec (∗ pf ) [ mdatoms−>nr ] = ( rvec (∗ ) [ mdatoms−>nr ] ) f ;22 rvec (∗ p f s h i f t ) [ SHIFTS ] = ( rvec (∗ ) [ SHIFTS ] ) p f s h i f t ;23 r e a l (∗pegcoul ) [ neg2 ] = ( r e a l (∗ ) [ neg2 ] ) egcoul ;24 r e a l (∗pegnb ) [ neg2 ] = ( r e a l (∗ ) [ neg2 ] ) egnb ;2526 #pragma omp parallel for reduction ( array_rvec_add : pf , p f s h i f t ) \27 reduction ( ar ray_real_add : pegcoul , pegnb )28 for ( b=0; b<nb ; b++)29 f u n c t i o n ( p f s h i f t , pf , pegcoul , pegnb ) ;3031 . . .

Duran et al. () UDRs in OpenMP June 16th 2010 28 / 28