How to select GPU when doing thread-based parallel?
1 view (last 30 days)
I am running programs using multiple GPUs that are shared with other users in our university's super computer. To improve speed, I run programs parallelly in many workers. I would like to put more workers to GPUs that are freer, and less on GPUs that are busier. For example, I would like 4 workers to use a GPU that is 100% free, and 2 workers to a GPU that has 50% occupied by another user.
I know how to do this when I use process-based pool. I can assign a GPU to a worker by doing:
But I do not know how to do it using thread-based pool, i.e., a pool generated using
Using spmd is not available for a thread-based pool.
I would really appreciate your input on this. Thanks.
Edric Ellis on 12 Jul 2022
Unfortunately, spmd is indeed not yet supported for thread-based pools. Until it is, you can do something like the following to get a stable worker ID. Note that I am not advocating this as an example of sensible programming... this relies on the fact that thread-based workers are guaranteed to have different random number streams.
% Cause each worker to create a (hopefully) unique random number, store in
% 'c.Value' per worker.
c = parallel.pool.Constant(@rand);
% Retrieve all values back to the client
allVals = fetchOutputs(parfevalOnAll(@(c) c.Value, 1, c));
% This function, when evaluated on a worker, will indicate which position
% that worker got in the list ...
fcn = @(c) find(allVals == c.Value);
% ... like this:
fetchOutputs(parfevalOnAll(fcn, 1, c))