{"id":27004486,"url":"https://github.com/tacc/t3pio","last_synced_at":"2025-04-04T06:16:58.150Z","repository":{"id":4173515,"uuid":"5289607","full_name":"TACC/t3pio","owner":"TACC","description":null,"archived":false,"fork":false,"pushed_at":"2015-10-21T18:50:37.000Z","size":1605,"stargazers_count":18,"open_issues_count":4,"forks_count":3,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-04-16T02:11:42.917Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TACC.png","metadata":{"files":{"readme":"README","changelog":"ChangeLog","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-08-03T19:41:33.000Z","updated_at":"2024-04-16T02:11:42.918Z","dependencies_parsed_at":"2022-07-20T08:17:40.452Z","dependency_job_id":null,"html_url":"https://github.com/TACC/t3pio","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ft3pio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ft3pio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ft3pio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TACC%2Ft3pio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TACC","download_url":"https://codeload.github.com/TACC/t3pio/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247128738,"owners_count":20888235,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-04T06:16:57.572Z","updated_at":"2025-04-04T06:16:58.141Z","avatar_url":"https://github.com/TACC.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"Date: 8/15/2012\n\n\n        T3PIO Library: TACC's Terrific Tool for Parallel I/O\n        ----------------------------------------------------\n                      Robert McLay\n                 mclay@tacc.utexas.edu\n\n\nThis software (T3PIO) is a parallel library to improve the parallel performance of\nMPI I/O. Since Parallel HDF5 uses MPI I/O, this library will improve the performance\nof it as well.  This library interacts with the Lustre filesystem to match the\napplication to the filesystem.\n\nThe parallel I/O performance depends on three parameters:\n\n    1) Number of writers\n    2) Number of stripes\n    3) Stripe size\n\nThis library focuses on writing of files. When an application creates a file, it is\nthe only time that one can control the number of stripes.  This library extracts data\nfrom the lustre file system and your parallel program to set all three parameters to\nimprove performance. \n\nThe use of the library is straight-forward.  Only one extra call to the T3PIO library\nis necessary to improve your performance.  \n\n\n\n\n\nUsing T3PIO with HDF5:\n----------------------\n\nIn Fortran, it looks like this (a complete example can be found in\ncubeTestHDF5/writer.F90 (lines 52-140):\n\n   subroutine hdf5_writer(....)\n   use hdf5\n   use t3pio\n   integer globalSize          ! Estimate of GlobalSize of file in (MB)\n   integer info                ! MPI Info object\n   integer comm                ! MPI Communicator\n   integer(hid_t)  :: plist_id ! Property list identifier\n   character*(256) :: dir      ! directory of output file\n   ...\n\n   comm = MPI_COMM_WORLD\n\n   ! Initialize info object.\n   call MPI_Info_create(info, ierr)\n\n   ! use library to fill info with nwriters, stripe\n   dir = \"./\"\n   call t3pio_set_info(comm, info, dir, ierr,   \u0026         ! \u003c--- T3PIO library call\n                       GLOBAL_SIZE=globalSize)\n   call H5open_f(ierr)\n   call H5Pcreate_f(H5P_FILE_ACCESS_F,plist_id,ierr)\n   call H5Pset_fapl_mpio_f(plist_id, comm, info, ierr)\n   call H5Fcreate_f(fileName, H5F_ACC_TRUNC_F, file_id, ierr,\n                    access_prp = plist_id)\n\n\nEssentially, you make the normal calls to create an HDF5 file.  The\nonly addition is to call \"t3pio_set_info\" with the communicator, an\ninfo object, and the directory where the file is to be written.\nOptionally, you can specify an estimate of the global size of the\nfile.  If you do so then stripe size will increase to improve\nperformance.\n\nIn C/C++ it is very similar (a complete example can be found in\nunstructTestHDF5/h5writer.C (lines 71-95)).  Note that the first\narguments to the function t3pio_set_info are required.  All other\noptions are optional.\n\n   #include \"t3pio.h\"\n   #include \"hdf5.h\"\n   void hdf5_writer(....)\n   {\n     MPI_Info info      = MPI_INFO_NULL; \n     const char *dir;\n     hid_t      plist_id;\n     ...\n\n     MPI_Info_create(\u0026info);\n     dir  = \"./\";\n     ierr = t3pio_set_info(comm, info, dir,          /* \u003c-- T3PIO call */   \n                     T3PIO_GLOBAL_SIZE, globalSize);\n     plist_id = H5Pcreate(H5P_FILE_ACCESS);\n     ierr     = H5Pset_fapl_mpio(plist_id, comm, info);\n     file_id  = H5Fcreate(fileName, H5F_ACC_TRUNC,\n                          H5P_DEFAULT, plist_id);\n     ...\n   }     \n\n\nUsing T3PIO with MPI I/O:\n-------------------------\n\nUsing T3PIO with MPI I/O is essentially the same as with HDF5.  In Fortran 90\nit would look like (see writer.F90 lines 300-317):\n\n\n\n   subroutine hdf5_writer(....)\n   use t3pio\n   integer info                ! MPI Info object\n   integer comm                ! MPI Communicator\n   integer iTotalSz            ! File size in MB.\n   integer filehandle          ! MPI file handle\n   character*(256) :: dir      ! directory of output file\n\n   call MPI_Info_create(info,ierr)\n\n   iTotalSz = totalSz / (1024*1024)\n   dir      = \"./\"\n   call t3pio_set_info(MPI_COMM_WORLD, info, dir, ierr,   \u0026\n                       global_size = iTotalSz)\n\n   call MPI_File_open(p % comm, fn, MPI_MODE_CREATE+MPI_MODE_RDWR, \u0026\n                      info, filehandle, ierr)\n   ...\n\n\nObviously, the use of the T3PIO library is the same when using MPI I/O or HDF5.\n\n\nInstalling T3PIO:\n-----------------\n\nThe library can downloaded from github\n\n   $ git clone git://github.com/TACC/t3pio.git\n\n\n\n\n\nTo configure the package do:\n\n   $ FC=mpif90 F77=mpif77 CC=mpicc CXX=mpicxx ./configure [options]\n\nWhere you need to specify the four mpi compilers and where the options are:\n\n   --prefix=/path/to/install/dir\n\n              Path to where you wish the library and test programs to be installed\n\n\n   --with-phdf5=/path/to/parallel/hdf5/dir\n\n              The library does not require Parallel HDF5. However, the test programs do.  Please\n              set the directory to the parent directory to hdf5 is installed.  This package expects\n              that the \"include\" and \"lib\" to be directly below the directory specified above.\n\n   --with-node-memory=N  (where N is in MB)\n\n              This is optional and avoids having the library run \"free -m\" to determine this quantity.\n              The size in MB. It should be the size of memory on the compute nodes.\n\n\nAfter configure do:\n\n  $ make; make install\n\nThis will build and install the library and the two test programs: cubeTest, unstructTest\n\n\n\n\nTest Program (1):  cubeTest\n----------------------------\n\n    To run the structured grid test code do the following to get help:\n\n  $ cubeTest -H\n\n  \n    \n cubeTest version 1.0\n\n Usage: cubeTest [options]\n options:\n   -v            : version\n   -H            : This message and quit\n   --help        : This message and quit\n   --dim num     : number of dimension (2, or 3)\n   -g num        : number of points in each direction globally\n                   (no default)\n   -l num        : number of points in each direction locally\n                   (default = 5)\n   -f num        : number of stripes per writer\n                   (default = 2)\n   --stripes num : Allow no more than num stripes \n                   (file system limit by default)\n   --h5chunk     : use HDF5 with chunks\n   --h5slab      : use HDF5 with slab\n                   (default)\n   --romio       : use MPI I/O\n   --numvar num  : number of variables 1 to 9\n                   (default = 1)\n  \n\nTest Program (2) : unstructTest\n------------------------------\n\n    To run the unstructured grid test code do the following to get help:\n\n  $ unstructTest -h\n\n      Usage:\n      ./unstructTest [options]\n\n      Options:\n       -h, -?        : Print Usage\n       -v            : Print Version\n       -C            : use h5 chunk\n       -S            : use h5 slab (default)\n       -l num        : local size is num (default=10)\n       -f factor     : number of stripes per writer (default=2)\n       -s num        : maximum number of stripes\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftacc%2Ft3pio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftacc%2Ft3pio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftacc%2Ft3pio/lists"}