Как использовать несколько gpus в кластере при условии, что кто-то еще отправил задачу? - PullRequest
0 голосов
/ 15 января 2019

В школе имеется вычислительный кластер на GPU с 8 GPUS на каждом узле. И мы используем систему управления задачами SLURM для управления задачами. Система SLURM предписана, если на GPU есть задача, тогда новые задачи не будут назначены этому GPU.

Например: на узле 1 имеется 8 GPU TITAN XP, и ни одна задача не отправляется, поэтому мы можем использовать все 8 GPUS. В этой ситуации я могу использовать простой код на c ++ / cuda, чтобы использовать их все, например:

    for(int i = 0; i < 8; i++) {
        cudaSetDevice(i); 
        ......
    }

Но почти всегда кто-то имеет задачу отправки, они могут использовать только один или два графических процессора, , например . Его задача выполняется во втором графическом процессоре.

Если я отправлю свою задачу, также используйте приведенный выше простой код, он выдаст ошибку:

CUDA error at optStream.cu:496 code=10(cudaErrorInvalidDevice) "cudaSetDevice(coreID)"

Я не знаю, как решить эту ситуацию, я не хочу проверять номер неработающего графического процессора и перекомпилировать программу, это слишком неэффективно.

Так что мне нужен совет.

1 Ответ

0 голосов
/ 15 января 2019

SLURM должен правильно устанавливать переменную окружения CUDA_VISIBLE_DEVICES для идентификаторов графических процессоров, выделенных для вашей работы (подсказка: выведите эту переменную в сценарий: если это не происходит, ее необходимо исправить).

В вашем коде вам нужно будет использовать «все доступные графические процессоры», что означает не все физически доступные графические процессоры, а те, что перечислены в этой переменной среды.

Ваш код будет переносимым с:

int count;
cudaGetDeviceCount ( &count );
for(int i = 0; i < count; i++) {
    cudaSetDevice(i); 
    ......
}

Пример: если CUDA_VISIBLE_DEVICES=2,3, тогда ваш код будет работать на графических процессорах 2,3 - но вы увидите их как устройства 0 и 1 в коде.

...