void tdaxpby( unsigned n , double a , const double * x , double b , double * y , int block ) { int p_size ; TPI_Size( & p_size ); { unsigned *tmp = malloc( p_size ); struct TaskXY data = { a , b , x , y , n , tmp }; int i ; for ( i = 0 ; i < p_size ; ++i ) { tmp[i] = i ; } if ( 0 < block ) { TPI_Run( & task_axpby_work_block , & data , 0 ); } else if ( block < 0 ) { TPI_Set_lock_size( p_size ); TPI_Run( & task_axpby_work_steal , & data , 0 ); } else { TPI_Run( & task_axpby_work , & data , 0 ); } free(tmp); } }
void txddot( double * s , unsigned n , const double * x , const double * y ) { int p_size ; if ( ! TPI_Size( & p_size ) ) { double* tmp; const int ntmp = 4 * p_size ; tmp = malloc(ntmp * sizeof(double)); { struct TaskXY data = { tmp , x , y , n , BLOCKING_SIZE }; int i ; for ( i = 0 ; i < ntmp ; ++i ) { tmp[i] = 0 ; } if ( data.block ) { TPI_Run( & task_xddot_xy_work_blocking , & data , 0 ); } else { TPI_Run( & task_xddot_xy_work , & data , 0 ); } for ( i = 0 ; i < p_size ; ++i ) { xdsum_add_dsum( s , tmp + 4 * i ); } } free(tmp); } }
void tddot( double * s , unsigned n , const double * x , const double * y ) { int p_size ; if ( ! TPI_Size( & p_size ) ) { double* tmp = malloc( p_size * sizeof(double)); struct TaskXY data = { tmp , x , y , n , BLOCKING_SIZE }; int i ; for ( i = 0 ; i < p_size ; ++i ) { tmp[i] = 0 ; } if ( data.block ) { TPI_Run( & task_ddot_xy_work_blocking , & data , 0 ); } else { TPI_Run( & task_ddot_xy_work , & data , 0 ); } for ( i = 1 ; i < p_size ; ++i ) { tmp[0] += tmp[i] ; } *s = tmp[0] ; free(tmp); } }
inline int Size( int & number_allocated ) { return TPI_Size( & number_allocated ); }