Description
It seems a bit odd that the signature of Store.get
takes a prototype
parameter, which ultimately defines the return type of that method. Beyond cluttering the .get
method, which will be used 99.9% of the time for CPU buffers, this makes it rather hard to reason about the data copying behavior of store.get
, because depending on the prototype
argument data might get copied, or it might not.
There is a simple alternative -- make store.get
statically return instances of a fixed Buffer
class, and require callers of store.get
who want a different Buffer
type to cast as needed. This would require associating a Buffer
class with Store
classes instances, which I think aligns with how the stores actually work -- e.g., LocalStore
and RemoteStore
are always going to return buffers backed by CPU memory. We can imagine alternative file system or s3 implementations that return GPU-backed buffers, but IMO those would be best expressed as different store classes.
One objection to associating Store
with Buffer
that I can think of is the possibility that someone wants one store that mixes cpu-backed buffers and gpu-backed buffers. I would emphasize that to my knowledge this is just a hypothetical, but I think this hypothetically could be accomplished by defining a store that wraps two sub-stores, Store[GPUBuffer]
for gpu stuff, and Store[CPUBuffer]
for cpu stuff.
Thoughts?
cc @kylebarron