Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mutation Support #466

Open
jpsamaroo opened this issue Jan 23, 2024 · 0 comments
Open

Mutation Support #466

jpsamaroo opened this issue Jan 23, 2024 · 0 comments

Comments

@jpsamaroo
Copy link
Member

jpsamaroo commented Jan 23, 2024

Dagger has previously been a purely-functional model, expecting that new values are calculated by applying a function to a set of existing values, without allowing for arguments to be mutated or changed in any way. This model is convenient from an optimization perspective (as we can do aggressive caching and duplication of data, memoization of results, etc.), but it's also quite limiting for users operating in an imperative language like Julia.

I've long desired to find a way to relax this model, and in the course of working on #454, I've found that the simple In/Out model of OpenMP's data dependency system (that spawn_datadeps implements) is quite powerful and allows for a very convenient programming interface, while utilizing a variety of powerful performance optimizations. It also seems to leave room for more fine-grained synchronization and mutation systems going forward.

Of course, spawn_datadeps is rather limiting if we want to optimize over a larger region of code, including nested datadeps regions, which aren't trivial to support with the current implementation. Therefore, I'd like to consider what would be required to move support for the same programming model and optimizations directly into Dagger, to see what that would look like.

Here are the basic set of high-level changes that we'll need to support this model:

  • In/Out unwrapping and propagation in the frontend
  • Data ownership tracking (exclusive (write) vs. shared (read)) in the scheduler
  • Careful cache management in the face of mutating values (i.e. proper alternative to Sch: Temporarily disable chunk cache #465)
  • Awareness of processor-associated memory spaces and their aliasing properties
  • copyto! alternative which integrates with Dagger's synchronization (required for GPU support)
  • Relaxed semantics w.r.t writing data into the original user-provided data containers (lazy writing allows for reduced data transfers and better parallelism), similar to Tapir's sync regions
  • (Speculative) Data copying and versioning system in the scheduler, to make copies of data for reading and track which copies are up-to-date w.r.t last write
  • A plan on how to deal with non-Chunk arguments, w.r.t what we'll need to do to ensure we can still track them appropriately and enable distributed parallelism
  • A system for utilizing Julia's compiler to determine dependencies automatically, when unspecified
  • A system for specifying dependencies ahead-of-time for a given dispatch signature
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant