Last active
October 9, 2024 02:51
-
-
Save dappelha/ca99a3134ed93991158d73e7a64b207c to your computer and use it in GitHub Desktop.
Fortran module that provides interface with NVIDIA Tools Extension (NVTX) library. This version works with XLF which requires valid arguements to c_loc.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
! Tested Oct 2024 with gfortran. | |
module nvtx_mod | |
use iso_c_binding | |
implicit none | |
integer,private :: col(7) = [ int(Z'0000ff00'), int(Z'000000ff'), int(Z'00ffff00'), int(Z'00ff00ff'),& | |
int(Z'0000ffff'), int(Z'00ff0000'), int(Z'00ffffff') ] | |
!character(len=256), private :: tempName | |
character, private, target :: tempName(256) | |
type, bind(C):: nvtxEventAttributes | |
integer(C_INT16_T):: version=1 | |
integer(C_INT16_T):: size=48 ! | |
integer(C_INT):: category=0 | |
integer(C_INT):: colorType=1 ! NVTX_COLOR_ARGB = 1 | |
integer(C_INT):: color | |
integer(C_INT):: payloadType=0 ! NVTX_PAYLOAD_UNKNOWN = 0 | |
integer(C_INT):: reserved0 | |
integer(C_INT64_T):: payload ! union uint,int,double | |
integer(C_INT):: messageType=1 ! NVTX_MESSAGE_TYPE_ASCII = 1 | |
type(C_PTR):: message ! ascii char | |
end type | |
interface nvtxRangePush | |
! push range with custom label and standard color | |
subroutine nvtxRangePushA(name) bind(C, name='nvtxRangePushA') | |
use iso_c_binding | |
character(kind=C_CHAR) :: name(256) | |
end subroutine | |
! push range with custom label and custom color | |
subroutine nvtxRangePushEx(event) bind(C, name='nvtxRangePushEx') | |
use iso_c_binding | |
import:: nvtxEventAttributes | |
type(nvtxEventAttributes):: event | |
end subroutine | |
end interface | |
interface nvtxRangePop | |
subroutine nvtxRangePop() bind(C, name='nvtxRangePop') | |
end subroutine | |
end interface | |
contains | |
subroutine nvtxStartRange(name,id) | |
character(kind=c_char,len=*) :: name | |
integer, optional:: id | |
type(nvtxEventAttributes):: event | |
character(kind=c_char,len=256) :: trimmed_name | |
integer :: i | |
trimmed_name=trim(name)//c_null_char | |
! move scalar trimmed_name into character array tempName | |
do i=1,LEN(trim(name)) + 1 | |
tempName(i) = trimmed_name(i:i) | |
enddo | |
if ( .not. present(id)) then | |
call nvtxRangePush(tempName) | |
else | |
event%color=col(mod(id,7)+1) | |
event%message=c_loc(tempName) | |
call nvtxRangePushEx(event) | |
end if | |
end subroutine | |
subroutine nvtxEndRange | |
call nvtxRangePop | |
end subroutine | |
end module nvtx_mod |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example Usage:
call nvtxStartRange("MoveAndCompute")
*** do work ***
call nvtxEndRange