Skip to content
Snippets Groups Projects
Verified Commit 8ef4248c authored by raphael.bach's avatar raphael.bach
Browse files

Add `README.md`

parent a8c1d996
No related branches found
No related tags found
No related merge requests found
README.md 0 → 100644
# fmpi
[![license](https://img.shields.io/badge/license-0BSD-blue)](LICENSE)
fmpi is an easy-to-use C library to create simple parallel programs from a
sequential code written in a high-level functional language called Futhark.
## Table of Contents
- [Quick overview](#quick-overview)
- [Getting Started](#getting-started)
- [Prerequisites](#prerequisites)
- [Installation](#installation)
- [Documentation](#documentation)
- [License](#license)
## Quick overview
Game of Life implemented with `fmpi`:
Sequential code for Game of Life is written in Futhark in a file named `gol.fut`
```ml
entry gol [y][x] (xs: [y][x]u64): [][]u64 =
let res = tabulate_2d (y) (x) (\i j ->
if(i > 0 && i < (y-1) && j > 0 && j < (x-1)) then
let cnt =
xs[(i-1), (j-1)] + xs[(i-1), j] + xs[(i-1), (j+1)] +
xs[ i , (j-1)] + 0 + xs[ i , (j+1)] +
xs[(i+1), (j-1)] + xs[(i+1), j] + xs[(i+1), (j+1)]
in u64.bool ((cnt == 3) || ((xs[i, j] == 1) && (cnt == 2)))
else xs[i,j]
)
in res[1:(y-1), 1:(x-1)]
```
Futhark function is called inside a C program with the help of `fmpi`.
```c
#include <stdio.h>
#include <stdlib.h>
#include <fmpi.h> // Header to include to use fmpi
#include "gol.h" // gol.fut => gol.h
#define STEP_CNT 20 // Number of Game of Life steps
#define X_LEN 8 // Width of `in`
#define Y_LEN 8 // Height of `in`
// Declare the futhark `gol` function which has 1 input parameter
FMPI_TASK_FUTHARK(gol, 1)
int main(int argc, char * argv[])
{
// fmpi initialization
struct fmpi_ctx * ctx = fmpi_init(&argc, &argv);
// Initial state of the Game of Life simulation
u64 in[] = {
0,1,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
};
// Number of elements in the in `in` array
#define in_size (sizeof(in)/sizeof(T))
// Array which will contain the result
u64 out[in_size] = {0};
// Register the `gol` task which has a square stencil of size 1 in each
// direction, a 2D array of size (X_LEN * Y_LEN) output parameter named `out`
// and a 2D array of of size (X_LEN * Y_LEN) output parameter named `in`
struct fmpi_task gol_task = FMPI_REGISTER_SYNC_TASK(
ctx, gol, fmpi_stencil_square(1),
fmpi_data_2d_out(ctx, out, X_LEN, Y_LEN),
fmpi_data_2d_in(ctx, in, X_LEN, Y_LEN)
);
// The task is run STEP_CNT times
for(size_t i = 0; i < STEP_CNT; i++) {
fmpi_run_task(ctx, &gol_task);
}
// Gather the results on the root node once the task is done
fmpi_task_finalize(ctx, &gol_task, FMPI_TASK_OP_GATHER);
// Final result is printed by the root node
if(fmpi_is_root(ctx)) {
for(size_t i = 0; i < in_size; i++) {
printf("%lu", out[i]);
if((i+1) % X_LEN == 0) {
printf("\n");
}
}
}
// Exit fmpi and then the program
fmpi_exit(&ctx);
return EXIT_SUCCESS;
}
```
## Getting Started
### Prerequisites
- A `C11` compliant compiler is needed to compile the code due to the use of
`_Generic` by `fmpi`.
- MPI(e.g., [OpenMPI](https://www.open-mpi.org/), [MPICH](https://www.mpich.org/), [MVAPICH](https://mvapich.cse.ohio-state.edu/))
- [Futhark](https://futhark-lang.org/)
### Installation
[Download](https://githepia.hesge.ch/raphael.bach/fmpi/-/archive/master/fmpi-master.zip) or
clone the repository:
```console
git clone https://gitedu.hesge.ch/raphael.bach/fmpi.git
```
Install the library to the standard default location `/usr/local/include/fmpi`:
```console
make install
```
Or install them to a different path `/my/custom/path/include/fmpi`:
```console
make install prefix=/my/custom/path
```
Add `/usr/local/include/fmpi` or `/my/custom/path/include/fmpi` to your include
paths.
## Documentation
Require Doxygen.
```console
make doc
```
Documentation will be available in `doc/doxygen`
## License
This project is licensed under the _very_ permissive [BSD Zero Clause License](LICENSE).
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment