We present OpenStream, a data-flow extension of OpenMP to express dynamic dependent tasks. The lan-guage supports nested task creation, modular composition, variable and unbounded sets of producers/con-sumers, and first-class streams. These features, enabled by our original compilation flow, allow translating high-level parallel programming patterns, like dependences arising from StarSs ’ array regions, or universal low-level primitives like futures. In particular, these dynamic features can be embedded efficiently and naturally into an unmanaged imperative language, avoiding the complexity and overhead of a concurrent garbage collector. We demonstrate the performance advantages of a data-flow execution model compared to more restricted tas...