как? имеется 2 gpu устройства. на одном из них может уже что-то считаться. нужно сделать так, чтобы работа запускалась на том устройстве, которое не занято.
есть две идеи.
1) воспользоваться nvidia-smi примерно следующим методом:
# get memory usage on device 0
MEM0=`nvidia-smi -q -g 0 2>&1 | grep -A 2 -i utilization \
| grep -i memory | tail -1 | awk '{print $3}' | sed s/\%//g`
# get memory usage on device 1
MEM1=`nvidia-smi -q -g 1 2>&1 | grep -A 2 -i utilization \
| grep -i memory | tail -1 | awk '{print $3}' | sed s/\%//g`
}
#------------------------------------------------------------------------------
function get_gpu
{
# get gpu usage on device 0
GPU0=`nvidia-smi -q -g 0 2>&1 | grep -A 2 -i utilization \
| grep -i gpu | tail -1 | awk '{print $3}' | sed s/\%//g`
# get gpu usage on device 1
GPU1=`nvidia-smi -q -g 1 2>&1 | grep -A 2 -i utilization \
| grep -i gpu | tail -1 | awk '{print $3}' | sed s/\%//g`
}
get_mem
get_gpu
if [ $MEM0 -eq 0 -a $GPU0 -eq 0 ];
then
echo "I am taking device 0"
export DEVICE_TO_USE=0
else
if [ $MEM1 -eq 0 -a $GPU1 -eq 0];
then
echo "I am taking device 1"
export DEVICE_TO_USE=1
else
echo "Both devices are in use. Giving up..."
export DEVICE_TO_USE=-1;
fi
fi
После этого передавать параметр $DEVICE_TO_USE в исполняемый код и там использовать в функции cudaSetDevice()
2) не мучаться с шелл-скриптом, а прямо внутре кода спрашивать, сколько на обоих девайсах имеется свободной памяти при помощи
cudaSetDevice(0);
cudaMemGetInfo(&freemem, &totalmem );
оба варианта не устраивают. мне хочется чтобы было как-то вроде
./a.out --wich_device_option=0
Такое вообще возможно? Я мало знаю о программировании gpu, так что прошу совета.