{"id":18421974,"url":"https://github.com/spcl/smi","last_synced_at":"2025-04-07T14:32:07.366Z","repository":{"id":35577644,"uuid":"198245626","full_name":"spcl/SMI","owner":"spcl","description":"Streaming Message Interface: High-Performance Distributed Memory Programming on Reconfigurable Hardware","archived":false,"fork":false,"pushed_at":"2022-03-01T17:26:58.000Z","size":1455,"stargazers_count":16,"open_issues_count":3,"forks_count":10,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-30T13:04:18.053Z","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":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spcl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-22T14:57:26.000Z","updated_at":"2024-11-11T04:41:15.000Z","dependencies_parsed_at":"2022-08-08T09:16:53.551Z","dependency_job_id":null,"html_url":"https://github.com/spcl/SMI","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FSMI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FSMI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FSMI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spcl%2FSMI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spcl","download_url":"https://codeload.github.com/spcl/SMI/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247670029,"owners_count":20976493,"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":"2024-11-06T04:27:34.700Z","updated_at":"2025-04-07T14:32:06.993Z","avatar_url":"https://github.com/spcl.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg align=\"left\" width=\"234\" height=\"96\" src=\"/misc/smi.png?raw=true\"\u003e\n\n# Streaming Message Interface\n\n**Streaming Message Interface** is a a distributed memory HLS programming model for **FPGAs** that provides\nthe convenience of message passing for HLS-programmed hardware devices. Instead of bulk transmission, typical of message passing model, \nwith SMI messages are **streamed** across the network during computation, allowing communication to be seamlessly integrated into pipelined designs.\n\nThis repository contains an high-level synthesis implementation of SMI targeting OpenCL and Intel FPGAs, and all the \napplications used for the evaluation perfomed in the paper: *\"Streaming Message Interface: High-Performance Distributed Memory\nProgramming on Reconfigurable Hardware\"*, Tiziano De Matteis, Johannes de Fine Licht, Jakub Beránek, and Torsten Hofler. In Proceedings of the International Conference for High Performance Computing, Networking, Storage, and Analysis, 2019 (SC 2019).\n\n\nPlease refer to the [wiki](https://github.com/spcl/SMI/wiki) and to the paper for a reference on how to use SMI for your own distributed FPGA programs.\n\n\n## Reproducing the paper experiments\n\nAll the tests and evaluations reported in the paper have been performed on a set of Bittware 520N cards (Stratix 10),\neach of them equipped with 4 network connections (QSFP modules) operating at 40Gbit/s.\n\n### Requirements\n\nThe library depends on:\n\n* CMake for configuration\n* Intel FPGA SDK for OpenCL pro, version 18.1 ([http://fpgasoftware.intel.com/opencl/](http://fpgasoftware.intel.com/opencl/)). *Experimental: support for v19+*\n* GCC (version 5+)\n* An MPI implementation (e.g. OpenMPI)\n* Python (version 3+)\n* CLang (version 8+)\n\n### Compilation\n\nAfter cloning this repository, make sure you clone the submodule dependency, by executing the following command:\n\n```\ngit submodule update --init\n```\n\nThe project uses CMake for configuration. To configure the project and build the bitstreams and executables:\n\n```bash\nmkdir build\ncd build\ncmake ..\n```\nThe experiments shown in the paper are organized in two subdirectories of the CMake folder, `microbenchmarks` and `examples`.\n\nFor each of them the following targets are offered:\n\n- `make \u003capplication\u003e_emulator` builds the emulation version of the FPGA program;\n- `make \u003capplication\u003e_host` builds the host program;\n- `make \u003capplication\u003e_\u003cprogram\u003e_aoc_report` generates the report;\n- `make \u003capplication\u003e_\u003cprogram\u003e_aoc_build` builds the hardware (can take several hours).\n\nThe applications presents in the repository are the following. For the details please refer to the paper:\n\n**Microbenchmarks**\n\n- `bandwidth`: bandwidth microbenchmark: an MPMD application composed by two programs, namely `bandwidth_0` (sender) and `bandwidth_1` (receiver);\n- `latency`: latency microbenchmark: an MPMD application composed by two programs, namely `latency_0` (source) and `latency_1` (destination).\n- `injection`: injection microbenchmark: an MPMD application composed by two programs, namely `injection_0` (sender) and `injection_1` (receiver).\n- `broadcast`: broadcast microbenchmark: an SPMD application (`broadcast`)\n- `reduce`: reduce microbenchmark:  an SPMD application (`reduce`)\n- `scatter`: scatter microbenchmark (not included in the paper): an SPMD application (`scatter`)\n- `gather`: gather microbenchmark (not included in the paper):  an SPMD application (`gather`)\n\n**Application examples**\n\n- `stencil_smi`: stencil application, smi implementation. It is composed by a single program (`stencil_smi`);\n- `stencil_onchip`: on chip version of the stencil application;\n- `gesummv_smi`: gesummv, smi implementation: composed by a two programs (`gesummv_rank0` and `gesummv_rank1`);\n- `gesummv_onchip`: on chip version of the gesummv application.\n\n**Unit tests**\n\nTo enable unit tests, please execute `cmake` with the following flag `-DENABLE_TESTS=ON`\n\n\n**Please Note**: all the host programs have been written by considering the target architecture used in the paper, which is characterized by a set of nodes each one having 2 FPGAs.\nIf you are using a different setup, please adjust the host programs.\n\n### Example \n\nSuppose that the user wants to execute the `stencil_smi` application in emulation.\nThe following steps must be performed:\n\n```bash\ncd examples\n# Compile the emulation version\nmake stencil_smi_emulator -j\n# Compile the host program\nmake stencil_smi_host\ncd stencil_smi\n# Execute the program\nenv  CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=8 mpirun -np 8 ./stencil_smi_host emulator \u003cnum-timesteps\u003e\n```\n\nTo generate the report, from the `examples` directory in the CMake folder, the user must execute:\n```bash\nmake  stencil_smi_stencil_smi_aoc_report\n```\n\nThe report will be stored under `examples/stencil_smi/stencil_smi`.\n\n\n\n#### Stencil parameters\n\nFor the stencil application, the stencil sizes and number of ranks in either dimension are configured using CMake parameters:\n\n```bash\ncmake .. -DSMI_STENCIL_SIZE_X=8192 -DSMI_STENCIL_SIZE_Y=8192 -DSMI_STENCIL_NUM_PROCS_X=2 -DSMI_STENCIL_NUM_PROCS_Y=2\n```\n\nOther parameters include `SMI_VECTORIZATION_WIDTH`, `SMI_DATATYPE`, `SMI_FMAX`, and `SMI_ROUTING_FILE`.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspcl%2Fsmi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspcl%2Fsmi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspcl%2Fsmi/lists"}