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

[WIP] Efficient storage of sum data types #522

Open
wants to merge 67 commits into
base: master
Choose a base branch
from

Conversation

Riscky
Copy link

@Riscky Riscky commented Jun 30, 2022

Description

This PR contains the Accelerate side of my thesis work.
It integrates the POSable library, which generically transforms Haskell 98 data types in the recursive tagged union layout.
This memory layout, specifically geared to sum types, is quite memory efficient.

The work is not finished (in fact, it doesn't even compile yet).

Before merging this, we should decide what to do with pure product types (tuples).
Do we represent those with a unified tag or with the tags inside the product?
I think the latter might be preferable, because this keeps zipWith a no-op.

An (incomplete) list of things that should be done before that this can be merged:

  • Finish the generic implementation of the Matchable class (based on the current implementation for polymorphic Either)
  • Generate pattern synonyms with some Template Haskell (based on the current implementations for Bool, Maybe and Either)
  • Make POSable and Elt instances for newtypes
  • Make Elt instances for tuples (where the implementation depends on the answer to the question above)

Backends also have to be updated with the new AST constructors.
No interesting code has to be generated for the union constructors (just type casts).
It is important however that we keep padding equal between execution environments (CPU/GPU).
The updated Case constructors have to be implemented as ranged case statements instead of comparisons.

There is also a whole slew of possible improvements that are discussed in my thesis reports, which are probably out of scope for this PR.

How has this been tested?
Not yet, as this does not compile yet.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • My code follows the code style of this project
  • My change requires a change to the documentation
  • I have updated the documentation accordingly
  • I have added tests to cover my changes
  • All new and existing tests passed

Note

The commit history of this PR is quite terrible and should definitely be cleaned up.
I don't think this should be just a single commit, but I'm also not sure how I'd split this up in nicely defined commits.

@@ -259,6 +263,14 @@ packVec16 a b c d e f g h i j k l m n o p = runST $ do
ByteArray ba# <- unsafeFreezeByteArray mba
return $! Vec ba#

replicateVecN :: forall a n . (KnownNat n, Prim a) => a -> Vec n a
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't really belong in this PR, but the function seems useful enough to keep around

@tmcdonell tmcdonell changed the title Thesis [WIP] Efficient storage of sum data types Apr 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant