Skip to content

Instantly share code, notes, and snippets.

@lucasvr
Created March 7, 2022 03:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucasvr/ad4c94e934f237134388e3b503c957d0 to your computer and use it in GitHub Desktop.
Save lucasvr/ad4c94e934f237134388e3b503c957d0 to your computer and use it in GitHub Desktop.
HDF5 io_ops path analysis
digraph G {
label = "Parallel I/O in HDF5"
forcelabels = true
rankdir = "TB"
compound = true
splines = true # true polyline curved
node [style=""]
subgraph cluster_h5dpkg_h {
label = "H5Dpkg.h"
style = "filled"
fillcolor = "gray"
s_struct[
shape = "record"
style = "filled"
fillcolor = "white"
label = "{
<layout> H5D_layout_ops_t \{\l\ H5D_layout_read_func_t par_read;\l\ H5D_layout_write_func_t par_write;\l\}\l|
<io_info> H5D_io_info_t \{\l\ hbool_t using_mpi_vfd;\l\}\l|
<chunk_map> H5D_chunk_map_t \{\l\ H5D_chunk_info_t **select_chunk;\l\}\l}"
]
}
subgraph cluster_h5dchunk {
label = "H5Dchunk.c"
style = "filled"
fillcolor = "khaki"
node[style="filled" fillcolor="white"]
s_chunk_struct[
shape = "record"
label="{
<file_iter> H5D_chunk_file_iter_ud_t \{\l\ const H5D_io_info_t *io_info;\l\}\l|
<lops> H5D_layout_ops_t H5D_LOPS_CHUNK = \{\l\ .ser_read = H5D__chunk_read,\l\ .par_read = H5D__chunk_collective_read\l\}\l}
"
]
subgraph cluster_chunk_read {
label = <<b><font point-size='16'>H5D__chunk_read()</font></b>>
fillcolor="moccasin"
s_chunk_read_init_chunk[
shape = "box"
label = "chunk = H5D_CHUNK_GET_FIRST_NODE()"
]
s_chunk_read_next_chunk[
shape = "box"
label = "chunk = H5D_CHUNK_GET_NEXT_NODE()"
]
s_chunk_read_test_chunk[
shape = "diamond"
label = "Got chunk?"
]
s_single_read[
shape = "box"
label = "io_info->io_ops.single_read(...)"
]
s_chunk_read_init_chunk -> s_chunk_read_test_chunk
s_chunk_read_test_chunk-> s_single_read [label="yes"]
s_single_read -> s_chunk_read_next_chunk -> s_chunk_read_test_chunk
}
s_chunk_struct:lops -> s_chunk_read_init_chunk [lhead=cluster_chunk_read color="magenta" penwidth=2 style="dashed"]
}
subgraph cluster_h5dcontig {
label = "H5Dcontig.c"
style = "filled"
fillcolor = "khaki"
node[style="filled" fillcolor="white"]
s_lops_contig[
shape = "box"
label = "H5D_layout_ops_t H5D_LOPS_CONTIG = {\l .ser_read = H5D__contig_read,\l .par_read = H5D__contig_collective_read\l}\l"
]
subgraph cluster_contig_read {
label = <<b><font point-size='16'>H5D__contig_read()</font></b>>
fillcolor="moccasin"
s_contig_single_read[
shape = "box"
label = "io_info->io_ops.single_read(...)"
]
}
s_lops_contig -> s_contig_single_read [lhead=cluster_contig_read style="dashed"]
}
subgraph cluster_h5dmpio {
label = "MPI-based I/O (H5Dmpio.c)"
bgcolor = "gold"
s_optimized_read_fn[
shape = "record"
style = "filled"
fillcolor = "white"
label = "{
H5D__chunk_collective_read()|
H5D__contig_collective_read()|
H5D__mpio_select_read()}
"
]
}
subgraph cluster_h5dio {
label = <<b><font point-size='16'>H5D__read()</font></b> (H5Dio.c)>
bgcolor = "ivory"
s_read[shape="box" label="io_info->io_ops.multi_read(...)" style="filled" fillcolor="floralwhite"]
subgraph cluster_ioinfo_init_fn {
label = "H5D__ioinfo_init()"
bgcolor = "floralwhite"
s_io_ops[
shape="box"
label = "io_info->io_ops = {\l\ .multi_read = dset->shared->layout.ops->ser_read, \l\ .single_read = conv_needed ? H5D__scatgath_read : H5D__select_read\l\}\l"
]
}
subgraph cluster_ioinfo_adjust_fn {
label = "H5D__ioinfo_adjust()"
bgcolor = "floralwhite"
t_adjust_mpi_vfd[shape="diamond" label="io_info->using_mpi_vfd?"]
t_adjust_collective_io[shape="diamond" label="Is collective I/O possible?"]
}
subgraph cluster_collective_read {
label = "Collective I/O"
bgcolor = "floralwhite"
s_io_ops_collective[
shape = "box"
label = "io_info->io_ops = {\l\ .multi_read = dset->shared->layout.ops->par_read, \l\ .single_read = H5D__mpio_select_read\l\}\l"
]
}
s_io_ops -> t_adjust_mpi_vfd [ltail=cluster_ioinfo_init_fn]
t_adjust_mpi_vfd -> t_adjust_collective_io [label="yes" color="darkgreen" penwidth=2]
t_adjust_mpi_vfd -> s_read [label="no" color="red" penwidth=2]
t_adjust_collective_io -> s_io_ops_collective [label="yes" lhead="cluster_collective_read" color="darkgreen" penwidth=2]
t_adjust_collective_io -> s_read [label="no" color="red" penwidth=2]
s_io_ops_collective -> s_read [color="darkgreen" penwidth=2]
s_read -> s_optimized_read_fn:n [lhead="cluster_h5dmpio" label="MPI-based I/O" style="dashed" color="darkgreen" penwidth=2 minlen=2]
s_read -> s_chunk_read_init_chunk [lhead=cluster_chunk_read label="Chunked dataset, no MPI" style="dashed" color="red" penwidth=2]
s_read -> s_contig_single_read [lhead=cluster_contig_read label="Contiguous dataset, no MPI" style="dashed" color="red" penwidth=2]
}
subgraph cluster_vol {
label = "VOL driver (H5VLconnector.h, H5VLnative.c)"
bgcolor = "turquoise"
s_dataset_cls[
shape = "box"
style = "filled"
color = "white"
label = "H5VL_native_cls_g.dataset_cls = {\l .read = H5VL__native_dataset_read\l}\l"
]
s_native_dataset_read[
shape = "box"
style = "filled"
color = "white"
label = "H5VL__native_dataset_read()"
]
s_dataset_cls -> s_native_dataset_read [style="dashed"]
s_native_dataset_read -> s_io_ops:n [lhead=cluster_h5dio]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment