-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.html
115 lines (115 loc) · 5.47 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<html><head><style>body {
color: black;
}
</style></head>
<body>
<h2 id="strymonas-streams-stream-fusion-to-completeness">Strymonas Streams: stream fusion, to completeness</h2>
<img src="./strymonas_logo.png" alt="strymonas logo" width="100" />
<p><strong>Strymonas</strong> is a streaming library for fast, bulk, single-thread
in-memory processing -- of the sort epitomized by Software Defined
Radio or Java Streams. It attains the speed and memory efficiency of
hand-written state machines, yet provides the familiar declarative
interface for finite and infinite streams, supporting <strong>any</strong>
combination of map, filter, take(while), drop(while), zip, flatmap
combinators and tupling. Experienced users may use the lower-level
interface of stateful streams and implement accumulating maps,
compression and windowing.</p>
<p>The library is based on assured code generation (at present, OCaml, C
and Scala/Java) and guarantees in all cases <strong>complete fusion</strong>: if
each operation in a pipeline individually runs without any function
calls and memory allocations, the entire streaming pipeline runs
without calls and allocations. Thus strymonas per se introduces not
even constant-size intermediary data structures. The main processing
loop thus may run in constant memory and stack space.</p>
<p>In essence, strymonas is a DSL that generates high-performance
single-core stream processing code from declarative descriptions of
stream pipelines and user actions -- something like Yacc. Unlike
Yacc, strymonas is an embedded DSL. There are two flavors of the
library, with the host language being OCaml and Scala 3. The C
generation back-end needs no other dependencies, the OCaml back-end
relies on BER MetaOCaml, and Scala backend uses Scala 3 native
metaprogramming facilities.</p>
<h3 id="news">News</h3>
<ul>
<li><p>Published a part of version 2.1 and SDR examples (October 2023):
<a href="https://github.com/strymonas/strymonas-ocaml">link</a>
containing the documentations for the each example</p>
</li>
<li><p>Version 2.1 (September 2023): greatly expanded back-end (with C99
code-generation, more numeric data types, including complex numbers,
and operations on them), static arrays, more general FFI, and
provisions for Wasm</p>
</li>
<li><p>OCaml 22 workshop
paper <a href="https://strymonas.github.io/docs/ocaml-22.pdf">link</a></p>
</li>
<li><p>Complete Stream Fusion for Software-Defined Radio
Tomoaki Kobayashi and Oleg Kiselyov
<a href="http://arxiv.org/abs/2208.08732">http://arxiv.org/abs/2208.08732</a>
<a href="https://doi.org/10.48550/arXiv.2208.08732">https://doi.org/10.48550/arXiv.2208.08732</a></p>
</li>
<li><p>Even Better Stream Fusion
Oleg Kiselyov
University of Oxford Department of Computer Science. Seminar on Tensor
Computation. Feb 18, 2022.
<a href="http://www.cs.ox.ac.uk/seminars/2447.html">http://www.cs.ox.ac.uk/seminars/2447.html</a></p>
</li>
<li><p>Stream Fusion, to Completeness (describes the previous version
of the library)
POPL 2017.
(<a href="http://dl.acm.org/citation.cfm?id=3009880">paper with appendicies, arXiv</a>
<a href="https://speakerdeck.com/biboudis/stream-fusion-to-completeness-1">POPL 17 talk</a>)</p>
</li>
</ul>
<h3 id="getting-started">Getting Started</h3>
<pre><code>
git <span class="hljs-keyword">clone</span> <a href="https://github.com/strymonas/strymonas-ocaml"><span class="hljs-title">https</span>://github.com/strymonas/strymonas-ocaml</a>
git <span class="hljs-keyword">clone</span> <a href="https://github.com/strymonas/strymonas-C"><span class="hljs-title">https</span>://github.com/strymonas/strymonas-C</a>
git <span class="hljs-keyword">clone</span> <a href="https://github.com/strymonas/strymonas-scala"><span class="hljs-title">https</span>://github.com/strymonas/strymonas-scala</a>
</code></pre>
<p>(For the latest manuals, please visit the each repository.)</p>
<h3 id="prerequisites">Prerequisites</h3>
<ul>
<li>For strymonas-ocaml and strymonas-C:
<ol>
<li>OCaml: from your system's package manager</li>
<li>OPAM: after you install OPAM you will need to initialize it with opam init
and resolve any dependencies with:
<ul>
<li>either the opam depext command</li>
<li>or your system's package manager (e.g., OML's dependencies)</li>
</ul>
</li>
</ol>
</li>
<li>For Scala: (work in progress...)</li>
</ul>
<h3 id="benchmarks">Benchmarks</h3>
<p>How to compile and run the benchmarks:</p>
<ul>
<li><p>For strymonas-ocaml: see</p>
<p><code>strymonas-ocaml/benchmarks/README.md</code></p>
<p>Benchmarks require MetaOCaml</p>
</li>
<li><p>For strymonas-C: see</p>
<p><code>strymonas-C/bench/README.md</code></p>
<p>(to generate the C code for the benchmark, see the end of <code>strymonas-ocaml/benchmarks/README.md</code>)</p>
</li>
<li><p>For strymonas-scala: (work in progress...)</p></li>
</ul>
<h3 id="bugs-and-feedback">Bugs and Feedback</h3>
<p>To discuss bugs and improvements please use our Github Issues for each
corresponding flavor, for discussions and recommendations please use our gitter
pages.</p>
<h3 id="team">Team</h3>
<ul>
<li>Oleg Kiselyov</li>
<li>Tomoaki Kobayashi</li>
<li>Aggelos Biboudis</li>
<li>Nick Palladinos</li>
<li>Yannis Smaragdakis</li>
</ul>
<h3 id="old-design-popl17-">Old Design (POPL17)</h3>
<p>You can find and experiment with the implementations of the old design please follow the guidelines here:</p>
<p><a href="https://github.com/strymonas/strymonas.github.io/blob/master/index-old.md">https://github.com/strymonas/strymonas.github.io/blob/master/index-old.md</a></p>
</body></html>