Пример #1
0
/*-------------------------------------------------------------------*/
DLL_EXPORT void ptt_trace_init( int n, int init )
{
    if (n > 0)
        pttrace = calloc( n, PTT_TRACE_SIZE );
    else
        pttrace = NULL;

    pttracen = pttrace ? n : 0;
    pttracex = 0;

    if (init)       /* First time? */
    {
        int rc;
        MATTR attr;
        if ((rc = hthread_mutexattr_init( &attr )) != 0)
            BREAK_INTO_DEBUGGER();
        if ((rc = hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_DEFAULT )) != 0)
            BREAK_INTO_DEBUGGER();
        if ((rc = hthread_mutex_init( &pttlock, &attr )) != 0)
            BREAK_INTO_DEBUGGER();
        if ((rc = hthread_mutex_init( &ptttolock, &attr )) != 0)
            BREAK_INTO_DEBUGGER();
        if ((rc = hthread_cond_init( &ptttocond )) != 0)
            BREAK_INTO_DEBUGGER();
        if ((rc = hthread_mutexattr_destroy( &attr )) != 0)
            BREAK_INTO_DEBUGGER();
        pttnolock = 0;
        pttnotod  = 0;
        pttnowrap = 0;
        pttto     = 0;
        ptttotid  = 0;
    }
}
Пример #2
0
void run_B (int use_hw, int num_load_threads, thread_arg_t * arg)
{
    unsigned int i=0;
    hthread_t measure_tidA, measure_tidB;
    hthread_t tids[num_load_threads];
    hthread_mutexattr_t block_attr;
    hthread_mutexattr_t data_attr;

    // Print banner
    show_banner(num_load_threads);

    // Initialize thread argument fields
    //  * Setup mutexes
    //  * Initialize counter
    block_attr.num = 0;
    block_attr.type = HTHREAD_MUTEX_DEFAULT;
    data_attr.num = 1;
    data_attr.type = HTHREAD_MUTEX_DEFAULT;
    hthread_mutex_init(&arg->block_mutex, &block_attr);
    hthread_mutex_init(&arg->data_mutex, &data_attr);
    arg->counter = 0;

    // Create measurement thread A
    hthread_create(&measure_tidA, NULL, measureThread, (void*)arg);  

    // Create measurement thread B
    hthread_create(&measure_tidB, NULL, testThreadWithMeasurement, (void*)arg);  
    
    // Create all of the load threads
    dbg_printf("Creating load threads...\n");
    for (i = 0; i < num_load_threads; i++)
    {
        // Create load thread
        hthread_create(&tids[i], NULL, testThread, (void*)arg);  
    }

    // Make sure that measurement thread A runs
    hthread_join(measure_tidA,NULL);

    // Make sure that measurement thread B runs
    hthread_join(measure_tidB,NULL);

    // Wait for all load threads to complete
    for (i = 0; i < num_load_threads; i++)
    {
        // Join on load thread
        hthread_join(tids[i],NULL); 
    }

    // Extract turn-around results
    // Turn-around = unlock_start to measure_lock_stop 
    arg->measure_lock_check = calc_timediff_us(arg->unlock_start, arg->measure_lock_stop);

    return;
}
Пример #3
0
argument* create_args(void)
{
    argument *arg;
    hthread_condattr_t *attr1;
    hthread_condattr_t *attr2;

    attr1   = (hthread_condattr_t*)malloc(sizeof(hthread_condattr_t));
    attr2   = (hthread_condattr_t*)malloc(sizeof(hthread_condattr_t));
    
    arg                 = (argument*)malloc( sizeof(argument) );
    arg->cond_notempty  = (hthread_cond_t*)malloc( sizeof(hthread_cond_t) );
    arg->cond_notfull   = (hthread_cond_t*)malloc( sizeof(hthread_cond_t) );
    arg->mutex          = (hthread_mutex_t*)malloc( sizeof(hthread_mutex_t) );

    hthread_condattr_init( attr1 );
    hthread_condattr_init( attr2 );

    hthread_condattr_setnum( attr1, 0 );
    hthread_condattr_setnum( attr2, 1 );

    hthread_cond_init( arg->cond_notempty, attr1 );
    hthread_cond_init( arg->cond_notfull, attr2 );
    hthread_mutex_init( arg->mutex, NULL );
    
    hthread_condattr_destroy( attr1 );
    hthread_condattr_destroy( attr2 );

    free( attr1 );
    free( attr2 );

    arg->jobs = 0;
    return arg;
}
Пример #4
0
int main() {
	hthread_t test_thread;
	hthread_attr_t test_attr;
	hthread_mutex_t mutex;
	int arg, retVal;
	
	//Print the name of the test to the screen
	printf( "Starting test mutex_trylock_2\n" );

	//Set up the arguments for the test
	hthread_mutex_init( &mutex, NULL );
	
	arg = (int) &mutex;
	
	//Initialize RPC
	rpc_setup();
	
	//Run the tests
	hthread_attr_init( &test_attr );
	if ( HARDWARE ) hthread_attr_sethardware( &test_attr, HWTI_ONE_BASEADDR );
	hthread_create( &test_thread, &test_attr, testThread, (void *) arg );
	hthread_join( test_thread, (void *) &retVal );

	if ( HARDWARE ) readHWTStatus( HWTI_ONE_BASEADDR );
	
	//Evaluate the results
	if ( retVal == EXPECTED_RESULT ) {
		printf("Test PASSED\n");
		return PTS_PASS;
	} else {
		printf("Test FAILED [expecting %d, received %d]\n", EXPECTED_RESULT, retVal );
		return PTS_FAIL;
	}	
}
Пример #5
0
int main( int argc, char *argv[] )
{
	hthread_t           tid[ CHILDREN ];
    hthread_mutex_t     mutex;
    hthread_mutexattr_t attr;
    Huint               i;

    hthread_mutexattr_init( &attr );
    hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_FAST_NP );
    hthread_mutexattr_setnum( &attr, 1 );
    hthread_mutex_init( &mutex, &attr );
    
    for( i = 0; i < CHILDREN; i++ )
    {
        hthread_create( &tid[i], NULL, child, &mutex );
    }
    
    for( i = 0; i < CHILDREN; i++ )
    {
   	    hthread_join( tid[i], NULL );
    }

	printf( "--DONE--\n" );
	return 1;
}
Пример #6
0
int main(int argc, char *argv[]) {
    hthread_mutexattr_t mutexAttr;
    hthread_mutex_t     mutex;
	hthread_attr_t      threadAttr;
    hthread_t           thread;
	Huint               arg;
	log_t               log;

    //Initialize Log
	log_create( &log, 1024 );

	//Mutex operations
	printf( "Starting mutex operations\n" );
	hthread_mutexattr_init( &mutexAttr );
	hthread_mutexattr_setnum( &mutexAttr, 0 );
	hthread_mutexattr_getnum( &mutexAttr, &arg );
	hthread_mutexattr_destroy( &mutexAttr );

    hthread_mutex_init(&mutex, NULL);
	hthread_mutex_lock( &mutex );
	hthread_mutex_unlock( &mutex );

	hthread_mutex_trylock( &mutex );
	hthread_mutex_unlock( &mutex );
	hthread_mutex_destroy( &mutex );

    //Condition Variable operations
	/*
	printf( "Starting condition variable operations\n" );
	hthread_condattr_init( &condvarAttr );
	hthread_condattr_setnum( &condvarAttr, 0 );
	hthread_condattr_getnum( &condvarAttr, &arg );
	hthread_condattr_destroy( &condvarAttr );

	hthread_cond_init( &condvar, NULL );
	hthread_mutex_lock( &mutex );
	hthread_cond_wait( &condvar, &mutex );
	hthread_mutex_unlock( &mutex );
	hthread_cond_signal( &condvar );
	hthread_cond_broadcast( &condvar );
	hthread_cond_destroy( &condvar );
	*/

    //Thread operations
	printf( "Starting thread operations\n" );
	hthread_attr_init( &threadAttr );
    hthread_create( &thread, &threadAttr, foo, &log );
	hthread_attr_destroy( &threadAttr );

	hthread_join( thread, NULL );

    printf( " -- End of Program --\n" );
	log_close_ascii( &log );

	return 0;
}
Пример #7
0
void * testThread ( void * arg ) {
	int retVal;
	hthread_mutex_t * mutex = (hthread_mutex_t *) arg;
	
	hthread_mutex_init( mutex, NULL );
	retVal = hthread_mutex_destroy( mutex );
	
	hthread_exit( (void *) retVal );
	return NULL;
}
Пример #8
0
void * testThread ( void * arg ) {
	int retVal;
	hthread_mutex_t * mutex = (hthread_mutex_t *) arg;
	
	//Test that the initialized mutex is not locked
	hthread_mutex_init( mutex, NULL );
	retVal = _mutex_owner( mutex->num );
	
	hthread_exit( (void *) retVal );
	return NULL;
}
Пример #9
0
int main (int argc, char *argv[]) {
	hthread_t thread; //I came up with this name myself
	struct fibonacci fib;
//	log_t log;
    Huint fibArray[FIBMAX];
//	Huint *fibArray;
	Huint i;

	hthread_mutex_init( &hwtiMutex, NULL );
	hthread_mutex_init( &mutex2, NULL );
	hthread_mutex_init( &mutex3, NULL );
	hthread_mutex_init( &mutex4, NULL );
	printf( "Mutex number is %d\n", hwtiMutex.num );
	printf( "Mutex number is %d\n", mutex2.num );
	printf( "Mutex number is %d\n", mutex3.num );
	printf( "Mutex number is %d\n", mutex4.num );

//	log_create( &log, 1024 );
//	log_time( &log );

//	fibArray = malloc( FIBMAX * sizeof ( Huint ) );

	for( i=0; i<FIBMAX; i++ ) {
		fib.fibNum = i;
    
		printf( "Creating Thread for Fibonacci %d\n", i );
		hthread_create(&thread, NULL, findFibonacci, (void*)&fib);
		hthread_join(thread, NULL);
		fibArray[i] = fib.fibVal;
	}

//	log_time( &log );
	for( i=0; i<FIBMAX; i++ ) {
		printf( "Fibonacci %d is %d\n", i, fibArray[i] );
	}
//	log_close_ascii( &log );
//	printf( "\nReview the log file to determine the total time\n" );
	printf( " - done -\n\n" );
	return 1 ;
}
Пример #10
0
/*-------------------------------------------------------------------*/
DLL_EXPORT int  hthread_initialize_rwlock( RWLOCK* plk, const char* name,
                                           const char* location )
{
    int     rc;
    RWATTR  attr1;    /* for primary lock */
    MATTR   attr2;    /* for internal locklock */
    ILOCK*  ilk = hthreads_get_ILOCK( plk, name );

    /* Initialize the requested lock */

    rc = hthread_rwlockattr_init( &attr1 );
    if (rc)
        goto fatal;

    rc = hthread_mutexattr_init( &attr2 );
    if (rc)
        goto fatal;

    rc = hthread_rwlockattr_setpshared( &attr1, HTHREAD_RWLOCK_DEFAULT );
    if (rc)
        goto fatal;

    rc = hthread_mutexattr_settype( &attr2, HTHREAD_MUTEX_DEFAULT );
    if (rc)
        goto fatal;

    rc = hthread_rwlock_init( &ilk->rwlock, &attr1 );
    if (rc)
        goto fatal;

    rc = hthread_mutex_init( &ilk->locklock, &attr2 );
    if (rc)
        goto fatal;

    rc = hthread_rwlockattr_destroy( &attr1 );
    if (rc)
        goto fatal;

    rc = hthread_mutexattr_destroy( &attr2 );
    if (rc)
        goto fatal;

    plk->ilk = ilk;     /* (RWLOCK is now initialized) */
    PTTRACE( "rwlock init", plk, &attr1, location, PTT_MAGIC );
    return 0;

fatal:

    perror( "Fatal error in hthread_initialize_rwlock function" );
    exit(1);
}
Пример #11
0
void setup_structs( prod_struct *prod, sort_struct *sort, cons_struct *cons )
{
    int *data;
    int *ready_prod;
    int *ready_sort;
    int *ready_cons;
    hthread_mutex_t *mutex;
    hthread_cond_t  *start_prod;
    hthread_cond_t  *start_sort;
    hthread_cond_t  *start_cons;

    data        = (int*)malloc( SIZE * sizeof(int) );
    mutex       = (hthread_mutex_t*)malloc( sizeof(hthread_mutex_t) );
    ready_prod  = (int*)malloc( sizeof(int) );
    ready_sort  = (int*)malloc( sizeof(int) );
    ready_cons  = (int*)malloc( sizeof(int) );
    start_prod  = (hthread_cond_t*)malloc( sizeof(hthread_cond_t) );
    start_sort  = (hthread_cond_t*)malloc( sizeof(hthread_cond_t) );
    start_cons  = (hthread_cond_t*)malloc( sizeof(hthread_cond_t) );

    hthread_mutex_init( mutex, NULL );
    hthread_cond_init( start_prod, NULL );
    hthread_cond_init( start_sort, NULL );
    hthread_cond_init( start_cons, NULL );

    prod->mutex     = mutex;
    prod->start     = start_prod;
    prod->finish    = start_sort;
    prod->data      = data;
    prod->size      = SIZE;
    prod->min       = MIN;
    prod->max       = MAX;
    prod->ready     = ready_prod;
    prod->done      = ready_sort;

    sort->mutex     = mutex;
    sort->start     = start_sort;
    sort->finish    = start_cons;
    sort->data      = data;
    sort->size      = SIZE;
    sort->ready     = ready_sort;
    sort->done      = ready_cons;

    cons->mutex     = mutex;
    cons->start     = start_cons;
    cons->finish    = start_prod;
    cons->data      = data;
    cons->size      = SIZE;
    cons->ready     = ready_cons;
    cons->done      = ready_prod;
}
Пример #12
0
/*-------------------------------------------------------------------*/
DLL_EXPORT int  hthread_initialize_lock( LOCK* plk, const char* name,
                                         const char* location )
{
    int     rc;
    MATTR   attr;
    ILOCK*  ilk = hthreads_get_ILOCK( plk, name );

    /* Initialize the requested lock */

    rc = hthread_mutexattr_init( &attr );
    if (rc)
        goto fatal;

    rc = hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_DEFAULT );
    if (rc)
        goto fatal;

    rc = hthread_mutex_init( &ilk->locklock, &attr );
    if (rc)
        goto fatal;

    rc = hthread_mutex_init( &ilk->lock, &attr );
    if (rc)
        goto fatal;

    rc = hthread_mutexattr_destroy( &attr );
    if (rc)
        goto fatal;

    plk->ilk = ilk; /* (LOCK is now initialized) */
    PTTRACE( "lock init", plk, 0, location, PTT_MAGIC );
    return 0;

fatal:

    perror( "Fatal error in hthread_initialize_lock function" );
    exit(1);
}
Пример #13
0
int main( int argc, char *argv[] ) {
    hthread_t       tid, sw1, sw2;
    hthread_attr_t  hw1Attr, sw1Attr, sw2Attr;
	hthread_mutex_t mutex;
    Huint           retval;
	struct arguments myArgs;

    hthread_attr_init( &hw1Attr );
    hthread_attr_init( &sw1Attr );
    hthread_attr_init( &sw2Attr );
    hthread_attr_sethardware( &hw1Attr, HWTI_BASEADDR );
	hthread_mutex_init( &mutex, NULL );
	myArgs.mutex = &mutex;

	retval = hthread_mutex_lock( myArgs.mutex );
   
    // Set the thread's argument data to some value
    myArgs.value = 1000;
   
   	// Create two software threads
    hthread_create( &tid, &hw1Attr, NULL, (void*)(&myArgs) );
    hthread_create( &sw1, &sw1Attr, thread, (void*)(&myArgs) );
    hthread_create( &sw2, &sw2Attr, thread, (void*)(&myArgs) );
	hthread_yield();

    // HWT should be blocked
    readHWTStatus();
	
	retval = hthread_mutex_unlock( myArgs.mutex );

    hthread_join( tid, (void*)(&retval) );
    hthread_join( sw1, (void*)(&retval) );
    hthread_join( sw2, (void*)(&retval) );
    readHWTStatus();
    
    // Clean up the attribute structure
    hthread_attr_destroy( &hw1Attr );
    hthread_attr_destroy( &sw1Attr );
    hthread_attr_destroy( &sw2Attr );

    // Print out value of arg, and a successful exit message
    printf( "After joins arg = %d\n", myArgs.value);
    printf( "-- QED --\n" );

    // Return from main
    return 1;
}
Пример #14
0
void * testThread ( void * arg ) {
	int retVal;
	struct test_data * data = (struct test_data *) arg;
	
	//Initialize a mutexattr, then a mutex with the attr
	hthread_mutexattr_init( data->attr );
	hthread_mutex_init( data->mutex, data->attr );
	
	//Change the attr 
	data->attr->num = 1;
	
	//Get the num of the mutex, it should not have changed
	retVal = hthread_mutex_getnum( data->mutex );
	
	hthread_exit( (void *) retVal );
	return NULL;
}
Пример #15
0
int main() {
	hthread_t test_thread;
	hthread_attr_t test_attr;
	int arg, retVal, start_num, waken_num;
	struct testdata data;
	hthread_mutex_t mutex;
	hthread_cond_t cond;
	
	//Print the name of the test to the screen
	printf( "Starting test cond_broadcast_1\n" );

	//Set up the arguments for the test
	hthread_cond_init( &cond, NULL );
	hthread_mutex_init( &mutex, NULL );
	start_num = 0;
	waken_num = 0;
	
	data.mutex = &mutex;
	data.cond = &cond;
	data.start_num = &start_num;
	data.waken_num = &waken_num;
	data.function = a_thread_function;
	
	arg = (int) &data;
	
	//Initialize RPC
	rpc_setup();
	
	//Run the tests
	hthread_attr_init( &test_attr );
	if ( HARDWARE ) hthread_attr_sethardware( &test_attr, HWTI_ONE_BASEADDR );
	hthread_create( &test_thread, &test_attr, testThread, (void *) arg );
	hthread_join( test_thread, (void *) &retVal );

	if ( HARDWARE ) readHWTStatus( HWTI_ONE_BASEADDR );
	
	//Evaluate the results
	if ( retVal == EXPECTED_RESULT ) {
		printf("Test PASSED\n");
		return PTS_PASS;
	} else {
		printf("Test FAILED [expecting %d, received %d]\n", EXPECTED_RESULT, retVal );
		return PTS_FAIL;
	}
}
Пример #16
0
int main( int argc, char *argv[] )
{
	hthread_t           tid[ CHILDREN ];
    hthread_mutex_t     mutex[ MUTEXES ];
    hthread_mutexattr_t attr;
    Huint               i;
    Huint               j;
    Huint               c;

    hthread_mutexattr_init( &attr );
    hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_FAST_NP );
    
    c = 0;
    for( i = 0; i < MUTEXES; i++ )
    {
        hthread_mutexattr_setnum( &attr, i );
        hthread_mutex_init( &mutex[i], &attr );
        
        for( j = 0; j < CHILDREN_PER_MUTEX; j++ )
        {
            hthread_create( &tid[c], NULL, child, &mutex[i] );
            printf( "Created Child %u\n", tid[c] );

            c++;
        }
    }
    
    for( i = 0; i < CHILDREN; i++ )
    {
        printf( "Join Child %u\n", tid[i] );
   	    hthread_join( tid[i], NULL );
    }
    
	printf( "--DONE--\n" );
	return 1;
}
Пример #17
0
int main( int argc, char *argv[] )
{

    unsigned int start, stop;
    int i = 0;
    int test = 0;
    int NUM_LOAD_THREADS = 0;
    thread_arg_t arg;
    hthread_mutexattr_t block_attr;
    hthread_mutexattr_t data_attr;
    benchmark_t my_benchmark[TESTS];

    // Turn on the Xilinx Timer
    enableTimer();

    for (test = 0; test < TESTS; test++)
    {
	    // Set the # of load threads
	    NUM_LOAD_THREADS = test * 10;
	
	    // Init. benchmark structure
	    my_benchmark[test].num_threads_in_test = NUM_LOAD_THREADS;
	    *my_benchmark[test].name = "lock/unlock";
	
	    for (i = 0; i < RUNS; i++)
	    {	
	        // Initialize thread argument fields
		    //  * Setup mutexes
		    //  * Initialize counter
		    block_attr.num = 0;
		    block_attr.type = HTHREAD_MUTEX_DEFAULT;
		    data_attr.num = 1;
		    data_attr.type = HTHREAD_MUTEX_DEFAULT;
		    hthread_mutex_init(&arg.block_mutex, &block_attr);
		    hthread_mutex_init(&arg.data_mutex, &data_attr);
		    arg.counter = 0;
		    arg.num_load_threads = NUM_LOAD_THREADS;
	
	        // Run the test
	        start = readTimer();
	        run_A(0,NUM_LOAD_THREADS,&arg);
	        stop = readTimer();
	
	        // Gather results
	        my_benchmark[test].results1[i] = calc_timediff(arg.lock_start, arg.lock_stop);
	        my_benchmark[test].results2[i] = calc_timediff(arg.unlock_start, arg.unlock_stop);
/*	
	        printf(
	                "*** start      = %u\n"
	                "*** stop       = %u\n"
	                "*** elapsed    = %u\n",
	                start, stop, stop - start
	              );
	
	        // Calculate timing results
	        printf(     "\t*********************************\n"
	                    "\t lock Start Time    = %llu ticks\n"
	                    "\t lock Stop Time     = %llu ticks\n"
	                    "\t diff               = %llu ticks\n"
	                    "\t lock Elapsed Time  = %llu us\n",
	                    arg.lock_start, arg.lock_stop, arg.lock_stop - arg.lock_start, calc_timediff_us(arg.lock_start, arg.lock_stop)
	               );
	        printf(     "\t*********************************\n"
	                    "\t unlock Start Time    = %llu ticks\n"
	                    "\t unlock Stop Time     = %llu ticks\n"
	                    "\t diff                 = %llu ticks\n"
	                    "\t unlock Elapsed Time  = %llu us\n",
	                    arg.unlock_start, arg.unlock_stop, arg.unlock_stop - arg.unlock_start, calc_timediff_us(arg.unlock_start, arg.unlock_stop)
	               ); */
	    }                       
    }
    report_benchmark_results(my_benchmark);

    for (test = 0; test < TESTS; test++)
    {
	    // Set the # of load threads
	    NUM_LOAD_THREADS = test * 10;
	
	    // Init. benchmark structure
	    my_benchmark[test].num_threads_in_test = NUM_LOAD_THREADS;
	    *my_benchmark[test].name = "turn_around";
	
	    for (i = 0; i < RUNS; i++)
	    {	
	        // Initialize thread argument fields
		    //  * Setup mutexes
		    //  * Initialize counter
		    block_attr.num = 0;
		    block_attr.type = HTHREAD_MUTEX_DEFAULT;
		    data_attr.num = 1;
		    data_attr.type = HTHREAD_MUTEX_DEFAULT;
		    hthread_mutex_init(&arg.block_mutex, &block_attr);
		    hthread_mutex_init(&arg.data_mutex, &data_attr);
		    arg.counter = 0;

            // Num loads threads + 1 b/c the 2nd measurement thread is a load thread and needs to increment the counter barrier
            // before the main thread releases the blocking mutex
            arg.num_load_threads = NUM_LOAD_THREADS+1;
	
	        // Run the test
	        start = readTimer();
	        run_B(0,NUM_LOAD_THREADS,&arg);
	        stop = readTimer();
	
	        // Gather results
	        my_benchmark[test].results1[i] = calc_timediff(arg.unlock_start, arg.measure_lock_stop);
	        my_benchmark[test].results2[i] = calc_timediff(arg.unlock_start, arg.measure_lock_stop);
/*	
	        printf(
	                "*** start      = %u\n"
	                "*** stop       = %u\n"
	                "*** elapsed    = %u\n",
	                start, stop, stop - start
	              );	

            // Calculate timing results
	        printf(     "\t*********************************\n"
	                    "\t lock Start Time    = %llu ticks\n"
	                    "\t lock Stop Time     = %llu ticks\n"
	                    "\t diff               = %llu ticks\n"
	                    "\t lock Elapsed Time  = %llu us\n",
	                    arg.lock_start, arg.lock_stop, arg.lock_stop - arg.lock_start, calc_timediff_us(arg.lock_start, arg.lock_stop)
	               );
	        printf(     "\t*********************************\n"
	                    "\t unlock Start Time    = %llu ticks\n"
	                    "\t unlock Stop Time     = %llu ticks\n"
	                    "\t diff                 = %llu ticks\n"
	                    "\t unlock Elapsed Time  = %llu us\n"
	                    "\t m_lock Start Time    = %llu ticks\n"
	                    "\t m_lock Stop Time     = %llu ticks\n"
	                    "\t turn around          = %llu us\n",
	                    arg.unlock_start, arg.unlock_stop, arg.unlock_stop - arg.unlock_start, calc_timediff_us(arg.unlock_start, arg.unlock_stop), arg.measure_lock_start, arg.measure_lock_stop, calc_timediff_us(arg.unlock_start, arg.measure_lock_stop)); */
	    }                       
    }
    report_benchmark_results(my_benchmark);

    return 0;
}
Пример #18
0
/*-------------------------------------------------------------------*/
static void hthreads_internal_init()
{
    static BYTE bDidInit = FALSE;

    if (!bDidInit)
    {
    MATTR attr;
    int rc, herc_high_pri, host_high_pri;

        /* Initialize our internal lock */

        rc = hthread_mutexattr_init( &attr );
        if (rc)
            goto fatal;

        rc = hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_DEFAULT );
        if (rc)
            goto fatal;

        rc = hthread_mutex_init( &listlock, &attr );
        if (rc)
            goto fatal;

        rc = hthread_mutexattr_destroy( &attr );
        if (rc)
            goto fatal;

        /* Initialize our locks list anchor */

        InitializeListHead( &locklist );
        lockcount = 0;

        /* Initialize thread scheduling variables */

        herc_policy = HTHREAD_SCHED_DEF;

        herc_low_pri  = HTHREAD_MIN_PRI;
        herc_high_pri = HTHREAD_MAX_PRI;

        host_low_pri  = hthread_sched_get_priority_min( herc_policy );
        host_high_pri = hthread_sched_get_priority_max( herc_policy );

        herc_pri_rvrsd = (herc_high_pri < herc_low_pri);
        host_pri_rvrsd = (host_high_pri < host_low_pri);

        herc_pri_amt = herc_pri_rvrsd ? (herc_low_pri - herc_high_pri)
                                      : (herc_high_pri - herc_low_pri);

        host_pri_amt = host_pri_rvrsd ? (host_low_pri - host_high_pri)
                                      : (host_high_pri - host_low_pri);

        /* One-time initialization completed */

        bDidInit = TRUE;
        return;

fatal:
        perror( "Fatal error in hthreads_internal_init function" );
        exit(1);
    }
    return;
}
Пример #19
0
int main()
{
  struct threadpool tp;
  hthread_mutex_t task_queue_mutex;
  hthread_cond_t active_task;

  // Init. global print mutex
  hthread_mutex_init(&print_mutex, NULL);

  // Setup mutex
  printf("Setting up mutex...");
  hthread_mutexattr_t mta;
  hthread_mutexattr_settype(&mta, HTHREAD_MUTEX_RECURSIVE_NP);
  hthread_mutexattr_setnum(&mta, 1);
  hthread_mutex_init(&task_queue_mutex, &mta);
  printf("DONE\n");

  // Setup cond. var
  printf("Setting up cond.var...");
  hthread_condattr_t cta;
  hthread_condattr_init(&cta);
  hthread_cond_init(&active_task, &cta);
  printf("DONE\n");

  // Setup threadpool struct
  tp.task_queue_mutex = &task_queue_mutex;
  tp.active_task = &active_task;
  tp.total_tasks = 0;
  tp.request_errors = 0;
  tp.head_ptr = NULL;
  tp.tail_ptr = NULL;

  // Init threadpool
  printf("Creating thread pool...");
  thread_pool_init(&tp, 8);
  printf("DONE\n");

  int i;
  void (*x) (void *);
  void (*y) (void *);
  x = func;
  y = func2; 
  for (i = 0; i < 15; i++) {
    aprintf("Adding task %d...\n", i);
    if (i %4 == 0)
    {
        add_task(&tp, i, *x, (void*)i);
    }
    else
    {
        add_task(&tp, i, *y, (void*)i);
    }
  }

  aprintf("Waiting for completion...\n");
  while (tp.total_tasks > 0) {
    aprintf("Main running (%d)...\n", tp.total_tasks);
    hthread_yield();
  }
  aprintf("DONE!!!\n");

  /*
    while(1)
    {
    hthread_yield();
    }
  */
  return 0;
}
// Initialize all of the PR data
void init_PR_data() {
    // Initialize the ICAP
    hthread_mutexattr_t attr;
    if (hthread_mutexattr_init(&attr)) {
        printf("Error intializing mutex attribute\n");
        while(1);
    }

    // Set MID to maximum ID allowed    
    if (hthread_mutexattr_setnum(&attr,(Huint) HT_SEM_MAXNUM)) {
        printf("Error setting MID (%u) for mutex attribute\n", HT_SEM_MAXNUM);
        while(1);
    }
    
    if(hthread_mutex_init(&icap_mutex, &attr)) {
        printf("error initializing icap mutex\n");
        while(1);
    }

    #ifdef ICAP
    // Initialize the ICAP
    if(XHwIcap_CfgInitialize(&HwIcap, (XHwIcap_Config *) 0x1, ICAP_BASEADDR)) {
        printf("Error initializing the ICAP\n");
        while(1);
    }

    // Initialize the pointers
    // init CRC
    crc_bit[0] = (unsigned char *) (&crc0_bit[0]);
    crc_bit[1] = (unsigned char *) (&crc1_bit[0]);
    crc_bit[2] = (unsigned char *) (&crc2_bit[0]);
    crc_bit[3] = (unsigned char *) (&crc3_bit[0]);
    crc_bit[4] = (unsigned char *) (&crc4_bit[0]);
    crc_bit[5] = (unsigned char *) (&crc5_bit[0]);

    // init sort
    sort_bit[0] = (unsigned char *) (&sort0_bit[0]);
    sort_bit[1] = (unsigned char *) (&sort1_bit[0]);
    sort_bit[2] = (unsigned char *) (&sort2_bit[0]);
    sort_bit[3] = (unsigned char *) (&sort3_bit[0]);
    sort_bit[4] = (unsigned char *) (&sort4_bit[0]);
    sort_bit[5] = (unsigned char *) (&sort5_bit[0]);
    
    // init vector
    vector_bit[0] = (unsigned char *) (&vector0_bit[0]);
    vector_bit[1] = (unsigned char *) (&vector1_bit[0]);
    vector_bit[2] = (unsigned char *) (&vector2_bit[0]);
    vector_bit[3] = (unsigned char *) (&vector3_bit[0]);
    vector_bit[4] = (unsigned char *) (&vector4_bit[0]);
    vector_bit[5] = (unsigned char *) (&vector5_bit[0]);

    // Create accelerate profiles - containers that hold
    // pointers to each accelerator specific for each slave.
    unsigned int i;
    for (i = 0; i < NUM_AVAILABLE_HETERO_CPUS; i++) { 
        set_accelerator_structure((accelerator_list_t *) &accelerator_list[i], i);

        // -------------------------------------------------------------- //
        //         Write extra parameters for PR functionality            //
        // -------------------------------------------------------------- //
        _hwti_set_accelerator_ptr((Huint) hwti_array[i], (Huint)&accelerator_list[i]);

        // Write the ICAP Mutex
        _hwti_set_icap_mutex( (Huint) hwti_array[i], (Huint) &icap_mutex);

        // Write the ICAP Data Strucutre
        _hwti_set_icap_struct_ptr( (Huint) hwti_array[i], (Huint) &HwIcap);

        // Write pointer for last_used_accelerator so slave can update the table
        _hwti_set_last_accelerator_ptr( (Huint) hwti_array[i], (Huint) &slave_table[i].last_used_acc);
            
        // Write pointer to tuning_table
        _hwti_set_tuning_table_ptr((Huint) hwti_array[i], (Huint) &tuning_table);

    }
    #endif
   
    // Reset thread create statistical data 
    no_free_slaves_num = 0;
    possible_slaves_num = 0;
    best_slaves_num = 0;
}
Пример #21
0
int main( int argc, char *argv[] )
{
    if (NUM_THREADS > 2){
        printf("CANNOT USE MORE THAN (2) HETEROGENEOUS THREADS!!!!\r\n");
        return (-1);
    }
    // Timer variables
    xps_timer_t timer;
    int time_create, time_start, time_stop;

    // Mutex
    hthread_mutex_t * mutex          = (hthread_mutex_t*)malloc( sizeof(hthread_mutex_t) );
    hthread_mutex_init( mutex, NULL );

    // Thread attribute structures
    Huint           sta[NUM_THREADS];
    void*           retval[NUM_THREADS];
    hthread_t       tid[NUM_THREADS];
    hthread_attr_t  attr[NUM_THREADS];
    targ_t thread_arg[NUM_THREADS];

    // Setup Cache
    XCache_EnableICache(0xc0000801);

    // Create timer
    xps_timer_create(&timer, (int*)0x20400000);

    // Start timer
    xps_timer_start(&timer);

// *************************************************************************************    
    extern unsigned char intermediate[];

    extern unsigned int blink_handle_offset;
    unsigned int blink_handle = (blink_handle_offset) + (unsigned int)(&intermediate);

// *************************************************************************************    

    int j = 0;
    printf("Code start address = 0x%08x\n", (unsigned int)&intermediate);

    for (j = 0; j < NUM_THREADS; j++)
    {
        // Initialize the attributes for the threads
        hthread_attr_init( &attr[j] );
        hthread_attr_sethardware( &attr[j], (void*)base_array[j] );
    }

    int num_ops = 0;
    for( num_ops = 0; num_ops < 1; num_ops = num_ops + 1)
    { 

        printf("******* Round %d ********\n",num_ops);
#ifdef USE_MB_THREAD
        printf("**** MB-based Threads ****\n");
#else
        printf("**** PPC-based Threads ****\n");
#endif

        // Initialize thread arguments
        for ( j= 0; j < NUM_THREADS; j++)
        {
            thread_arg[j].arg = 1 << ((j + 1));
            thread_arg[j].mutex = mutex;
        }

        time_create = xps_timer_read_counter(&timer);
        // Create threads
        for (j = 0; j < NUM_THREADS; j++)
        {
            // Create the blink thread
#ifdef USE_MB_THREAD
            // Create MB Thread
            sta[j] = hthread_create( &tid[j], &attr[j], (void*)blink_handle, (void*)(&thread_arg[j]) );
            //printf( "Started MB Thread (TID = %d) \n", tid[j]);
#else
            // Create SW Thread
            sta[j] = hthread_create( &tid[j], NULL, blink_thread, (void*)(&thread_arg[j]) );
            //printf( "Started SW Thread (TID = %d) \n", tid[j]);
#endif
        }


        // Allow created threads to begin running and start timer
        time_start = xps_timer_read_counter(&timer);
        printf("Waiting for threads...\n");
        // Join on all threads
        for (j = 0; j < NUM_THREADS; j++)
        {
            hthread_join( tid[j], &retval[j] );
        }

        // Grab stop time
        time_stop = xps_timer_read_counter(&timer);

        // Print out status
        for (j = 0; j < NUM_THREADS; j++)
        {
            printf("TID[%d] = 0x%08x, status = 0x%08x, retval = 0x%08x\n",j,tid[j],sta[j],(unsigned int)retval[j]);
        }

        printf("*********************************\n");
        printf("Create time  = %u\n",time_create);
        printf("Start time   = %u\n",time_start);
        printf("Stop time    = %u\n",time_stop);
        printf("*********************************\n");
        printf("Creation time (|Start - Create|) = %u\n",time_start - time_create);
        printf("Elapsed time  (|Stop - Start|)   = %u\n",time_stop - time_start);


    }


    hthread_mutex_destroy( mutex );
    free( mutex );

    // Clean up the attribute structures
    for (j = 0; j < NUM_THREADS; j++)
    {
        hthread_attr_destroy( &attr[j] );
    }

    printf ("-- Complete --\n");

    // Return from main
    return 0;
}
Пример #22
0
int run_tests()
{
    // Timer variables
    xps_timer_t timer;
    int time_create, time_start, time_unlock, time_stop;

    // Mutex
    hthread_mutex_t * mutex          = (hthread_mutex_t*)malloc( sizeof(hthread_mutex_t) );
    hthread_mutex_init( mutex, NULL );

    float min;

    // Thread attribute structures
    Huint           sta[NUM_THREADS];
    void*           retval[NUM_THREADS];
    hthread_t       tid[NUM_THREADS];
    hthread_attr_t  attr[NUM_THREADS];
    targ_t thread_arg[NUM_THREADS];

    // Setup Cache
    XCache_DisableDCache();
    XCache_EnableICache(0xc0000801);

    // Create timer
    xps_timer_create(&timer, (int*)0x20400000);

    // Start timer
    xps_timer_start(&timer);

// *************************************************************************************    
    extern unsigned char intermediate[];

    extern unsigned int min_handle_offset;
    unsigned int min_handle = (min_handle_offset) + (unsigned int)(&intermediate);


// *************************************************************************************    
    printf("Code start address = 0x%08x\n", (unsigned int)&intermediate);

    int i = 0;
    float main_array[ARRAY_LENGTH];
    printf("Addr of array = 0x%08x\n",(unsigned int)&main_array[0]);
    for (i = 0; i < ARRAY_LENGTH; i++)
    {
        main_array[i] = (i+2)*3.14f;
    }


    int num_items = ARRAY_LENGTH/NUM_THREADS;
    int extra_items = ARRAY_LENGTH - (num_items*NUM_THREADS);
    float * start_addr = &main_array[0];
    for (i = 0; i < NUM_THREADS; i++)
    {
        // Initialize the attributes for the hardware threads
        hthread_attr_init( &attr[i] );
        hthread_attr_sethardware( &attr[i], (void*)base_array[i] );

        // Initialize thread arguments
        thread_arg[i].num_items = num_items;
        thread_arg[i].data_ptr = start_addr;
        thread_arg[i].min_mutex = mutex;
        thread_arg[i].min  = &min;
        start_addr+=num_items;
    }
    // Add in extra items for the last thread if needed
    thread_arg[i-1].num_items += extra_items;

    int num_ops = 0;
    for( num_ops = 0; num_ops < 2; num_ops = num_ops + 1)
    { 

        printf("******* Round %d ********\n",num_ops);
#ifdef USE_MB_THREAD
    printf("**** MB-based Threads ****\n");
#else
    printf("**** PPC-based Threads ****\n");
#endif
        min = 9999999;

        // Lock mutex before hand so that timing will not include thread creation time
        hthread_mutex_lock(mutex);

        // Start timing thread create
        time_create = xps_timer_read_counter(&timer);

        for (i = 0; i < NUM_THREADS; i++)
        {
            // Create the worker threads
#ifdef USE_MB_THREAD

            // Create MB Thread
            sta[i] = hthread_create( &tid[i], &attr[i], (void*)(min_handle), (void*)(&thread_arg[i]) );
#else
            // Create SW Thread
            sta[i] = hthread_create( &tid[i], NULL, min_thread, (void*)(&thread_arg[i]) );
#endif
        }

        // Allow created threads to begin running and start timer
        time_start = xps_timer_read_counter(&timer);
        hthread_mutex_unlock(mutex);
        time_unlock = xps_timer_read_counter(&timer);

        // Wait for the threads to exit
		//printf( "Waiting for thread(s) to complete... \n" );
        for (i = 0; i < NUM_THREADS; i++)
        {
    	    hthread_join( tid[i], &retval[i] );
        }

        time_stop = xps_timer_read_counter(&timer);

        // Display results
        printf("Min = %f\n",min);
        for (i = 0; i < NUM_THREADS; i++)
        {
            printf("TID = 0x%08x, status = 0x%08x, retval = 0x%08x\n",tid[i],sta[i],(Huint)retval[i]);
        }
        printf("*********************************\n");
        printf("Create time  = %u\n",time_create);
        printf("Start time   = %u\n",time_start);
        printf("Unlock time  = %u\n",time_unlock);
        printf("Stop time    = %u\n",time_stop);
        printf("*********************************\n");
        printf("Creation time (|Start - Create|) = %u\n",time_start - time_create);
        printf("Unlock time (|Unlock - Start|)   = %u\n",time_unlock - time_start);
        printf("Elapsed time  (|Stop - Start|)   = %u\n",time_stop - time_start);

    }

    hthread_mutex_destroy( mutex );
    free( mutex );

    // Clean up the attribute structures
    for (i = 0; i < NUM_THREADS; i++)
    {
        hthread_attr_destroy( &attr[i] );
    }
    printf ("-- Complete --\n");

    // Return from main
    return 0;
}