Exemple #1
0
/*
	LockCorrectness:
		Tests correct implementation of the lock

	Parameters:

		parameters:
			A structure of type ThreadParameters_t with parameters

	Return Value:
		

*/
void * LockCorrectness( void *parameters )
{
	
	// ----------------------- Local Variables ------------------

		int i;
		int localN; // On the stack for performance.
		int tmp;
		int j;
		int expectedresult;
		int delaysteps;
		
		ThreadParameters_t *par;


	// ---------------------- Initialization -------------------------

		par = ( ThreadParameters_t * ) parameters;
		localN = gN*30;
		gTestVariable = 0;
		gCounter = 0;

		my_barrier_wait( &gBarrier );


	// ---------------------- Run Tests -------------------------

		for ( i = 0; i < localN; i++ )
		{
			my_mutex_lock( &gMutex );
			tmp = gTestVariable;
			delaysteps = rand() % DELAYNUM;
			for ( j = 0; j < delaysteps; j++ )
			{
				tmp += gZero;
			}
			tmp++;
			gTestVariable = tmp;
			my_mutex_unlock( &gMutex );
		}

	// ---------------------- Barrier wait -------------------------

		my_barrier_wait( &gBarrier );


	// ----------------------- Check for sucess ---------------------

		expectedresult = localN * gP;

		if ( gTestVariable != expectedresult )
		{
			return( NULL );
		}

		return( ( void * ) 1 );

}
Exemple #2
0
/*
	LockPerformance:
		Tests the performance of a single lock, with no writings or readings.

	Parameters:

		parameters:
			A structure of type ThreadParameters_t with parameters

	Return Value:
		This test always succeeds. It always returns 1.

*/
void * LockPerformance( void *parameters )
{
	
	// ----------------------- Local Variables ------------------

		int i;
		int localN; // On the stack for performance.
		int j;
		ThreadParameters_t *par;


	// ---------------------- Initialization -------------------------

		par = ( ThreadParameters_t * ) parameters;
		localN = gN*15;

		my_barrier_wait( &gBarrier );


	// ---------------------- Run Tests -------------------------

		for ( j = 0; j < 10; j++ )
		{

			my_barrier_wait( &gBarrier );

			for ( i = 0; i < localN; i++ )
			{
				my_mutex_lock( &gMutex );
				my_mutex_unlock( &gMutex );
			}
		}

	// ---------------------- Barrier wait -------------------------

		my_barrier_wait( &gBarrier );

	// ----------------------- Always return success ---------------------

		return( ( void * ) 1 );

}
Exemple #3
0
/*
	BarrierPerformance:
		Tests the performance of a single barrier, with no writings or readings.

	Parameters:

		parameters:
			A structure of type ThreadParameters_t with parameters

	Return Value:
		This test always succeeds. It always returns 1.

*/
void * BarrierPerformance( void *parameters )
{
	
	// ----------------------- Local Variables ------------------

		int localN; // On the stack for performance.
		int i;
		ThreadParameters_t *par;


	// ---------------------- Initialization -------------------------

		par = ( ThreadParameters_t * ) parameters;
		localN = gN*10;

		my_barrier_wait( &gBarrier );


	// ---------------------- Run Tests -------------------------

		for ( i = 0; i < localN; i++ )
		{

			my_barrier_wait( &gBarrier );

		}

	// ---------------------- Barrier wait -------------------------

		my_barrier_wait( &gBarrier );

	// ----------------------- Always return success ---------------------

		return( ( void * ) 1 );

}
Exemple #4
0
static void * doTest(void *arg) {
    int warmups = MIN(100, iters/100);
    int64_t start,total;
    int result;
    int i = 0;

    if (arg) {
        /* I am a polling thread */
        GASNET_BLOCKUNTIL(done);
        return NULL;
    }

    /* Warmup Named */
    for (i=0; i < warmups; i++) {
        my_barrier_notify(i, 0);
        GASNET_Safe(my_barrier_wait(i, 0));
        assert_always(!gasnet_barrier_result(&result));
    }

    BARRIER();
    start = TIME();
    for (i=0; i < iters; i++) {
        my_barrier_notify(i, 0);
        GASNET_Safe(my_barrier_wait(i, 0));
    }
    total = TIME() - start;

    BARRIER();

    if (mynode == 0) {
        printf("Total time: %8.3f sec  Avg Named Barrier latency: %8.3f us\n",
               ((float)total)/1000000, ((float)total)/iters);
        fflush(stdout);
    }
    BARRIER();

    /* Warmup Anonymous */
    for (i=0; i < warmups; i++) {
        my_barrier_notify(0, GASNET_BARRIERFLAG_ANONYMOUS);
        GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_ANONYMOUS));
        assert_always(gasnet_barrier_result(&result));
    }

    BARRIER();
    start = TIME();
    for (i=0; i < iters; i++) {
        my_barrier_notify(0, GASNET_BARRIERFLAG_ANONYMOUS);
        GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_ANONYMOUS));
    }
    total = TIME() - start;

    BARRIER();

    if (mynode == 0) {
        printf("Total time: %8.3f sec  Avg Anon. Barrier latency: %8.3f us\n",
               ((float)total)/1000000, ((float)total)/iters);
        fflush(stdout);
    }
    BARRIER();

    if (!PERFORM_MIXED_NAMED_ANON_TESTS) {
        if (mynode == 0) {
            MSG("WARNING: skipping tests which mix named and anonymous barriers, "
                "which are known to fail in this configuration");
        }
    } else {
        int parity = (mynode & 1);

        /* Warmup Mixed */
        for (i=0; i < warmups; i++, parity ^= 1) {
            int value = parity ? iters : 0;
            int flags = parity ? 0 : GASNET_BARRIERFLAG_ANONYMOUS;
            my_barrier_notify(value, flags);
            GASNET_Safe(my_barrier_wait(value, flags));
            assert_always(!gasnet_barrier_result(&result) || (nodes == 1));
        }

        BARRIER();
        start = TIME();
        for (i=0; i < iters; i++, parity ^= 1) {
            int value = parity ? iters : 0;
            int flags = parity ? 0 : GASNET_BARRIERFLAG_ANONYMOUS;
            my_barrier_notify(value, flags);
            GASNET_Safe(my_barrier_wait(value, flags));
        }
        total = TIME() - start;

        BARRIER();

        if (mynode == 0) {
            printf("Total time: %8.3f sec  Avg Mixed Barrier latency: %8.3f us\n",
                   ((float)total)/1000000, ((float)total)/iters);
            fflush(stdout);
        }
    }
    BARRIER();

#if TEST_UNNAMED_BARRIER
    /* Warmup Unnamed */
    for (i=0; i < warmups; i++) {
        my_barrier_notify(0, GASNET_BARRIERFLAG_UNNAMED);
        GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_UNNAMED));
        assert_always(gasnet_barrier_result(&result));
    }

    BARRIER();
    start = TIME();
    for (i=0; i < iters; i++) {
        my_barrier_notify(0, GASNET_BARRIERFLAG_UNNAMED);
        GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_UNNAMED));
    }
    total = TIME() - start;

    BARRIER();

    if (mynode == 0) {
        printf("Total time: %8.3f sec  Avg Uname Barrier latency: %8.3f us\n",
               ((float)total)/1000000, ((float)total)/iters);
        fflush(stdout);
    }
    BARRIER();
#endif

    GASNET_Safe(gasnet_AMRequestShort0(mynode, hidx_done_shorthandler));
    return NULL;
}
Exemple #5
0
/*
	BarrierCorrectness:
		Tests correct implementation of barrier

	Parameters:

		parameters:
			A structure of type ThreadParameters_t with parameters

	Return Value:
		

*/
void * BarrierCorrectness( void *parameters )
{
	
	// ----------------------- Local Variables ------------------

		int i;
		int localN; // On the stack for performance.
		int tmp;
		int j;
		int delaysteps;
		int goodbarrier;
		
		ThreadParameters_t *par;


	// ---------------------- Initialization -------------------------

		par = ( ThreadParameters_t * ) parameters;
		localN = gN*6;
		gTestVariable = 0;
		gCounter = 0;
		goodbarrier = 1;

		my_barrier_wait( &gBarrier );


	// ---------------------- Run Tests -------------------------

		for ( i = 0; i < localN; i++ )
		{

			
			// Read a shared variable
			tmp = 0;
			delaysteps = rand() % DELAYNUM;
			for ( j = 0; j < delaysteps; j++ )
			{
				tmp += gZero;
			}
			tmp++;

			// Synchronize: Everybody reads the same variable
			my_barrier_wait( &gBarrier );

			// Atomically increment the variable after a random delay...
			delaysteps = rand() % DELAYNUM;
			for ( j = 0; j < delaysteps; j++ )
			{
				tmp += gZero;
			}
			// Atomically add the value to the test variable
			__sync_fetch_and_add( &gTestVariable, tmp );

			// Check for successful add from all threads.
			my_barrier_wait( &gBarrier );

			if ( gTestVariable != ( ( i + 1 ) * gP ) )
			{
				goodbarrier = 0;
			}

		}

	// ---------------------- Barrier wait -------------------------

		my_barrier_wait( &gBarrier );


	// ----------------------- Check for sucess ---------------------


		if ( goodbarrier != 1 )
		{
			return( NULL );
		}

		return( ( void * ) 1 );

}