DEME runs a dynamic worker (dT) and a kinematic/contact-detection worker
(kT). Their logical CUDA devices are selected when DEMSolver is
constructed.
import deme
solver = deme.DEMSolver(1) # dT and kT both use logical device 0DEMSolver() is equivalent to DEMSolver(2). When at least two devices
are visible, it assigns dT to device 0 and kT to device 1. If only one is
visible, DEME warns and assigns both workers to device 0. Only counts 1 and 2
are accepted.
Use a list to choose devices rather than relying on the first visible devices:
.. literalinclude:: examples/device_selection.py :language: python :linenos:
A one-element list assigns both workers to that device. In a two-element list,
the first ID is assigned to dT and the second to kT. Repeated IDs are valid, so
DEMSolver([2, 2]) places both workers on logical device 2.
GetGPUDeviceIDs() returns [dT_device, kT_device] and is useful for
logging or choosing a destination device for direct data retrieval.
IDs are CUDA logical device IDs as seen by this process. Environment-level
masking and reordering such as CUDA_VISIBLE_DEVICES therefore affect the
numbering. For example:
CUDA_VISIBLE_DEVICES=3,1 python my_simulation.pyInside that process, logical device 0 denotes physical device 3 and logical device 1 denotes physical device 1. An explicit ID must be non-negative and smaller than the number of visible devices; invalid IDs fail during construction.
The constructor allocates CUDA resources. Select visibility before starting Python, and construct the solver only after the intended CUDA environment is in place.