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); } }
int TPI_Finalize() { ThreadPool * const pool = local_thread_pool(); int result = ! pool ? TPI_ERROR_ACTIVE : 0 ; if ( ! result ) { --( pool->m_number_threads ); if ( 0 < pool->m_number_threads ) { pthread_mutex_lock( & pool->m_pool_lock ); pool->m_work_end_count = -1 ; /* Trigger to terminate */ pthread_mutex_lock( & pool->m_pool_lock_run ); pthread_cond_broadcast( & pool->m_pool_cond_run ); pthread_mutex_unlock( & pool->m_pool_lock_run ); pthread_cond_wait( & pool->m_pool_cond , & pool->m_pool_lock ); pthread_mutex_unlock( & pool->m_pool_lock ); } pool->m_work_size = 0 ; pool->m_work_begin_count = 0 ; pool->m_work_end_count = 0 ; pool->m_number_threads = 0 ; TPI_Set_lock_size( 0 ); } return result ; }
void txddot1( double * s , unsigned n , const double * x ) { struct TaskX data ; data.x_sum = s ; data.x_beg = x ; data.number = n ; TPI_Set_lock_size( 1 ); TPI_Run( & task_xddot_x_work , & data , 0 ); }
inline int Set_lock_size( int n ) { return TPI_Set_lock_size( n ); }