{"id":18422001,"url":"https://github.com/spcl/fompi-na","last_synced_at":"2025-10-11T07:38:33.048Z","repository":{"id":135158840,"uuid":"173566634","full_name":"spcl/foMPI-NA","owner":"spcl","description":null,"archived":false,"fork":false,"pushed_at":"2019-03-28T09:42:28.000Z","size":1413,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-09-12T06:46:52.162Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","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/spcl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-03T11:35:41.000Z","updated_at":"2024-08-02T20:49:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"1b898d19-8186-4f4b-be0c-3cd546456bb5","html_url":"https://github.com/spcl/foMPI-NA","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/spcl/foMPI-NA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FfoMPI-NA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FfoMPI-NA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FfoMPI-NA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FfoMPI-NA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spcl","download_url":"https://codeload.github.com/spcl/foMPI-NA/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FfoMPI-NA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279006627,"owners_count":26084131,"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","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2024-11-06T04:27:40.745Z","updated_at":"2025-10-11T07:38:33.034Z","avatar_url":"https://github.com/spcl.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"foMPI implements the one-sided chapter of MPI-3.0 standard. It offers a\r\nC and a Fortran interface.\r\n\r\nThis library was written by Robert Gerstenberger, Roberto Belli, Maciej Besta and\r\nTorsten Hoefler and is copyrighted by the ETH-Zurich (c) 2014. \r\nSee LICENSE for details on the license.\r\n\r\nBuilding\r\n========\r\n\r\nCompiler\r\n--------\r\nCurrently the implementation uses inline assembly for intra-node atomics\r\nand SSE for a fast intra-node memory copy, which isn't supported by the\r\nCray compiler. We used primarily gcc, but also tested the Intel compiler\r\nand other compiler might work as well.\r\n\r\nThe Fortran interface can be accessed in the Fortran 77 way (include\r\n'fompif.h') or the Fortran 90 way (use fompi). Since the structure of a\r\nmodule file depends on the compiler and you wish to build foMPI with a\r\ndifferent compiler than your application, please use the following\r\nscheme:\r\n1) load the compiler with whom you intend to compile foMPI\r\n2) make libfompi.a\r\n3) load the compiler with whom you intend to compile your application\r\n4) rm -f fompi_fortran.o module_fompi.o fompi.{compiler-specific file \r\n   extension for Fortran module files, .mod for gcc}\r\n5) make libfompi.a\r\nAt the moment the name mangling of the Fortran wrapper is hard-coded\r\n(single underscore). If you need to change this for your compiler,\r\nplease have a look at line 6 in fompi_fortran.c .\r\n\r\nDependencies\r\n------------\r\nThe foMPI tar archive comes with two additional libaries: MPITypes and\r\nlibtopodisc, which are included. Just type \"make\" and those libraries and\r\nthe foMPI object files will be built, and packed together in the\r\nar-archive named libfompi.a. Also a little test program will be built.\r\nIf you wish to built the libraries with a different compiler, please use\r\n\"make mpitypes\" or \"make libtopodisc\".  \r\n\r\nfoMPI also needs the m4 macro processor.\r\n\r\n* m4 is available from http://www.gnu.org/software/m4/ .\r\n* MPITypes: For more information see the homepage \r\n  (http://www.mcs.anl.gov/mpitypes/) or their paper from the EuroMPI\r\n  2009 conference (R. Ross, \"MPITypes: Processing MPI Datatypes Outside\r\n  MPI\").\r\n* Libtopodisc was provided by William Gropp\r\n  (http://www.cs.illinois.edu/~wgropp/ ).\r\n\r\nIncludes/Linking\r\n----------------\r\nAdditional includes to build your application with foMPI are:\r\n-I{PATH to foMPI}\r\n\r\nAdditional parameter for linking your application with foMPI are:\r\n-L{PATH to foMPI} -lfompi\r\n-ldmapp\r\n\r\nBuild parameter\r\n---------------\r\nThe building parameter can be found in the Makefile.inc file.\r\nYou can choose your appropriate compiler (CC), flags (CCFLAGS), etc.\r\nAdditionally foMPI provides a section in the file fompi_internal.h,\r\nthat let you influence some of the inner work of foMPI:\r\n* DXPMEM (line 11): Enables/disables XPMEM support for intra-node\r\n  communication\r\n* DTYPE_HANDLING (line 14): Selects the strategy to handle MPI derived\r\n  datatypes for putting data with inter-node targets. A more detailed\r\n  explanation can be found in the section about MPI derived datatypes.\r\n\r\nIf you experience problems with foMPI, please try removing the \r\nXPMEM support.\r\n\r\n\r\nUsing foMPI\r\n===========\r\n\r\nAll MPI one-sided functions are prefixed with foMPI instead of MPI.\r\nAdditional all constants like foMPI_LOCK_{SHARED,EXLCUSIVE}, the error\r\ncodes, asserts (though not supported at the moment), flavor, memory\r\nmodel and MPI_Ops for the accumulate-derived communication functions\r\nneed to be prefixed with foMPI. Below you find a complete list of\r\nall implemented constants.\r\n\r\nThe datatypes MPI_Win and MPI_Request (if used with foMPI RMA functions\r\nthat take requests) need to be renamed to foMPI_Win or foMPI_Request.\r\nfoMPI_Requests are not compatible with MPI_Requests, and can only be\r\nused with foMPI wait and test functions.\r\n\r\nSome functions needed to be overloaded to have foMPI work properly\r\n(MPI_Init, MPI_Finalize, MPI_Type_free). The wait and test functions for\r\nfoMPI requests can't be mixed with normal MPI requests. For a full list\r\nof overloaded functions, please check the list below.\r\n\r\nApart from prefixing elements of the MPI one-sided scope the function\r\ninterfaces are declared as in the standard. See fompi.h for the full\r\nfunction prototypes.\r\n\r\nBelow you can find a complete list of implemented and not implemented\r\nfunctions of the one-sided chapter.\r\n\r\nfoMPI implements the unified memory model.\r\n\r\nMPI Datatypes\r\n-------------\r\n\r\nfoMPI supports all datatypes that are supported by MPITypes for\r\nfoMPI_Put/foMPI_Get. The following datatypes are in the fast path for\r\nthese two communication functions:\r\n* MPI_CHAR\r\n* MPI_UINT64_T\r\n* MPI_DOUBLE\r\n* MPI_INT\r\n\r\nAll MPI datatypes are supported for the accumulate-based communication\r\nfunctions except:\r\n* handles from MPI_TYPE_CREATE_F90_INTEGER\r\n* MPI_INTEGER16\r\n* handles from MPI_TYPE_CREATE_F90_REAL\r\n* MPI_REAL2\r\n* MPI_CXX_BOOL\r\n* handles from MPI_TYPE_CREATE_F90_COMPLEX\r\n* MPI_CXX_FLOAT_COMPLEX\r\n* MPI_CXX_DOUBLE_COMPLEX\r\n* MPI_CXX_LONG_DOUBLE_COMPLEX\r\n\r\nThe following combinations of MPI datatypes and MPI_Ops are\r\nhardware-supported:\r\n* MPI_DOUBLE/MPI_{BAND/BOR/BXOR}\r\n* MPI_INT64_T/MPI_{BAND/BOR/BXOR}\r\n* MPI_INT64_T/MPI_SUM\r\n\r\nfoMPI supports two different modes to handle MPI derived datatypes for\r\nputting data with inter-node targets:\r\n* The maximal block strategy puts each block of the superposition of the\r\n  two datatypes separately. This was the original bufferless approach\r\n  presented in the foMPI SC'13 paper and was the default strategy until\r\n  version 0.2.2.\r\n* The fixed buffer size strategy copies elements into a temporary buffer\r\n  until a predefined size (= fixed size) is reached, and then the\r\n  temporary buffer is put. This strategy allows the overlapping of\r\n  copying and communication. This strategy is the current default\r\n  (beginning with version 0.2.2).\r\nThe strategy can be selected in fompi_internal.h, line 14 with the\r\nDTYPE_HANDLING constant. If the fixed buffer size strategy is selected,\r\nadditional parameter are active:\r\n* DTYPE_FIXED_SIZE = size of one buffer = maximum size of a underlying\r\n  DMAPP put operation\r\n* DTYPE_BUFFER_NUMBER = number of buffer that can be used in parallel\r\nThe maximal block strategy is always used for intra-node communication.\r\n\r\nFor a detailed theoretical analysis of both strategies see:\r\n----------------------------------------------------------------------\r\nT. Schneider, R. Gerstenberger, T. Hoefler: Compiler Optimizations for\r\nNon-Contiguous Remote Data Movement. In: Proceedings of 26th\r\nInternational Workshop on Languages and Compilers for Parallel\r\nComputing (LCPC'13)\r\n----------------------------------------------------------------------\r\n\r\nFor details on the MPI Datatypes implementation in foMPI:\r\n----------------------------------------------------------------------\r\nR. Gerstenberger, T. Hoefler: Handling Datatypes in MPI-3 One Sided.\r\nACM Students Research Competition Poster at the The International\r\nConference for High Performance Computing, Networking, Storage and\r\nAnalysis (SC’13).\r\nhttp://sc13.supercomputing.org/sites/default/files/PostersArchive/spost114.html\r\n----------------------------------------------------------------------\r\n\r\nFortran\r\n-------\r\nAll communication functions take a displacement parameter, which is of\r\nthe integer(kind=MPI_ADDRESS_KIND) type. To ensure compatibility with the\r\nC wrapper code, please use a variable for the displacement parameter\r\ninstead of using a constant (which will be transfered as 4 byte integer\r\ninstead of the bigger integer(kind=MPI_ADDRESS_KIND)).\r\n\r\nOn our test system, we experienced problems with MPI_Get_address, which\r\ngives different results for the same location if called from C and\r\nFortran. Since our library is implemented in C, this is an issue if you\r\nintend to use dynamic windows.\r\nWe included a test_address subdirectory, which contains a small test\r\nprogram for this problem. If all three locations are the same, you are\r\nfine. If not, please use foMPI_Get_address instead.\r\n\r\n\r\nQuestions\r\n=========\r\n\r\nIf you have additional questions, feel free to contact me under the\r\nfollowing e-mail address: Robert Gerstenberger \u003cgerro@illinois.edu\u003e.\r\n\r\n\r\nCitation\r\n========\r\n\r\nAny published work which uses this software should include the \r\nfollowing citation:\r\n\r\n----------------------------------------------------------------------\r\nR. Belli T. Hoefler: Notified Access: Extending Remote Memory Access Programming Models\r\nfor Producer-Consumer Synchronization. In: Proceedings\r\nof the 29th IEEE International Parallel \u0026 Distributed Processing Symposium\r\n(IPDPS'15)\r\n----------------------------------------------------------------------\r\n\r\n----------------------------------------------------------------------\r\nR. Gerstenberger, M. Besta and T. Hoefler: Enabling Highly-Scalable\r\nRemote Memory Access Programming with MPI-3 One Sided. In: Proceedings\r\nof the International Conference on High Performance Computing,\r\nNetworking, Storage and Analysis (SC'13)\r\n----------------------------------------------------------------------\r\n\r\n\r\nImplemented function\r\n====================\r\n\r\nWindow creation\r\n---------------\r\n* foMPI_Win_create\r\n* foMPI_Win_allocate\r\n* foMPI_Win_create_dynamic\r\n* foMPI_Win_free\r\n\r\n* foMPI_Win_attach\r\n* foMPI_Win_detach\r\n\r\n\r\nSynchronization\r\n---------------\r\n* foMPI_Win_fence\r\n\r\n* foMPI_Win_post\r\n* foMPI_Win_start\r\n* foMPI_Win_complete\r\n* foMPI_Win_wait\r\n* foMPI_Win_test\r\n\r\n* foMPI_Win_lock\r\n* foMPI_Win_unlock\r\n* foMPI_Win_lock_all\r\n* foMPI_Win_unlock_all\r\n\r\n* foMPI_Win_flush\r\n* foMPI_Win_flush_all\r\n* foMPI_Win_flush_local\r\n* foMPI_Win_flush_local_all\r\n* foMPI_Win_sync\r\n\r\n* foMPI_Notify_init\r\n\r\n\r\nCommunication\r\n-------------\r\n* foMPI_Put\r\n* foMPI_Get\r\n* foMPI_Accumulate\r\n* foMPI_Get_accumulate\r\n* foMPI_Fetch_and_op\r\n* foMPI_Compare_and_swap\r\n\r\n* foMPI_Rput\r\n* foMPI_Rget\r\n* foMPI_Raccumulate\r\n* foMPI_Rget_accumulate\r\n\r\n* foMPI_Put_notify\r\n* foMPI_Get_notify\r\n\r\nMiscellaneous\r\n-------------\r\n* foMPI_Win_get_group\r\n\r\n* foMPI_Win_set_name\r\n* foMPI_Win_get_name\r\n\r\n\r\nOverloaded functions\r\n====================\r\n\r\nAdditional to MPI one-sided functions also the following functions need\r\nto be overloaded:\r\n\r\n* foMPI_Type_free\r\n* foMPI_Init\r\n* foMPI_Finalize\r\n\r\nAll of them above will call their MPI equivalent with the passed\r\nparameters, but do additional work for the foMPI implementation.\r\n\r\n* foMPI_Wait\r\n* foMPI_Test\r\n* foMPI_Waitall\r\n* foMPI_Waitany\r\n* foMPI_Start\r\n* foMPI_Request_free\r\n\r\nThese functions can only be used together with foMPI_Requests and can't\r\nhandle normal MPI_Request. All other wait oder test routines are not\r\nimplemented at the moment.\r\n\r\n\r\nNot implemented functions\r\n=========================\r\n\r\n* foMPI_Win_allocate_shared\r\n* foMPI_Win_shared_query\r\n* foMPI_Win_get_attr\r\n* foMPI_Win_set_attr\r\n* foMPI_Win_delete_attr\r\n* foMPI_Win_set_errhandler\r\n* foMPI_Win_call_errhandler\r\n* foMPI_Win_set_info\r\n* foMPI_Win_get_info\r\n\r\n\r\nConstants\r\n=========\r\n\r\nCreate flavor\r\n-------------\r\n* foMPI_WIN_FLAVOR_CREATE\r\n* foMPI_WIN_FLAVOR_ALLOCATE\r\n* foMPI_WIN_FLAVOR_DYNAMIC\r\n\r\n\r\nMemory model\r\n------------\r\n* foMPI_WIN_SEPARATE\r\n* foMPI_WIN_UNIFIED\r\n\r\n\r\nAsserts\r\n-------\r\n* foMPI_MODE_NOCHECK\r\n* foMPI_MODE_NOSTORE\r\n* foMPI_MODE_NOPUT\r\n* foMPI_MODE_NOPRECEDE\r\n* foMPI_MODE_NOSUCCEED\r\nAsserts are not used at the moment, but will be accepted by the library.\r\n\r\n\r\nAccumulate operations\r\n---------------------\r\n* foMPI_SUM\r\n* foMPI_PROD\r\n* foMPI_MAX\r\n* foMPI_MIN\r\n* foMPI_LAND\r\n* foMPI_LOR\r\n* foMPI_LXOR\r\n* foMPI_BAND\r\n* foMPI_BOR\r\n* foMPI_BXOR\r\n* foMPI_MAXLOC\r\n* foMPI_MINLOC\r\n* foMPI_REPLACE\r\n* foMPI_NO_OP\r\n\r\n\r\nLock type\r\n---------\r\n* foMPI_LOCK_SHARED\r\n* foMPI_LOCK_EXCLUSIVE\r\n\r\n\r\nError codes\r\n-----------\r\n* foMPI_ERROR_RMA_NO_SYNC\r\n* foMPI_ERROR_RMA_DATATYPE_MISMATCH\r\n* foMPI_ERROR_RMA_NO_LOCK_HOLDING\r\n* foMPI_ERROR_RMA_SYNC_CONFLICT\r\n* foMPI_ERROR_RMA_WIN_MEM_NOT_FOUND\r\n* foMPI_OP_NOT_SUPPORTED\r\n* foMPI_DATATYPE_NOT_SUPPORTED\r\n* foMPI_NAME_ABBREVIATED\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspcl%2Ffompi-na","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspcl%2Ffompi-na","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspcl%2Ffompi-na/lists"}