hoomd.data.array¶
Overview
A NumPy like interface to internal HOOMD-blue data. |
|
Exposes an internal HOOMD-blue GPU buffer. |
Details
Implement zero-copy array.
- class hoomd.data.array.HOOMDArray(buffer, callback, read_only=None)¶
A NumPy like interface to internal HOOMD-blue data.
These objects are returned by HOOMD-blue’s zero copy local snapshot API (
hoomd.State.cpu_local_snapshot). This class acts like anumpy.ndarrayobject through NumPy’s provided interface. Some exceptions are theview,resize,flatandflatitermethods and thedataandbaseproperties. For typical use cases, understanding this class is not necessary. Treat it as anumpy.ndarray.In general, whenever possible (when an array pointing to a new buffer is returned) we return a
numpy.ndarray. However, any array pointing to the same data will be returned as aHOOMDArray. To ensure memory safety, aHOOMDArrayobject cannot be accessed outside of the context manager in which it was created. To have access outside the manager an explicit copy must be made (e.g.numpy.array(obj, copy=True)).In general this class should be nearly as fast as a standard NumPy array, but there is some overhead. This is mitigated by returning a
numpy.ndarraywhenever possible. If every ounce of performance is necessary,HOOMDArray._coerce_to_ndarraycan provide anumpy.ndarrayobject inside the context manager. References to a HOOMDArray object’s buffer after leaving the context manager is UNSAFE. It can cause SEGFAULTs and cause your program to crash. Use this function only if absolutely necessary.Performance Tips
Assume
arepresents aHOOMDArrayfor examples given.Place the
HOOMDArrayto the left of the expression (e.g.a + b + cis faster thanb + a + c). This has to do with the mechanismsHOOMDArrayhas to do to hook into NumPy’s functionality.If a copy will need to be made, do it as early as possible. In other words, if you will need access outside the context manager, use
numpy.array(a, copy=True)before doing any calculations.If you know that your access of the internal buffer is safe and we cannot detect this (i.e. we return a
HOOMDArray), usingHOOMDArray._coerce_to_ndarrayshould help. Note that for large arrays this only gives minimal performance improvements at greater risk of breaking your program.
- class hoomd.data.array.HOOMDGPUArray(*args, **kwargs)¶
Exposes an internal HOOMD-blue GPU buffer.
The HOOMDGPUArray object exposes a GPU data buffer using the __cuda_array_interface__. This class provides buffer access through a context manager to prevent invalid memory accesses (
hoomd.State.gpu_local_snapshot). To avoid errors, do not use references to the data outside the context manager. For example:with sim.state.gpu_local_snapshot as data: # valid within context manager pos = cupy.array(data.particles.position, copy=False) # can use pos within manager pos[:, 2] += 1 # invalid data access can cause SEGFAULTs and other issues pos[:, 2] -= 1
In general, it is safer to not store any
HOOMDGPUArrayreferences to a data buffer. This can be done when necessary, but care must be taken not to use references to the data outside the context manager.Note
The full functionality of this class depends on whether, HOOMD-blue can import CuPy. If CuPy can be imported then, we wrap much of the
cupy.ndarrayclass’s functionality. Otherwise, we just expose the buffer and provide a few basic properties.HOOMDGPUArrayalways supports getting (but not setting) theshape,strides, andndimproperties.HOOMDGPUArraynever supports standard binary operators like (+,-,*). This is a current limitation on external classes hooking into CuPy.When CuPy is imported, slice/element assignment (e.g.
array[0] = 1; array[:2] = 4) and compound assignment operators (e.g.+=,-=,*=) are available. In addition, most methods besidesview,resize,flat,flatiterare available. The same is true for properties except thedataandbaseproperties. See CuPy’s documentation for a list of methods.Tip
Use,
cupy.add,cupy.multiply, etc. for binary operations on the GPU.Note
Packages like Numba and PyTorch can use
HOOMDGPUArraywithout CuPy installed. Any package that supports version 2 of the __cuda_array_interface__ should support the direct use ofHOOMDGPUArrayobjects.