Blame src/ctests/zero_omp.c

Packit 577717
/*
Packit 577717
* File:    zero_omp.c
Packit 577717
* Author:  Philip Mucci
Packit 577717
*          mucci@cs.utk.edu
Packit 577717
* Mods:    Nils Smeds
Packit 577717
*          smeds@pdc.kth.se
Packit 577717
*          Anders Nilsson
Packit 577717
*          anni@pdc.kth.se
Packit 577717
*/
Packit 577717
Packit 577717
/* This file performs the following test: start, stop and timer
Packit 577717
functionality for 2 slave OMP 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 thread inside the Thread routine:
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 serial thread:
Packit 577717
   - Get us.
Packit 577717
   - Get cyc.
Packit 577717
   - Run parallel for loop
Packit 577717
   - Get us.
Packit 577717
   - Get cyc.
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
#ifdef _OPENMP
Packit 577717
#include <omp.h>
Packit 577717
#else
Packit 577717
#error "This compiler does not understand OPENMP"
Packit 577717
#endif
Packit 577717
Packit 577717
const PAPI_hw_info_t *hw_info = NULL;
Packit 577717
Packit 577717
void
Packit 577717
Thread( 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
	if (!TESTS_QUIET) {
Packit 577717
		printf( "Thread %#x started\n", omp_get_thread_num(  ) );
Packit 577717
	}
Packit 577717
Packit 577717
	/* add PAPI_TOT_CYC and one of the events in
Packit 577717
	   PAPI_FP_INS, PAPI_FP_OPS or PAPI_TOT_INS,
Packit 577717
	   depending on the availability of the event
Packit 577717
	   on the platform */
Packit 577717
	EventSet1 = add_two_events( &num_events1, &PAPI_event, &mask1 );
Packit 577717
	if (num_events1==0) {
Packit 577717
		if (!TESTS_QUIET) printf("No events added!\n");
Packit 577717
		test_fail(__FILE__,__LINE__,"No events",0);
Packit 577717
	}
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
	elapsed_us = PAPI_get_real_usec(  );
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  );
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
	do_flops( n );
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
	elapsed_us = PAPI_get_real_usec(  ) - elapsed_us;
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  ) - elapsed_cyc;
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", omp_get_thread_num(  ),
Packit 577717
				event_name, values[0][1] );
Packit 577717
		printf( "Thread %#x PAPI_TOT_CYC: \t%lld\n", omp_get_thread_num(  ),
Packit 577717
				values[0][0] );
Packit 577717
		printf( "Thread %#x Real usec   : \t%lld\n", omp_get_thread_num(  ),
Packit 577717
				elapsed_us );
Packit 577717
		printf( "Thread %#x Real cycles : \t%lld\n", omp_get_thread_num(  ),
Packit 577717
				elapsed_cyc );
Packit 577717
	}
Packit 577717
Packit 577717
	/* It is illegal for the threads to exit in OpenMP */
Packit 577717
	/* test_pass(__FILE__,0,0); */
Packit 577717
	free_test_space( values, num_tests );
Packit 577717
Packit 577717
	PAPI_unregister_thread(  );
Packit 577717
	if (!TESTS_QUIET) {
Packit 577717
		printf( "Thread %#x finished\n", omp_get_thread_num(  ) );
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int retval;
Packit 577717
	long long elapsed_us, elapsed_cyc;
Packit 577717
	int quiet;
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
	hw_info = PAPI_get_hardware_info(  );
Packit 577717
	if ( hw_info == NULL ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", 2 );
Packit 577717
	}
Packit 577717
Packit 577717
	if (PAPI_query_event(PAPI_TOT_INS)!=PAPI_OK) {
Packit 577717
		if (!quiet) printf("Can't find PAPI_TOT_INS\n");
Packit 577717
		test_skip(__FILE__,__LINE__,"Event missing",1);
Packit 577717
	}
Packit 577717
Packit 577717
	if (PAPI_query_event(PAPI_TOT_CYC)!=PAPI_OK) {
Packit 577717
		if (!quiet) printf("Can't find PAPI_TOT_CYC\n");
Packit 577717
		test_skip(__FILE__,__LINE__,"Event missing",1);
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
Packit 577717
	retval = PAPI_thread_init( ( unsigned long ( * )( void ) )
Packit 577717
						( omp_get_thread_num ) );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		if ( retval == PAPI_ECMP ) {
Packit 577717
			if (!quiet) printf("Trouble init threads\n");
Packit 577717
			test_skip( __FILE__, __LINE__, "PAPI_thread_init", retval );
Packit 577717
		}
Packit 577717
		else {
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_thread_init", retval );
Packit 577717
		}
Packit 577717
	}
Packit 577717
#pragma omp parallel
Packit 577717
	{
Packit 577717
		Thread( 1000000 * ( omp_get_thread_num(  ) + 1 ) );
Packit 577717
	}
Packit 577717
	omp_set_num_threads( 1 );
Packit 577717
	Thread( 1000000 * ( omp_get_thread_num(  ) + 1 ) );
Packit 577717
	omp_set_num_threads( omp_get_max_threads(  ) );
Packit 577717
#pragma omp parallel
Packit 577717
	{
Packit 577717
		Thread( 1000000 * ( omp_get_thread_num(  ) + 1 ) );
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 ( !TESTS_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
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
}