|
Packit |
577717 |
/**
|
|
Packit |
577717 |
* @file linux-mx.c
|
|
Packit |
577717 |
* @brief A component for Myricom MX (Myrinet Express)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_internal.h"
|
|
Packit |
577717 |
#include "papi_vector.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <ctype.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define MX_MAX_COUNTERS 100
|
|
Packit |
577717 |
#define MX_MAX_COUNTER_TERMS MX_MAX_COUNTERS
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define LINELEN 128
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct MX_register
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
/* indicate which counters this event can live on */
|
|
Packit |
577717 |
unsigned int selector;
|
|
Packit |
577717 |
} MX_register_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct MX_native_event_entry
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
/* description of the resources required by this native event */
|
|
Packit |
577717 |
MX_register_t resources;
|
|
Packit |
577717 |
/* If it exists, then this is the name of this event */
|
|
Packit |
577717 |
char *name;
|
|
Packit |
577717 |
/* If it exists, then this is the description of this event */
|
|
Packit |
577717 |
char *description;
|
|
Packit |
577717 |
} MX_native_event_entry_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct MX_reg_alloc
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
MX_register_t ra_bits;
|
|
Packit |
577717 |
} MX_reg_alloc_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct MX_control_state
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
long long start_count[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
long long current_count[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
long long difference[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
int which_counter[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
int num_events;
|
|
Packit |
577717 |
} MX_control_state_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct MX_context
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
MX_control_state_t state;
|
|
Packit |
577717 |
} MX_context_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static const MX_native_event_entry_t mx_native_table[] = {
|
|
Packit |
577717 |
{{1, }, "LANAI_UPTIME", "Lanai uptime (seconds)"},
|
|
Packit |
577717 |
{{2, }, "COUNTERS_UPTIME", "Counters uptime (seconds)"},
|
|
Packit |
577717 |
{{3, }, "BAD_CRC8", "Bad CRC8 (Port 0)"},
|
|
Packit |
577717 |
{{4, }, "BAD_CRC32", "Bad CRC32 (Port 0)"},
|
|
Packit |
577717 |
{{5, }, "UNSTRIPPED_ROUTE", "Unstripped route (Port 0)"},
|
|
Packit |
577717 |
{{6, }, "PKT_DESC_INVALID", "pkt_desc_invalid (Port 0)"},
|
|
Packit |
577717 |
{{7, }, "RECV_PKT_ERRORS", "recv_pkt_errors (Port 0)"},
|
|
Packit |
577717 |
{{8, }, "PKT_MISROUTED", "pkt_misrouted (Port 0)"},
|
|
Packit |
577717 |
{{9, }, "DATA_SRC_UNKNOWN", "data_src_unknown"},
|
|
Packit |
577717 |
{{10, }, "DATA_BAD_ENDPT", "data_bad_endpt"},
|
|
Packit |
577717 |
{{11, }, "DATA_ENDPT_CLOSED", "data_endpt_closed"},
|
|
Packit |
577717 |
{{12, }, "DATA_BAD_SESSION", "data_bad_session"},
|
|
Packit |
577717 |
{{13, }, "PUSH_BAD_WINDOW", "push_bad_window"},
|
|
Packit |
577717 |
{{14, }, "PUSH_DUPLICATE", "push_duplicate"},
|
|
Packit |
577717 |
{{15, }, "PUSH_OBSOLETE", "push_obsolete"},
|
|
Packit |
577717 |
{{16, }, "PUSH_RACE_DRIVER", "push_race_driver"},
|
|
Packit |
577717 |
{{17, }, "PUSH_BAD_SEND_HANDLE_MAGIC", "push_bad_send_handle_magic"},
|
|
Packit |
577717 |
{{18, }, "PUSH_BAD_SRC_MAGIC", "push_bad_src_magic"},
|
|
Packit |
577717 |
{{19, }, "PULL_OBSOLETE", "pull_obsolete"},
|
|
Packit |
577717 |
{{20, }, "PULL_NOTIFY_OBSOLETE", "pull_notify_obsolete"},
|
|
Packit |
577717 |
{{21, }, "PULL_RACE_DRIVER", "pull_race_driver"},
|
|
Packit |
577717 |
{{22, }, "ACK_BAD_TYPE", "ack_bad_type"},
|
|
Packit |
577717 |
{{23, }, "ACK_BAD_MAGIC", "ack_bad_magic"},
|
|
Packit |
577717 |
{{24, }, "ACK_RESEND_RACE", "ack_resend_race"},
|
|
Packit |
577717 |
{{25, }, "LATE_ACK", "Late ack"},
|
|
Packit |
577717 |
{{26, }, "ACK_NACK_FRAMES_IN_PIPE", "ack_nack_frames_in_pipe"},
|
|
Packit |
577717 |
{{27, }, "NACK_BAD_ENDPT", "nack_bad_endpt"},
|
|
Packit |
577717 |
{{28, }, "NACK_ENDPT_CLOSED", "nack_endpt_closed"},
|
|
Packit |
577717 |
{{29, }, "NACK_BAD_SESSION", "nack_bad_session"},
|
|
Packit |
577717 |
{{30, }, "NACK_BAD_RDMAWIN", "nack_bad_rdmawin"},
|
|
Packit |
577717 |
{{31, }, "NACK_EVENTQ_FULL", "nack_eventq_full"},
|
|
Packit |
577717 |
{{32, }, "SEND_BAD_RDMAWIN", "send_bad_rdmawin"},
|
|
Packit |
577717 |
{{33, }, "CONNECT_TIMEOUT", "connect_timeout"},
|
|
Packit |
577717 |
{{34, }, "CONNECT_SRC_UNKNOWN", "connect_src_unknown"},
|
|
Packit |
577717 |
{{35, }, "QUERY_BAD_MAGIC", "query_bad_magic"},
|
|
Packit |
577717 |
{{36, }, "QUERY_TIMED_OUT", "query_timed_out"},
|
|
Packit |
577717 |
{{37, }, "QUERY_SRC_UNKNOWN", "query_src_unknown"},
|
|
Packit |
577717 |
{{38, }, "RAW_SENDS", "Raw sends (Port 0)"},
|
|
Packit |
577717 |
{{39, }, "RAW_RECEIVES", "Raw receives (Port 0)"},
|
|
Packit |
577717 |
{{40, }, "RAW_OVERSIZED_PACKETS", "Raw oversized packets (Port 0)"},
|
|
Packit |
577717 |
{{41, }, "RAW_RECV_OVERRUN", "raw_recv_overrun"},
|
|
Packit |
577717 |
{{42, }, "RAW_DISABLED", "raw_disabled"},
|
|
Packit |
577717 |
{{43, }, "CONNECT_SEND", "connect_send"},
|
|
Packit |
577717 |
{{44, }, "CONNECT_RECV", "connect_recv"},
|
|
Packit |
577717 |
{{45, }, "ACK_SEND", "ack_send (Port 0)"},
|
|
Packit |
577717 |
{{46, }, "ACK_RECV", "ack_recv (Port 0)"},
|
|
Packit |
577717 |
{{47, }, "PUSH_SEND", "push_send (Port 0)"},
|
|
Packit |
577717 |
{{48, }, "PUSH_RECV", "push_recv (Port 0)"},
|
|
Packit |
577717 |
{{49, }, "QUERY_SEND", "query_send (Port 0)"},
|
|
Packit |
577717 |
{{50, }, "QUERY_RECV", "query_recv (Port 0)"},
|
|
Packit |
577717 |
{{51, }, "REPLY_SEND", "reply_send (Port 0)"},
|
|
Packit |
577717 |
{{52, }, "REPLY_RECV", "reply_recv (Port 0)"},
|
|
Packit |
577717 |
{{53, }, "QUERY_UNKNOWN", "query_unknown (Port 0)"},
|
|
Packit |
577717 |
/* {{ 54, }, "QUERY_UNKNOWN", "query_unknown (Port 0)"},*/
|
|
Packit |
577717 |
{{55, }, "DATA_SEND_NULL", "data_send_null (Port 0)"},
|
|
Packit |
577717 |
{{56, }, "DATA_SEND_SMALL", "data_send_small (Port 0)"},
|
|
Packit |
577717 |
{{57, }, "DATA_SEND_MEDIUM", "data_send_medium (Port 0)"},
|
|
Packit |
577717 |
{{58, }, "DATA_SEND_RNDV", "data_send_rndv (Port 0)"},
|
|
Packit |
577717 |
{{59, }, "DATA_SEND_PULL", "data_send_pull (Port 0)"},
|
|
Packit |
577717 |
{{60, }, "DATA_RECV_NULL", "data_recv_null (Port 0)"},
|
|
Packit |
577717 |
{{61, }, "DATA_RECV_SMALL_INLINE", "data_recv_small_inline (Port 0)"},
|
|
Packit |
577717 |
{{62, }, "DATA_RECV_SMALL_COPY", "data_recv_small_copy (Port 0)"},
|
|
Packit |
577717 |
{{63, }, "DATA_RECV_MEDIUM", "data_recv_medium (Port 0)"},
|
|
Packit |
577717 |
{{64, }, "DATA_RECV_RNDV", "data_recv_rndv (Port 0)"},
|
|
Packit |
577717 |
{{65, }, "DATA_RECV_PULL", "data_recv_pull (Port 0)"},
|
|
Packit |
577717 |
{{66, }, "ETHER_SEND_UNICAST_CNT", "ether_send_unicast_cnt (Port 0)"},
|
|
Packit |
577717 |
{{67, }, "ETHER_SEND_MULTICAST_CNT", "ether_send_multicast_cnt (Port 0)"},
|
|
Packit |
577717 |
{{68, }, "ETHER_RECV_SMALL_CNT", "ether_recv_small_cnt (Port 0)"},
|
|
Packit |
577717 |
{{69, }, "ETHER_RECV_BIG_CNT", "ether_recv_big_cnt (Port 0)"},
|
|
Packit |
577717 |
{{70, }, "ETHER_OVERRUN", "ether_overrun"},
|
|
Packit |
577717 |
{{71, }, "ETHER_OVERSIZED", "ether_oversized"},
|
|
Packit |
577717 |
{{72, }, "DATA_RECV_NO_CREDITS", "data_recv_no_credits"},
|
|
Packit |
577717 |
{{73, }, "PACKETS_RECENT", "Packets resent"},
|
|
Packit |
577717 |
{{74, }, "PACKETS_DROPPED", "Packets dropped (data send side)"},
|
|
Packit |
577717 |
{{75, }, "MAPPER_ROUTES_UPDATE", "Mapper routes update"},
|
|
Packit |
577717 |
{{76, }, "ROUTE_DISPERSION", "Route dispersion (Port 0)"},
|
|
Packit |
577717 |
{{77, }, "OUT_OF_SEND_HANDLES", "out_of_send_handles"},
|
|
Packit |
577717 |
{{78, }, "OUT_OF_PULL_HANDLES", "out_of_pull_handles"},
|
|
Packit |
577717 |
{{79, }, "OUT_OF_PUSH_HANDLES", "out_of_push_handles"},
|
|
Packit |
577717 |
{{80, }, "MEDIUM_CONT_RACE", "medium_cont_race"},
|
|
Packit |
577717 |
{{81, }, "CMD_TYPE_UNKNOWN", "cmd_type_unknown"},
|
|
Packit |
577717 |
{{82, }, "UREQ_TYPE_UNKNOWN", "ureq_type_unknown"},
|
|
Packit |
577717 |
{{83, }, "INTERRUPTS_OVERRUN", "Interrupts overrun"},
|
|
Packit |
577717 |
{{84, }, "WAITING_FOR_INTERRUPT_DMA", "Waiting for interrupt DMA"},
|
|
Packit |
577717 |
{{85, }, "WAITING_FOR_INTERRUPT_ACK", "Waiting for interrupt Ack"},
|
|
Packit |
577717 |
{{86, }, "WAITING_FOR_INTERRUPT_TIMER", "Waiting for interrupt Timer"},
|
|
Packit |
577717 |
{{87, }, "SLABS_RECYCLING", "Slabs recycling"},
|
|
Packit |
577717 |
{{88, }, "SLABS_PRESSURE", "Slabs pressure"},
|
|
Packit |
577717 |
{{89, }, "SLABS_STARVATION", "Slabs starvation"},
|
|
Packit |
577717 |
{{90, }, "OUT_OF_RDMA_HANDLES", "out_of_rdma handles"},
|
|
Packit |
577717 |
{{91, }, "EVENTQ_FULL", "eventq_full"},
|
|
Packit |
577717 |
{{92, }, "BUFFER_DROP", "buffer_drop (Port 0)"},
|
|
Packit |
577717 |
{{93, }, "MEMORY_DROP", "memory_drop (Port 0)"},
|
|
Packit |
577717 |
{{94, }, "HARDWARE_FLOW_CONTROL", "Hardware flow control (Port 0)"},
|
|
Packit |
577717 |
{{95, }, "SIMULATED_PACKETS_LOST", "(Devel) Simulated packets lost (Port 0)"},
|
|
Packit |
577717 |
{{96, }, "LOGGING_FRAMES_DUMPED", "(Logging) Logging frames dumped"},
|
|
Packit |
577717 |
{{97, }, "WAKE_INTERRUPTS", "Wake interrupts"},
|
|
Packit |
577717 |
{{98, }, "AVERTED_WAKEUP_RACE", "Averted wakeup race"},
|
|
Packit |
577717 |
{{99, }, "DMA_METADATA_RACE", "Dma metadata race"},
|
|
Packit |
577717 |
{{0, }, "", ""}
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int num_events=0;
|
|
Packit |
577717 |
papi_vector_t _mx_vector;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static char mx_counters_exe[BUFSIZ];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
read_mx_counters( long long *counters )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
FILE *fp;
|
|
Packit |
577717 |
char line[LINELEN];
|
|
Packit |
577717 |
int i, linenum;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Open a pipe to the mx_counters executable */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
fp = popen( mx_counters_exe, "r" );
|
|
Packit |
577717 |
if ( !fp ) {
|
|
Packit |
577717 |
perror( "popen" );
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* A line of output looks something similar to: */
|
|
Packit |
577717 |
/* " Lanai uptime (seconds): 766268 (0xbb13c)" */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This code may fail if number of ports on card > 1 */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
linenum = 0;
|
|
Packit |
577717 |
while ( fgets( line, LINELEN, fp ) ) {
|
|
Packit |
577717 |
// printf("%s",line);
|
|
Packit |
577717 |
for(i=0; line[i]!= '\0' && i
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* skip to colon */
|
|
Packit |
577717 |
if (line[i]==':') {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* read in value */
|
|
Packit |
577717 |
if (line[i+1]!='\0') {
|
|
Packit |
577717 |
// printf("Line %d trying %s",linenum,&line[i+1]);
|
|
Packit |
577717 |
sscanf(&line[i+1],"%lld",&counters[linenum]);
|
|
Packit |
577717 |
linenum++;
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (linenum>=MX_MAX_COUNTERS) break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pclose( fp );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Component setup and shutdown
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize hardware counters, setup the function vector table
|
|
Packit |
577717 |
* and get hardware information, this routine is called when the
|
|
Packit |
577717 |
* PAPI process is initialized (IE PAPI_library_init)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_init_component( int cidx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
FILE *fff;
|
|
Packit |
577717 |
char test_string[BUFSIZ];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* detect if MX available */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strncpy(mx_counters_exe,"mx_counters 2> /dev/null",BUFSIZ);
|
|
Packit |
577717 |
fff=popen(mx_counters_exe,"r");
|
|
Packit |
577717 |
/* popen only returns NULL if "sh" fails, not the actual command */
|
|
Packit |
577717 |
if (fgets(test_string,BUFSIZ,fff)==NULL) {
|
|
Packit |
577717 |
pclose(fff);
|
|
Packit |
577717 |
strncpy(mx_counters_exe,"./components/mx/utils/fake_mx_counters 2> /dev/null",BUFSIZ);
|
|
Packit |
577717 |
fff=popen(mx_counters_exe,"r");
|
|
Packit |
577717 |
if (fgets(test_string,BUFSIZ,fff)==NULL) {
|
|
Packit |
577717 |
pclose(fff);
|
|
Packit |
577717 |
/* neither real nor fake found */
|
|
Packit |
577717 |
strncpy(_mx_vector.cmp_info.disabled_reason,
|
|
Packit |
577717 |
"No MX utilities found",PAPI_MAX_STR_LEN);
|
|
Packit |
577717 |
return PAPI_ECMP;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
pclose(fff);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
num_events=MX_MAX_COUNTERS;
|
|
Packit |
577717 |
_mx_vector.cmp_info.num_native_events=num_events;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Export the component id */
|
|
Packit |
577717 |
_mx_vector.cmp_info.CmpIdx = cidx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* This is called whenever a thread is initialized
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_init_thread( hwd_context_t * ctx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_shutdown_component(void)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_shutdown_thread( hwd_context_t * ctx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Control of counters (Reading/Writing/Starting/Stopping/Setup)
|
|
Packit |
577717 |
* functions
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_init_control_state( hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctl; /*unused */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_update_control_state( hwd_control_state_t *ctl, NativeInfo_t *native,
|
|
Packit |
577717 |
int count, hwd_context_t *ctx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
int i, index;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0; i
|
|
Packit |
577717 |
index = native[i].ni_event;
|
|
Packit |
577717 |
mx_ctl->which_counter[i]=index;
|
|
Packit |
577717 |
// printf("Mapping event# %d to HW counter %d (count=%d)\n",
|
|
Packit |
577717 |
// i,index,count);
|
|
Packit |
577717 |
native[i].ni_position = i;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
mx_ctl->num_events=count;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_start( hwd_context_t *ctx, hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
long long mx_counters[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
read_mx_counters( mx_counters );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
// for(i=0;i
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0;i<mx_ctl->num_events;i++) {
|
|
Packit |
577717 |
mx_ctl->current_count[i]=
|
|
Packit |
577717 |
mx_counters[mx_ctl->which_counter[i]];
|
|
Packit |
577717 |
mx_ctl->start_count[i]=mx_ctl->current_count[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_stop( hwd_context_t *ctx, hwd_control_state_t *ctl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
long long mx_counters[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
read_mx_counters( mx_counters );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0;i<mx_ctl->num_events;i++) {
|
|
Packit |
577717 |
mx_ctl->current_count[i]=
|
|
Packit |
577717 |
mx_counters[mx_ctl->which_counter[i]];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_read( hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events,
|
|
Packit |
577717 |
int flags )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
( void ) flags; /*unused */
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
long long mx_counters[MX_MAX_COUNTERS];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
read_mx_counters( mx_counters );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < mx_ctl->num_events; i++ ) {
|
|
Packit |
577717 |
mx_ctl->current_count[i]=
|
|
Packit |
577717 |
mx_counters[mx_ctl->which_counter[i]];
|
|
Packit |
577717 |
mx_ctl->difference[i] = mx_ctl->current_count[i]-
|
|
Packit |
577717 |
mx_ctl->start_count[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
*events = mx_ctl->difference;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_reset( hwd_context_t * ctx, hwd_control_state_t * ctrl )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
_mx_start( ctx, ctrl );
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Unused write function */
|
|
Packit |
577717 |
/* static int */
|
|
Packit |
577717 |
/* _mx_write( hwd_context_t * ctx, hwd_control_state_t * ctrl, long long *from ) */
|
|
Packit |
577717 |
/* { */
|
|
Packit |
577717 |
/* ( void ) ctx; /\*unused *\/ */
|
|
Packit |
577717 |
/* ( void ) ctrl; /\*unused *\/ */
|
|
Packit |
577717 |
/* ( void ) from; /\*unused *\/ */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* return PAPI_OK; */
|
|
Packit |
577717 |
/* } */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Functions for setting up various options
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This function sets various options in the component
|
|
Packit |
577717 |
* The valid codes being passed in are PAPI_SET_DEFDOM,
|
|
Packit |
577717 |
* PAPI_SET_DOMAIN, PAPI_SETDEFGRN, PAPI_SET_GRANUL * and PAPI_SET_INHERIT
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_ctl( hwd_context_t * ctx, int code, _papi_int_option_t * option )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) ctx; /*unused */
|
|
Packit |
577717 |
( void ) code; /*unused */
|
|
Packit |
577717 |
( void ) option; /*unused */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* This function has to set the bits needed to count different domains
|
|
Packit |
577717 |
* In particular: PAPI_DOM_USER, PAPI_DOM_KERNEL PAPI_DOM_OTHER
|
|
Packit |
577717 |
* By default return PAPI_EINVAL if none of those are specified
|
|
Packit |
577717 |
* and PAPI_OK with success
|
|
Packit |
577717 |
* PAPI_DOM_USER is only user context is counted
|
|
Packit |
577717 |
* PAPI_DOM_KERNEL is only the Kernel/OS context is counted
|
|
Packit |
577717 |
* PAPI_DOM_OTHER is Exception/transient mode (like user TLB misses)
|
|
Packit |
577717 |
* PAPI_DOM_ALL is all of the domains
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_set_domain( hwd_control_state_t * cntrl, int domain )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) cntrl; /*unused */
|
|
Packit |
577717 |
if ( PAPI_DOM_ALL != domain ) {
|
|
Packit |
577717 |
return PAPI_EINVAL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_ntv_code_to_name( unsigned int EventCode, char *name, int len )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int event=EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (event >=0 && event < num_events) {
|
|
Packit |
577717 |
strncpy( name, mx_native_table[event].name, len );
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return PAPI_ENOEVNT;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int event=EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (event >=0 && event < num_events) {
|
|
Packit |
577717 |
strncpy( name, mx_native_table[event].description, len );
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return PAPI_ENOEVNT;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
_mx_ntv_enum_events( unsigned int *EventCode, int modifier )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( modifier == PAPI_ENUM_FIRST ) {
|
|
Packit |
577717 |
if (num_events==0) return PAPI_ENOEVNT;
|
|
Packit |
577717 |
*EventCode = 0;
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( modifier == PAPI_ENUM_EVENTS ) {
|
|
Packit |
577717 |
int index = *EventCode;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( mx_native_table[index + 1].resources.selector ) {
|
|
Packit |
577717 |
*EventCode = *EventCode + 1;
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
return PAPI_ENOEVNT;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_EINVAL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
papi_vector_t _mx_vector = {
|
|
Packit |
577717 |
.cmp_info = {
|
|
Packit |
577717 |
.name = "mx",
|
|
Packit |
577717 |
.short_name = "mx",
|
|
Packit |
577717 |
.version = "1.4",
|
|
Packit |
577717 |
.description = "Myricom MX (Myrinet Express) statistics",
|
|
Packit |
577717 |
.num_mpx_cntrs = MX_MAX_COUNTERS,
|
|
Packit |
577717 |
.num_cntrs = MX_MAX_COUNTERS,
|
|
Packit |
577717 |
.default_domain = PAPI_DOM_ALL,
|
|
Packit |
577717 |
.default_granularity = PAPI_GRN_SYS,
|
|
Packit |
577717 |
.available_granularities = PAPI_GRN_SYS,
|
|
Packit |
577717 |
.hardware_intr_sig = PAPI_INT_SIGNAL,
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* component specific cmp_info initializations */
|
|
Packit |
577717 |
.fast_real_timer = 0,
|
|
Packit |
577717 |
.fast_virtual_timer = 0,
|
|
Packit |
577717 |
.attach = 0,
|
|
Packit |
577717 |
.attach_must_ptrace = 0,
|
|
Packit |
577717 |
.available_domains = PAPI_DOM_ALL,
|
|
Packit |
577717 |
},
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* sizes of framework-opaque component-private structures */
|
|
Packit |
577717 |
.size = {
|
|
Packit |
577717 |
.context = sizeof ( MX_context_t ),
|
|
Packit |
577717 |
.control_state = sizeof ( MX_control_state_t ),
|
|
Packit |
577717 |
.reg_value = sizeof ( MX_register_t ),
|
|
Packit |
577717 |
.reg_alloc = sizeof ( MX_reg_alloc_t ),
|
|
Packit |
577717 |
},
|
|
Packit |
577717 |
/* function pointers in this component */
|
|
Packit |
577717 |
.init_thread = _mx_init_thread,
|
|
Packit |
577717 |
.init_component = _mx_init_component,
|
|
Packit |
577717 |
.init_control_state = _mx_init_control_state,
|
|
Packit |
577717 |
.start = _mx_start,
|
|
Packit |
577717 |
.stop = _mx_stop,
|
|
Packit |
577717 |
.read = _mx_read,
|
|
Packit |
577717 |
.shutdown_thread = _mx_shutdown_thread,
|
|
Packit |
577717 |
.shutdown_component = _mx_shutdown_component,
|
|
Packit |
577717 |
.ctl = _mx_ctl,
|
|
Packit |
577717 |
.update_control_state = _mx_update_control_state,
|
|
Packit |
577717 |
.set_domain = _mx_set_domain,
|
|
Packit |
577717 |
.reset = _mx_reset,
|
|
Packit |
577717 |
|
|
Packit |
577717 |
.ntv_enum_events = _mx_ntv_enum_events,
|
|
Packit |
577717 |
.ntv_code_to_name = _mx_ntv_code_to_name,
|
|
Packit |
577717 |
.ntv_code_to_descr = _mx_ntv_code_to_descr,
|
|
Packit |
577717 |
};
|