|
Packit Service |
a1973e |
C ****************************************************************************
|
|
Packit Service |
a1973e |
C
|
|
Packit Service |
a1973e |
C fmatrixpapi2.f
|
|
Packit Service |
a1973e |
C An example of matrix-matrix multiplication and using PAPI high level to
|
|
Packit Service |
a1973e |
C look at the performance. The example illustrates how PAPIF_read_counters
|
|
Packit Service |
a1973e |
C and PAPIF_accum_counters can be used to selectively measure parts of a
|
|
Packit Service |
a1973e |
C code without having to use the low-level interface.
|
|
Packit Service |
a1973e |
C
|
|
Packit Service |
a1973e |
C Derived from an example written by Kevin London March 2000
|
|
Packit Service |
a1973e |
C ****************************************************************************
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "fpapi_test.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
program fmatrixpapi
|
|
Packit Service |
a1973e |
IMPLICIT integer (p)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
INTEGER ncols1,nrows1,ncols2,nrows2
|
|
Packit Service |
a1973e |
PARAMETER(nrows1=175,ncols1=225,nrows2=ncols1,ncols2=150)
|
|
Packit Service |
a1973e |
INTEGER i,j,num_events,retval
|
|
Packit Service |
a1973e |
C PAPI standardized event to be monitored
|
|
Packit Service |
a1973e |
INTEGER event(2)
|
|
Packit Service |
a1973e |
C PAPI values of the counters
|
|
Packit Service |
a1973e |
INTEGER*8 values(2), dummies(2)
|
|
Packit Service |
a1973e |
REAL*8 p(nrows1,ncols1),q(nrows2,ncols2),
|
|
Packit Service |
a1973e |
& r(nrows1,ncols2)
|
|
Packit Service |
a1973e |
integer tests_quiet, get_quiet
|
|
Packit Service |
a1973e |
external get_quiet
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
tests_quiet = get_quiet()
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Setup default values
|
|
Packit Service |
a1973e |
num_events=0
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Open matrix file number 1 for reading
|
|
Packit Service |
a1973e |
C OPEN(UNIT=1,FILE='fmt1',STATUS='OLD')
|
|
Packit Service |
a1973e |
C Open matrix file number 2 for reading
|
|
Packit Service |
a1973e |
C OPEN(UNIT=2,FILE='fmt2',STATUS='OLD')
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_VER_CURRENT
|
|
Packit Service |
a1973e |
call PAPIf_library_init(retval)
|
|
Packit Service |
a1973e |
if ( retval.NE.PAPI_VER_CURRENT) then
|
|
Packit Service |
a1973e |
call ftest_fail(__FILE__, __LINE__,
|
|
Packit Service |
a1973e |
. 'PAPI_library_init', retval)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Total floating point operations
|
|
Packit Service |
a1973e |
call PAPIf_query_event(PAPI_FP_INS, retval)
|
|
Packit Service |
a1973e |
if (retval .NE. PAPI_OK) then
|
|
Packit Service |
a1973e |
event(1) = PAPI_TOT_INS
|
|
Packit Service |
a1973e |
else
|
|
Packit Service |
a1973e |
C Total floating point operations
|
|
Packit Service |
a1973e |
event(1) = PAPI_FP_INS
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Time used
|
|
Packit Service |
a1973e |
event(2) = PAPI_TOT_CYC
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C See how many hardware events at one time are supported
|
|
Packit Service |
a1973e |
call PAPIf_num_counters( num_events )
|
|
Packit Service |
a1973e |
if ( num_events .LT. 2 ) then
|
|
Packit Service |
a1973e |
print *,'This example program requries the architecture ',
|
|
Packit Service |
a1973e |
. 'to support 2 simultaneous hardware events...shutting down.'
|
|
Packit Service |
a1973e |
stop
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (tests_quiet .EQ. 0) then
|
|
Packit Service |
a1973e |
print *, 'Number of hardware counters supported: ', num_events
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C matrix 1: read in the matrix values
|
|
Packit Service |
a1973e |
do i=1, nrows1
|
|
Packit Service |
a1973e |
do j=1,ncols1
|
|
Packit Service |
a1973e |
p(i,j) = i*j*1.0
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C matrix 2: read in the matrix values
|
|
Packit Service |
a1973e |
do i=1, nrows2
|
|
Packit Service |
a1973e |
do j=1,ncols2
|
|
Packit Service |
a1973e |
q(i,j) = i*j*1.0
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Initialize the result matrix
|
|
Packit Service |
a1973e |
do i=1,nrows1
|
|
Packit Service |
a1973e |
do j=1, ncols2
|
|
Packit Service |
a1973e |
r(i,j) = i*j*1.0
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Set up the counters
|
|
Packit Service |
a1973e |
num_events = 2
|
|
Packit Service |
a1973e |
call PAPIf_start_counters( event, num_events, retval)
|
|
Packit Service |
a1973e |
if ( retval .NE. PAPI_OK ) then
|
|
Packit Service |
a1973e |
call ftest_fail(__FILE__, __LINE__,
|
|
Packit Service |
a1973e |
*'PAPIf_start_counters', retval)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C We wish to count the events for this call
|
|
Packit Service |
a1973e |
call Adding_MatMult(p,q,r,nrows1,ncols1,ncols2)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Read and clear the counter values
|
|
Packit Service |
a1973e |
call PAPIf_read_counters(values, num_events,retval)
|
|
Packit Service |
a1973e |
if ( retval .NE. PAPI_OK ) then
|
|
Packit Service |
a1973e |
call ftest_fail(__FILE__, __LINE__,
|
|
Packit Service |
a1973e |
*'PAPIf_read_counters', retval)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (tests_quiet .EQ. 0) then
|
|
Packit Service |
a1973e |
print *
|
|
Packit Service |
a1973e |
if (event(1) .EQ. PAPI_TOT_INS) then
|
|
Packit Service |
a1973e |
print *, 'TOT Instructions: ',values(1)
|
|
Packit Service |
a1973e |
else
|
|
Packit Service |
a1973e |
print *, 'FP Instructions: ',values(1)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
print *, 'Cycles: ',values(2)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (event(1) .EQ. PAPI_FP_INS) then
|
|
Packit Service |
a1973e |
write(*,'(a,f9.6)') ' Efficiency (flops/cycles):',
|
|
Packit Service |
a1973e |
& real(values(1))/real(values(2))
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C We don't wish to count the events for this call
|
|
Packit Service |
a1973e |
call Adding_MatMult(p,q,r,nrows1,ncols1,ncols2)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Clear the counter values
|
|
Packit Service |
a1973e |
call PAPIf_read_counters(dummies, num_events,retval)
|
|
Packit Service |
a1973e |
if ( retval .NE. PAPI_OK ) then
|
|
Packit Service |
a1973e |
call ftest_fail(__FILE__, __LINE__,
|
|
Packit Service |
a1973e |
*'PAPIf_read_counters', retval)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C We wish to count the events for this call
|
|
Packit Service |
a1973e |
call Adding_MatMult(p,q,r,nrows1,ncols1,ncols2)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Read the counter values
|
|
Packit Service |
a1973e |
call PAPIf_accum_counters(values, num_events,retval)
|
|
Packit Service |
a1973e |
if ( retval .NE. PAPI_OK ) then
|
|
Packit Service |
a1973e |
call ftest_fail(__FILE__, __LINE__,
|
|
Packit Service |
a1973e |
*'PAPIf_accum_counters', retval)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Stop the counters and put the results in the array values
|
|
Packit Service |
a1973e |
call PAPIf_stop_counters(dummies,num_events,retval)
|
|
Packit Service |
a1973e |
if ( retval .NE. PAPI_OK ) then
|
|
Packit Service |
a1973e |
call ftest_fail(__FILE__, __LINE__,
|
|
Packit Service |
a1973e |
*'PAPIf_stop_counters', retval)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (tests_quiet .EQ. 0) then
|
|
Packit Service |
a1973e |
print *
|
|
Packit Service |
a1973e |
if (event(1) .EQ. PAPI_TOT_INS) then
|
|
Packit Service |
a1973e |
print *, 'TOT Instructions: ',values(1)
|
|
Packit Service |
a1973e |
else
|
|
Packit Service |
a1973e |
print *, 'FP Instructions: ',values(1)
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
print *, 'Cycles: ',values(2)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (event(1) .EQ. PAPI_FP_INS) then
|
|
Packit Service |
a1973e |
write(*,'(a,f9.6)') ' Efficiency (flops/cycles):',
|
|
Packit Service |
a1973e |
& real(values(1))/real(values(2))
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
print *
|
|
Packit Service |
a1973e |
print *,'----------------------------------------------------'
|
|
Packit Service |
a1973e |
print *,'The second instruction and cycle counts should be'
|
|
Packit Service |
a1973e |
print *,'approximately twice the first ones. The efficiency'
|
|
Packit Service |
a1973e |
print *,'metric should be fairly equal between the cases.'
|
|
Packit Service |
a1973e |
end if
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
call ftests_pass(__FILE__)
|
|
Packit Service |
a1973e |
end
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
subroutine Adding_MatMult(p,q,r,ni,nk,nj)
|
|
Packit Service |
a1973e |
implicit integer (p)
|
|
Packit Service |
a1973e |
integer ni,nk,nj
|
|
Packit Service |
a1973e |
real*8 p(ni,*),q(nk,*),r(ni,nj)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
integer i,j,k
|
|
Packit Service |
a1973e |
C Compute the matrix-matrix multiplication
|
|
Packit Service |
a1973e |
do i=1,ni
|
|
Packit Service |
a1973e |
do j=1,nj
|
|
Packit Service |
a1973e |
do k=1,nk
|
|
Packit Service |
a1973e |
r(i,j)=r(i,j) + p(i,k)*q(k,j)
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
end do
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
C Make sure the compiler does not optimize away the multiplication
|
|
Packit Service |
a1973e |
call dummy(r)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
end
|