Blame src/ctests/zero_smp.c

Packit 577717
/* This file performs the following test: start, stop and timer
Packit 577717
functionality for 2 slave native SMP threads
Packit 577717
Packit 577717
   - It attempts to use the following two counters. It may use less
Packit 577717
depending on hardware counter resource limitations. These are counted
Packit 577717
in the default counting domain and default granularity, depending on
Packit 577717
the platform. Usually this is the user domain (PAPI_DOM_USER) and
Packit 577717
thread context (PAPI_GRN_THR).
Packit 577717
Packit 577717
     + PAPI_FP_INS
Packit 577717
     + PAPI_TOT_CYC
Packit 577717
Packit 577717
Each of 2 slave pthreads:
Packit 577717
   - Get cyc.
Packit 577717
   - Get us.
Packit 577717
   - Start counters
Packit 577717
   - Do flops
Packit 577717
   - Stop and read counters
Packit 577717
   - Get us.
Packit 577717
   - Get cyc.
Packit 577717
Packit 577717
Master pthread:
Packit 577717
   - Get us.
Packit 577717
   - Get cyc.
Packit 577717
   - Fork threads
Packit 577717
   - Wait for threads to exit
Packit 577717
   - Get us.
Packit 577717
   - Get cyc.
Packit 577717
*/
Packit 577717
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
Packit 577717
#include "papi.h"
Packit 577717
#include "papi_test.h"
Packit 577717
Packit 577717
#include "do_loops.h"
Packit 577717
Packit 577717
#if defined(sun) && defined(sparc)
Packit 577717
#include <thread.h>
Packit 577717
#elif defined(mips) && defined(sgi) && defined(unix)
Packit 577717
#include <mpc.h>
Packit 577717
#elif defined(_AIX) || defined(__linux__)
Packit 577717
#include <pthread.h>
Packit 577717
#endif
Packit 577717
Packit 577717
Packit 577717
void
Packit 577717
Thread( int t, int n )
Packit 577717
{
Packit 577717
	int retval, num_tests = 1;
Packit 577717
	int EventSet1 = PAPI_NULL;
Packit 577717
	int PAPI_event, mask1;
Packit 577717
	int num_events1;
Packit 577717
	long long **values;
Packit 577717
	long long elapsed_us, elapsed_cyc;
Packit 577717
	char event_name[PAPI_MAX_STR_LEN];
Packit 577717
Packit 577717
	/* add PAPI_TOT_CYC and one of the events in PAPI_FP_INS, PAPI_FP_OPS or
Packit 577717
	   PAPI_TOT_INS, depending on the availability of the event on the
Packit 577717
	   platform */
Packit 577717
	EventSet1 = add_two_events( &num_events1, &PAPI_event, &mask1 );
Packit 577717
Packit 577717
	retval = PAPI_event_code_to_name( PAPI_event, event_name );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
Packit 577717
Packit 577717
	values = allocate_test_space( num_tests, num_events1 );
Packit 577717
Packit 577717
	retval = PAPI_start( EventSet1 );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit 577717
Packit 577717
	elapsed_us = PAPI_get_real_usec(  );
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  );
Packit 577717
Packit 577717
	do_flops( n );
Packit 577717
Packit 577717
	elapsed_us = PAPI_get_real_usec(  ) - elapsed_us;
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  ) - elapsed_cyc;
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet1, values[0] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
Packit 577717
	remove_test_events( &EventSet1, mask1 );
Packit 577717
Packit 577717
	if ( !TESTS_QUIET ) {
Packit 577717
		printf( "Thread %#x %-12s : \t%lld\n", t, event_name,
Packit 577717
				values[0][1] );
Packit 577717
		printf( "Thread %#x PAPI_TOT_CYC : \t%lld\n", t, 
Packit 577717
			values[0][0] );
Packit 577717
	}
Packit 577717
Packit 577717
	free_test_space( values, num_tests );
Packit 577717
	if ( !TESTS_QUIET ) {
Packit 577717
		printf( "Thread %#x Real usec    : \t%lld\n", t, elapsed_us );
Packit 577717
		printf( "Thread %#x Real cycles  : \t%lld\n", t, elapsed_cyc );
Packit 577717
	}
Packit 577717
	PAPI_unregister_thread(  );
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int i, retval, quiet;
Packit 577717
	long long elapsed_us, elapsed_cyc;
Packit 577717
Packit 577717
	/* Set TESTS_QUIET variable */
Packit 577717
	quiet=tests_quiet( argc, argv );
Packit 577717
Packit 577717
	retval = PAPI_library_init( PAPI_VER_CURRENT );
Packit 577717
	if ( retval != PAPI_VER_CURRENT ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	elapsed_us = PAPI_get_real_usec(  );
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  );
Packit 577717
Packit 577717
#if defined(_AIX) || defined(__linux__)
Packit 577717
	retval =
Packit 577717
		PAPI_thread_init( ( unsigned long ( * )( void ) ) ( pthread_self ) );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		if ( retval == PAPI_ECMP )
Packit 577717
			test_skip( __FILE__, __LINE__, "PAPI_thread_init", retval );
Packit 577717
		else
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_thread_init", retval );
Packit 577717
	}
Packit 577717
#if defined(_AIX)
Packit 577717
#pragma ibm parallel_loop
Packit 577717
#endif
Packit 577717
Packit 577717
#elif defined(sgi) && defined(mips)
Packit 577717
	retval =
Packit 577717
		PAPI_thread_init( ( unsigned long ( * )( void ) ) ( mp_my_threadnum ) );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_thread_init", retval );
Packit 577717
	}
Packit 577717
#pragma parallel
Packit 577717
#pragma local(i)
Packit 577717
#pragma pfor
Packit 577717
#elif defined(sun) && defined(sparc)
Packit 577717
	retval = PAPI_thread_init( ( unsigned long ( * )( void ) ) ( thr_self ) );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_thread_init", retval );
Packit 577717
	}
Packit 577717
#pragma MP taskloop private(i)
Packit 577717
#else
Packit 577717
	if (!quiet) {
Packit 577717
		printf("This test only runs on AIX/IRIX/SOLOARIS\n");
Packit 577717
	}
Packit 577717
	test_skip(__FILE__, __LINE__, "Architecture not included in this test file yet.", 0);
Packit 577717
#endif
Packit 577717
	for ( i = 1; i < 3; i++ ) {
Packit 577717
		Thread( i, 10000000 * i );
Packit 577717
	}
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  ) - elapsed_cyc;
Packit 577717
Packit 577717
	elapsed_us = PAPI_get_real_usec(  ) - elapsed_us;
Packit 577717
Packit 577717
	if ( !quiet ) {
Packit 577717
		printf( "Master real usec   : \t%lld\n", elapsed_us );
Packit 577717
		printf( "Master real cycles : \t%lld\n", elapsed_cyc );
Packit 577717
	}
Packit 577717
Packit 577717
	// FIXME: we don't really validate anything here
Packit 577717
Packit 577717
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
}