|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: data_range.c
|
|
Packit |
577717 |
* Author: Dan Terpstra
|
|
Packit |
577717 |
* terpstra@cs.utk.edu
|
|
Packit |
577717 |
* Mods: <your name here>
|
|
Packit |
577717 |
* <your email address>
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This file performs the following test: */
|
|
Packit |
577717 |
/* exercise the Itanium data address range interface */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define NUM 16384
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void init_array( void );
|
|
Packit |
577717 |
static int do_malloc_work( long loop );
|
|
Packit |
577717 |
static int do_static_work( long loop );
|
|
Packit |
577717 |
static void measure_load_store( caddr_t start, caddr_t end );
|
|
Packit |
577717 |
static void measure_event( int index, PAPI_option_t * option );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int *parray1, *parray2, *parray3;
|
|
Packit |
577717 |
int array1[NUM], array2[NUM], array3[NUM];
|
|
Packit |
577717 |
char event_name[2][PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
int PAPI_event[2];
|
|
Packit |
577717 |
int EventSet = PAPI_NULL;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
const PAPI_exe_info_t *prginfo = NULL;
|
|
Packit |
577717 |
const PAPI_hw_info_t *hw_info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
tests_quiet( argc, argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if !defined(ITANIUM2) && !defined(ITANIUM3)
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "Currently only works on itanium2", 0 );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
tests_quiet( argc, argv ); /* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
init_array( );
|
|
Packit |
577717 |
printf( "Malloc'd array pointers: %p %p %p\n", &parray1, &parray2,
|
|
Packit |
577717 |
&parray3 );
|
|
Packit |
577717 |
printf( "Malloc'd array addresses: %p %p %p\n", parray1, parray2,
|
|
Packit |
577717 |
parray3 );
|
|
Packit |
577717 |
printf( "Static array addresses: %p %p %p\n", &array1, &array2,
|
|
Packit |
577717 |
&array3 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
tests_quiet( argc, argv ); /* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval =
|
|
Packit |
577717 |
PAPI_library_init( PAPI_VER_CURRENT ) ) != PAPI_VER_CURRENT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
|
|
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 |
prginfo = PAPI_get_executable_info( );
|
|
Packit |
577717 |
if ( prginfo == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_get_executable_info", 1 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if defined(linux) && defined(__ia64__)
|
|
Packit |
577717 |
sprintf( event_name[0], "loads_retired" );
|
|
Packit |
577717 |
sprintf( event_name[1], "stores_retired" );
|
|
Packit |
577717 |
PAPI_event_name_to_code( event_name[0], &PAPI_event[0] );
|
|
Packit |
577717 |
PAPI_event_name_to_code( event_name[1], &PAPI_event[1] );
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "only works for Itanium", PAPI_ENOSUPP );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_create_eventset( &EventSet ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_cleanup_eventset( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_assign_eventset_component( EventSet, 0 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_assign_eventset_component",
|
|
Packit |
577717 |
retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/***************************************************************************************/
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "\n\nMeasure loads and stores on the pointers to the allocated arrays\n" );
|
|
Packit |
577717 |
printf( "Expected loads: %d; Expected stores: 0\n", NUM * 2 );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "These loads result from accessing the pointers to compute array addresses.\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "They will likely disappear with higher levels of optimization.\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) & parray1, ( caddr_t ) ( &parray1 + 1 ) );
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) & parray2, ( caddr_t ) ( &parray2 + 1 ) );
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) & parray3, ( caddr_t ) ( &parray3 + 1 ) );
|
|
Packit |
577717 |
/***************************************************************************************/
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "\n\nMeasure loads and stores on the allocated arrays themselves\n" );
|
|
Packit |
577717 |
printf( "Expected loads: %d; Expected stores: %d\n", NUM, NUM );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) parray1, ( caddr_t ) ( parray1 + NUM ) );
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) parray2, ( caddr_t ) ( parray2 + NUM ) );
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) parray3, ( caddr_t ) ( parray3 + NUM ) );
|
|
Packit |
577717 |
/***************************************************************************************/
|
|
Packit |
577717 |
printf( "\n\nMeasure loads and stores on the static arrays\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "These values will differ from the expected values by the size of the offsets.\n" );
|
|
Packit |
577717 |
printf( "Expected loads: %d; Expected stores: %d\n", NUM, NUM );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) array1, ( caddr_t ) ( array1 + NUM ) );
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) array2, ( caddr_t ) ( array2 + NUM ) );
|
|
Packit |
577717 |
measure_load_store( ( caddr_t ) array3, ( caddr_t ) ( array3 + NUM ) );
|
|
Packit |
577717 |
/***************************************************************************************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_destroy_eventset( &EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_destroy", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
free( parray1 );
|
|
Packit |
577717 |
free( parray2 );
|
|
Packit |
577717 |
free( parray3 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
measure_load_store( caddr_t start, caddr_t end )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
PAPI_option_t option;
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* set up the optional address structure for starting and ending data addresses */
|
|
Packit |
577717 |
option.addr.eventset = EventSet;
|
|
Packit |
577717 |
option.addr.start = start;
|
|
Packit |
577717 |
option.addr.end = end;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_set_opt( PAPI_DATA_ADDRESS, &option ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_opt(PAPI_DATA_ADDRESS)",
|
|
Packit |
577717 |
retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
measure_event( 0, &option );
|
|
Packit |
577717 |
measure_event( 1, &option );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
measure_event( int index, PAPI_option_t * option )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
long long value;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet, PAPI_event[index] ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( index == 0 ) {
|
|
Packit |
577717 |
/* if ((retval = PAPI_get_opt(PAPI_DATA_ADDRESS, option)) != PAPI_OK)
|
|
Packit |
577717 |
test_fail(__FILE__, __LINE__, "PAPI_get_opt(PAPI_DATA_ADDRESS)", retval);
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "Requested Start Address: %p; Start Offset: %#5x; Actual Start Address: %p\n",
|
|
Packit |
577717 |
option->addr.start, option->addr.start_off,
|
|
Packit |
577717 |
option->addr.start - option->addr.start_off );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "Requested End Address: %p; End Offset: %#5x; Actual End Address: %p\n",
|
|
Packit |
577717 |
option->addr.end, option->addr.end_off,
|
|
Packit |
577717 |
option->addr.end + option->addr.end_off );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
do_malloc_work( NUM );
|
|
Packit |
577717 |
do_static_work( NUM );
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet, &value );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "%s: %lld\n", event_name[index], value );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval =
|
|
Packit |
577717 |
PAPI_remove_event( EventSet, PAPI_event[index] ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_remove_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
init_array( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
parray1 = ( int * ) malloc( NUM * sizeof ( int ) );
|
|
Packit |
577717 |
if ( parray1 == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "No memory available!\n", 0 );
|
|
Packit |
577717 |
memset( parray1, 0x0, NUM * sizeof ( int ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
parray2 = ( int * ) malloc( NUM * sizeof ( int ) );
|
|
Packit |
577717 |
if ( parray2 == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "No memory available!\n", 0 );
|
|
Packit |
577717 |
memset( parray2, 0x0, NUM * sizeof ( int ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
parray3 = ( int * ) malloc( NUM * sizeof ( int ) );
|
|
Packit |
577717 |
if ( parray3 == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "No memory available!\n", 0 );
|
|
Packit |
577717 |
memset( parray3, 0x0, NUM * sizeof ( int ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
do_static_work( long loop )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
int sum = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < loop; i++ ) {
|
|
Packit |
577717 |
array1[i] = i;
|
|
Packit |
577717 |
sum += array1[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < loop; i++ ) {
|
|
Packit |
577717 |
array2[i] = i;
|
|
Packit |
577717 |
sum += array2[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < loop; i++ ) {
|
|
Packit |
577717 |
array3[i] = i;
|
|
Packit |
577717 |
sum += array3[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return sum;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
do_malloc_work( long loop )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
int sum = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < loop; i++ ) {
|
|
Packit |
577717 |
parray1[i] = i;
|
|
Packit |
577717 |
sum += parray1[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < loop; i++ ) {
|
|
Packit |
577717 |
parray2[i] = i;
|
|
Packit |
577717 |
sum += parray2[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < loop; i++ ) {
|
|
Packit |
577717 |
parray3[i] = i;
|
|
Packit |
577717 |
sum += parray3[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return sum;
|
|
Packit |
577717 |
}
|