NVIDIA / cuCollections

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[ENHANCEMENT]: Add option to separate container initialization from memory allocation

sleeepyjack opened this issue · comments

Is your feature request related to a problem? Please describe.

Our current process involves memory allocation for a container within its constructor and instant initialization through the clear() function. This sequence happens immediately and is also enclosed within the constructor.

However, there are instances where it's beneficial to postpone the initialization step to a more appropriate time in the program flow.

Describe the solution you'd like

To facilitate this, we must implement a strategy allowing deferred initialization while ensuring the container is fully initialized before its first use. This is vital for maintaining data integrity and avoiding runtime errors.

One potential strategy could be an initialize-on-first-touch approach: Any function call that could potentially access the container's memory (like insert(), find(), size(), ref(), etc.) would first check a boolean member indicating whether the container has been initialized or not.

If the container is not yet initialized (i.e., the boolean is false), the clear() function would be invoked to initialize the container, thus ensuring it's ready for use.

Describe alternatives you've considered

No response

Additional context

No response

there are instances where it's beneficial to postpone the initialization step to a more appropriate time in the program flow.

What are those instances?

This sounds a little wonky to try and provide via the owning types.

If someone really wants this behavior, I think it would be best served by having them allocate their own storage and then using a view type around that storage.

For my case, it's because I want to malloc the memory just once, then time the rest of the process. The malloc adds a lot of time to the program and I don't want to include it in my calculations. However, I do want to measure how long it takes to zero the memory.

I support the idea of having the constructor do malloc. That makes sense and fits in with the c++ paradigm of RAII. But having the constructor also zero the memory is not great, similar to how we often use arrays instead of std::vector in CUDA code because we don't want to waste time initializing memory.

Searching the web, there are a lot of people who would like std::vector to not initialize data: https://www.google.com/search?q=std+vector+without+initialization&oq=std+vector+without+initialization

It's so popular and idea that you have to wonder if std::vector made a mistake in forcing initialization. With std::vector, though, there is a solution where you can prevent initialization by wrapping your data member in a class with a constructor that does nothing. It's awkward but it works! I think that cuco does not even allow for the awkward solution.

At the very least, maybe add the clear function already?! esoha-nvidia@966da5c std::unordered_map has it. https://en.cppreference.com/w/cpp/container/unordered_map/clear

Just FYI, clear has been added in #333.

@PointKernel Yeah but only in the experimental code, right? I've got enough on my plate without switching over to be a guinea pig. 😆 Perhaps port that to the non-experimental static_map?

Are there any other members in this list of functions that std::unordered_map offers that could be added to cuco in 5 minutes or fewer? clear took me like 5 minutes. If there are others, maybe add those, too?

Perhaps port that to the non-experimental static_map?

We will deprecate the "non-experimental" static_map in one month or two and experimental::static_map will be official. That said, I'm inclined to introduce new features and meet users' requirements in the new map instead of updating the old deprecating one.

If there are others, maybe add those, too?

Fully understand. We have a long list of work to wrap up the experimental containers. Matching STL behavior is definitely a nice thing to have but it's not the top priority for now.