Esempio n. 1
0
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);
  }
}
Esempio n. 2
0
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 ;
}
Esempio n. 3
0
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 );
}
Esempio n. 4
0
inline
int Set_lock_size( int n ) { return TPI_Set_lock_size( n ); }