PAPI 7.1.0.0
Loading...
Searching...
No Matches
papi_hardware_avail.c
Go to the documentation of this file.
1
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27
28#include "papi.h"
29#include "print_header.h"
30
31typedef struct command_flags
32{
33 int help;
35
36static void
37print_help( char **argv )
38{
39 printf( "This is the PAPI hardware avail program.\n" );
40 printf( "It provides availability of system's equipped hardware devices.\n" );
41 printf( "Usage: %s [options]\n", argv[0] );
42 printf( "Options:\n\n" );
43 printf( " --help, -h print this help message\n" );
44}
45
46static void
47parse_args( int argc, char **argv, command_flags_t * f )
48{
49 int i;
50
51 /* Look for all currently defined commands */
52 memset( f, 0, sizeof ( command_flags_t ) );
53 for ( i = 1; i < argc; i++ ) {
54 if ( !strcmp( argv[i], "-h" ) || !strcmp( argv[i], "--help" ) )
55 f->help = 1;
56 else
57 printf( "%s is not supported\n", argv[i] );
58 }
59
60 /* if help requested, print and bail */
61 if ( f->help ) {
62 print_help( argv );
63 exit( 1 );
64 }
65
66}
67
68int
69main( int argc, char **argv )
70{
71 int i;
72 int retval;
73 const PAPI_component_info_t *cmpinfo = NULL;
74 command_flags_t flags;
75 int numcmp;
76 int sysdetect_avail = 0;
77
78 /* Initialize before parsing the input arguments */
80 if ( retval != PAPI_VER_CURRENT ) {
81 fprintf(stderr,"Error! PAPI_library_init\n");
82 return retval;
83 }
84
85 parse_args( argc, argv, &flags );
86
88 if ( retval != PAPI_OK ) {
89 fprintf(stderr,"Error! PAPI_set_debug\n");
90 return retval;
91 }
92
93 numcmp = PAPI_num_components( );
94 for (i = 0; i < numcmp; i++) {
95 cmpinfo = PAPI_get_component_info( i );
96 if (strcmp("sysdetect", cmpinfo->name) == 0)
97 sysdetect_avail = 1;
98 }
99
100 if (sysdetect_avail == 0) {
101 fprintf(stderr, "Error! Sysdetect component not enabled\n");
102 return 0;
103 }
104
105 printf( "\nDevice Summary -----------------------------------------------------------------\n" );
106 void *handle;
107 int enum_modifier = PAPI_DEV_TYPE_ENUM__ALL;
108 int id, vendor_id, dev_count;
109 const char *vendor_name, *status;
110
111 printf( "Vendor DevCount \n" );
112 while (PAPI_enum_dev_type(enum_modifier, &handle) == PAPI_OK) {
116
117 printf( "%-18s (%d)\n", vendor_name, dev_count);
118 printf( " \\-> Status: %s\n", status );
119 printf( "\n" );
120 }
121
122 printf( "\nDevice Information -------------------------------------------------------------\n" );
123
124 while (PAPI_enum_dev_type(enum_modifier, &handle) == PAPI_OK) {
129
130 if ( id == PAPI_DEV_TYPE_ID__CPU && dev_count > 0 ) {
131 unsigned int numas = 1;
132 for ( i = 0; i < dev_count; ++i ) {
133 const char *cpu_name;
134 unsigned int family, model, stepping;
135 unsigned int sockets, cores, threads;
136 unsigned int l1i_size, l1d_size, l2u_size, l3u_size;
137 unsigned int l1i_line_sz, l1d_line_sz, l2u_line_sz, l3u_line_sz;
138 unsigned int l1i_line_cnt, l1d_line_cnt, l2u_line_cnt, l3u_line_cnt;
139 unsigned int l1i_cache_ass, l1d_cache_ass, l2u_cache_ass, l3u_cache_ass;
140
165
166 printf( "Vendor : %s (%u,0x%x)\n",
167 vendor_name,
168 vendor_id,
169 vendor_id );
170 printf( "Id : %u\n", i );
171 printf( "Name : %s\n", cpu_name );
172 printf( "CPUID : Family/Model/Stepping %u/%u/%u 0x%02x/0x%02x/0x%02x\n",
174 printf( "Sockets : %u\n", sockets );
175 printf( "Numa regions : %u\n", numas );
176 printf( "Cores per socket : %u\n", cores );
177 printf( "Cores per NUMA region : %u\n", threads / numas );
178 printf( "SMT threads per core : %u\n", threads / sockets / cores );
179
180 if (l1i_size > 0) {
181 printf( "L1i Cache : Size/LineSize/Lines/Assoc %uKB/%uB/%u/%u\n",
182 l1i_size >> 10, l1i_line_sz, l1i_line_cnt, l1i_cache_ass);
183 printf( "L1d Cache : Size/LineSize/Lines/Assoc %uKB/%uB/%u/%u\n",
184 l1d_size >> 10, l1d_line_sz, l1d_line_cnt, l1d_cache_ass);
185 }
186
187 if (l2u_size > 0) {
188 printf( "L2 Cache : Size/LineSize/Lines/Assoc %uKB/%uB/%u/%u\n",
189 l2u_size >> 10, l2u_line_sz, l2u_line_cnt, l2u_cache_ass );
190 }
191
192 if (l3u_size > 0) {
193 printf( "L3 Cache : Size/LineSize/Lines/Assoc %uKB/%uB/%u/%u\n",
194 l3u_size >> 10, l3u_line_sz, l3u_line_cnt, l3u_cache_ass );
195 }
196
197#define MAX_NUMA_NODES (16)
198#define MAX_CPU_THREADS (512)
199 unsigned int j;
200 unsigned int affinity[MAX_CPU_THREADS];
201 unsigned int numa_threads_count[MAX_NUMA_NODES] = { 0 };
202 unsigned int numa_threads[MAX_NUMA_NODES][MAX_CPU_THREADS];
203 for (j = 0; j < threads; ++j) {
205 numa_threads[affinity[j]][numa_threads_count[affinity[j]]++] = j;
206 }
207
208 for ( j = 0; j < numas; ++j ) {
209 unsigned int k, memsize;
211 printf( "Numa Node %u Memory : %uMB\n", j, memsize );
212 printf( "Numa Node %u Threads : ", j );
213 for (k = 0; k < numa_threads_count[j]; ++k) {
214 printf( "%u ", numa_threads[j][k] );
215 }
216 printf( "\n" );
217 }
218 printf( "\n" );
219 }
220 }
221
222 if ( id == PAPI_DEV_TYPE_ID__CUDA && dev_count > 0 ) {
223 printf( "Vendor : %s\n", vendor_name );
224
225 for ( i = 0; i < dev_count; ++i ) {
226 unsigned long uid;
227 unsigned int warp_size, thread_per_block, block_per_sm;
228 unsigned int shm_per_block, shm_per_sm;
229 unsigned int blk_dim_x, blk_dim_y, blk_dim_z;
230 unsigned int grd_dim_x, grd_dim_y, grd_dim_z;
231 unsigned int sm_count, multi_kernel, map_host_mem, async_memcpy;
232 unsigned int unif_addr, managed_mem;
233 unsigned int cc_major, cc_minor;
234 const char *dev_name;
235
257
258 printf( "Id : %d\n", i );
259 printf( "UID : %lu\n", uid );
260 printf( "Name : %s\n", dev_name );
261 printf( "Warp size : %u\n", warp_size );
262 printf( "Max threads per block : %u\n", thread_per_block );
263 printf( "Max blocks per multiprocessor : %u\n", block_per_sm );
264 printf( "Max shared memory per block : %u\n", shm_per_block );
265 printf( "Max shared memory per multiprocessor : %u\n", shm_per_sm );
266 printf( "Max block dim x : %u\n", blk_dim_x );
267 printf( "Max block dim y : %u\n", blk_dim_y );
268 printf( "Max block dim z : %u\n", blk_dim_z );
269 printf( "Max grid dim x : %u\n", grd_dim_x );
270 printf( "Max grid dim y : %u\n", grd_dim_y );
271 printf( "Max grid dim z : %u\n", grd_dim_z );
272 printf( "Multiprocessor count : %u\n", sm_count );
273 printf( "Multiple kernels per context : %s\n", multi_kernel ? "yes" : "no" );
274 printf( "Can map host memory : %s\n", map_host_mem ? "yes" : "no");
275 printf( "Can overlap compute and data transfer : %s\n", async_memcpy ? "yes" : "no" );
276 printf( "Has unified addressing : %s\n", unif_addr ? "yes" : "no" );
277 printf( "Has managed memory : %s\n", managed_mem ? "yes" : "no" );
278 printf( "Compute capability : %u.%u\n", cc_major, cc_minor );
279 printf( "\n" );
280 }
281 }
282
283 if ( id == PAPI_DEV_TYPE_ID__ROCM && dev_count > 0 ) {
284 printf( "Vendor : %s\n", vendor_name );
285
286 unsigned long uid;
287 const char *dev_name;
288 unsigned int wf_size, simd_per_cu, wg_size;
289 unsigned int wf_per_cu, shm_per_wg, wg_dim_x, wg_dim_y, wg_dim_z;
290 unsigned int grd_dim_x, grd_dim_y, grd_dim_z;
291 unsigned int cu_count;
292 unsigned int cc_major, cc_minor;
293
294 for ( i = 0; i < dev_count; ++i ) {
311
312 printf( "Id : %d\n", i );
313 printf( "Name : %s\n", dev_name );
314 printf( "Wavefront size : %u\n", wf_size );
315 printf( "SIMD per compute unit : %u\n", simd_per_cu );
316 printf( "Max threads per workgroup : %u\n", wg_size );
317 printf( "Max waves per compute unit : %u\n", wf_per_cu );
318 printf( "Max shared memory per workgroup : %u\n", shm_per_wg );
319 printf( "Max workgroup dim x : %u\n", wg_dim_x );
320 printf( "Max workgroup dim y : %u\n", wg_dim_y );
321 printf( "Max workgroup dim z : %u\n", wg_dim_z );
322 printf( "Max grid dim x : %u\n", grd_dim_x );
323 printf( "Max grid dim y : %u\n", grd_dim_y );
324 printf( "Max grid dim z : %u\n", grd_dim_z );
325 printf( "Compute unit count : %u\n", cu_count );
326 printf( "Compute capability : %u.%u\n", cc_major, cc_minor );
327 printf( "\n" );
328 }
329 }
330 }
331
332 printf( "--------------------------------------------------------------------------------\n" );
333
335 return 0;
336}
static papi_handle_t handle
Definition: Gamum.c:21
int i
returns handle of next device type
get information about a specific software component
returns device attributes
returns device type attributes
initialize the PAPI library.
Get the number of components available on the system.
Set the current debug level for error output from PAPI.
Finish using PAPI and free all related resources.
double f(double a)
Definition: cpi.c:23
#define PAPI_DEV_ATTR__ROCM_UINT_WG_DIM_Y
Definition: f90papi.h:169
#define PAPI_DEV_ATTR__CUDA_UINT_THR_PER_BLK
Definition: f90papi.h:226
#define PAPI_DEV_ATTR__CUDA_UINT_WARP_SIZE
Definition: f90papi.h:114
#define PAPI_DEV_ATTR__CPU_UINT_L1D_CACHE_LINE_COUNT
Definition: f90papi.h:32
#define PAPI_DEV_ATTR__ROCM_UINT_GRD_DIM_Y
Definition: f90papi.h:258
#define PAPI_VER_CURRENT
Definition: f90papi.h:54
#define PAPI_DEV_ATTR__ROCM_UINT_WAVE_PER_CU
Definition: f90papi.h:163
#define PAPI_DEV_ATTR__CUDA_UINT_BLK_PER_SM
Definition: f90papi.h:156
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_DEV_ATTR__CUDA_ULONG_UID
Definition: f90papi.h:192
#define PAPI_DEV_TYPE_ENUM__ALL
Definition: f90papi.h:201
#define PAPI_DEV_ATTR__CPU_UINT_FAMILY
Definition: f90papi.h:142
#define PAPI_DEV_TYPE_ID__CUDA
Definition: f90papi.h:186
#define PAPI_DEV_ATTR__CPU_UINT_SOCKET_COUNT
Definition: f90papi.h:125
#define PAPI_DEV_TYPE_ATTR__INT_PAPI_ID
Definition: f90papi.h:59
#define PAPI_VERB_ECONT
Definition: f90papi.h:164
#define PAPI_DEV_ATTR__CPU_UINT_L1I_CACHE_LINE_SIZE
Definition: f90papi.h:213
#define PAPI_DEV_ATTR__CUDA_UINT_BLK_DIM_Z
Definition: f90papi.h:117
#define PAPI_DEV_ATTR__ROCM_UINT_WAVEFRONT_SIZE
Definition: f90papi.h:252
#define PAPI_DEV_ATTR__CUDA_UINT_UNIFIED_ADDR
Definition: f90papi.h:279
#define PAPI_DEV_ATTR__CUDA_UINT_SM_COUNT
Definition: f90papi.h:249
#define PAPI_DEV_ATTR__CPU_UINT_L3U_CACHE_ASSOC
Definition: f90papi.h:35
#define PAPI_DEV_ATTR__CUDA_UINT_GRD_DIM_Y
Definition: f90papi.h:106
#define PAPI_DEV_ATTR__CPU_UINT_L1I_CACHE_SIZE
Definition: f90papi.h:251
#define PAPI_DEV_ATTR__CPU_UINT_L3U_CACHE_LINE_SIZE
Definition: f90papi.h:128
#define PAPI_DEV_ATTR__CPU_UINT_THREAD_COUNT
Definition: f90papi.h:181
#define PAPI_DEV_TYPE_ATTR__INT_COUNT
Definition: f90papi.h:140
#define PAPI_DEV_ATTR__CPU_UINT_NUMA_COUNT
Definition: f90papi.h:18
#define PAPI_DEV_TYPE_ATTR__INT_VENDOR_ID
Definition: f90papi.h:116
#define PAPI_DEV_ATTR__CPU_UINT_L1I_CACHE_LINE_COUNT
Definition: f90papi.h:56
#define PAPI_DEV_ATTR__CUDA_UINT_MANAGED_MEM
Definition: f90papi.h:183
#define PAPI_DEV_ATTR__CPU_UINT_L3U_CACHE_SIZE
Definition: f90papi.h:259
#define PAPI_DEV_ATTR__ROCM_UINT_COMP_CAP_MINOR
Definition: f90papi.h:228
#define PAPI_DEV_ATTR__CPU_UINT_L2U_CACHE_SIZE
Definition: f90papi.h:31
#define PAPI_DEV_ATTR__CUDA_UINT_BLK_DIM_Y
Definition: f90papi.h:217
#define PAPI_DEV_ATTR__ROCM_CHAR_DEVICE_NAME
Definition: f90papi.h:84
#define PAPI_DEV_ATTR__CUDA_UINT_SHM_PER_BLK
Definition: f90papi.h:216
#define PAPI_DEV_ATTR__ROCM_UINT_WORKGROUP_SIZE
Definition: f90papi.h:118
#define PAPI_DEV_ATTR__CPU_UINT_L2U_CACHE_LINE_COUNT
Definition: f90papi.h:15
#define PAPI_DEV_ATTR__ROCM_UINT_COMP_CAP_MAJOR
Definition: f90papi.h:34
#define PAPI_DEV_ATTR__CPU_CHAR_NAME
Definition: f90papi.h:246
#define PAPI_DEV_ATTR__CUDA_UINT_GRD_DIM_X
Definition: f90papi.h:42
#define PAPI_DEV_ATTR__ROCM_ULONG_UID
Definition: f90papi.h:28
#define PAPI_DEV_ATTR__CPU_UINT_L3U_CACHE_LINE_COUNT
Definition: f90papi.h:182
#define PAPI_DEV_TYPE_ATTR__CHAR_NAME
Definition: f90papi.h:126
#define PAPI_DEV_ATTR__CUDA_UINT_MEMCPY_OVERLAP
Definition: f90papi.h:273
#define PAPI_DEV_ATTR__ROCM_UINT_SHM_PER_WG
Definition: f90papi.h:33
#define PAPI_DEV_ATTR__CUDA_UINT_COMP_CAP_MINOR
Definition: f90papi.h:135
#define PAPI_DEV_ATTR__CUDA_UINT_MAP_HOST_MEM
Definition: f90papi.h:151
#define PAPI_DEV_ATTR__CPU_UINT_L1D_CACHE_ASSOC
Definition: f90papi.h:23
#define PAPI_DEV_ATTR__CUDA_UINT_SHM_PER_SM
Definition: f90papi.h:218
#define PAPI_DEV_ATTR__CPU_UINT_STEPPING
Definition: f90papi.h:153
#define PAPI_DEV_ATTR__ROCM_UINT_CU_COUNT
Definition: f90papi.h:191
#define PAPI_DEV_ATTR__CPU_UINT_THR_NUMA_AFFINITY
Definition: f90papi.h:29
#define PAPI_DEV_ATTR__CUDA_UINT_BLK_DIM_X
Definition: f90papi.h:166
#define PAPI_DEV_ATTR__CPU_UINT_NUMA_MEM_SIZE
Definition: f90papi.h:221
#define PAPI_DEV_ATTR__ROCM_UINT_SIMD_PER_CU
Definition: f90papi.h:92
#define PAPI_DEV_ATTR__ROCM_UINT_WG_DIM_X
Definition: f90papi.h:145
#define PAPI_DEV_ATTR__CUDA_UINT_MULTI_KERNEL
Definition: f90papi.h:55
#define PAPI_DEV_ATTR__CPU_UINT_L2U_CACHE_ASSOC
Definition: f90papi.h:207
#define PAPI_DEV_ATTR__CUDA_UINT_GRD_DIM_Z
Definition: f90papi.h:267
#define PAPI_DEV_ATTR__ROCM_UINT_GRD_DIM_X
Definition: f90papi.h:49
#define PAPI_DEV_TYPE_ID__CPU
Definition: f90papi.h:93
#define PAPI_DEV_ATTR__CPU_UINT_L1D_CACHE_SIZE
Definition: f90papi.h:184
#define PAPI_DEV_ATTR__CPU_UINT_MODEL
Definition: f90papi.h:98
#define PAPI_DEV_ATTR__ROCM_UINT_WG_DIM_Z
Definition: f90papi.h:241
#define PAPI_DEV_ATTR__ROCM_UINT_GRD_DIM_Z
Definition: f90papi.h:20
#define PAPI_DEV_ATTR__CPU_UINT_L2U_CACHE_LINE_SIZE
Definition: f90papi.h:232
#define PAPI_DEV_ATTR__CPU_UINT_CORE_COUNT
Definition: f90papi.h:41
#define PAPI_DEV_ATTR__CPU_UINT_L1I_CACHE_ASSOC
Definition: f90papi.h:47
#define PAPI_DEV_ATTR__CPU_UINT_L1D_CACHE_LINE_SIZE
Definition: f90papi.h:205
#define PAPI_DEV_ATTR__CUDA_CHAR_DEVICE_NAME
Definition: f90papi.h:81
#define PAPI_DEV_TYPE_ATTR__CHAR_STATUS
Definition: f90papi.h:239
#define PAPI_DEV_ATTR__CUDA_UINT_COMP_CAP_MAJOR
Definition: f90papi.h:69
#define PAPI_DEV_TYPE_ID__ROCM
Definition: f90papi.h:194
int multi_kernel(int argc, char *argv[])
Return codes and api definitions.
static void print_help(void)
Definition: papi_cost.c:85
FILE * stderr
#define MAX_NUMA_NODES
#define MAX_CPU_THREADS
static void parse_args(int argc, char **argv, command_flags_t *f)
int main()
Definition: pernode.c:20
int model
Definition: pfmlib_amd64.c:86
int family
Definition: pfmlib_amd64.c:85
int stepping
Definition: pfmlib_amd64.c:87
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:627
int retval
Definition: zero_fork.c:53