Блокируется ли cudaMallocManaged ()? - PullRequest
0 голосов
/ 21 апреля 2020

Я не смог найти никакой документации о том, является ли cudaMallocManaged() блокирующим вызовом или нет.

В частности, если у меня есть два ядра, которые будут запускаться с <<< x, y, 0, stream>>> (где поток не является значением по умолчанию) stream), можно ли вызвать cudaMallocManaged() между кодом запуска этих двух ядер, не блокируя второе?

Точнее говоря, я использую al oop для распределения задач между несколькими графическими процессорами. Примерно так:

__global__ void kernel_1(int* input, int* intermediate_results) { ... }
__global__ void kernel_2(int* intermediate_results, int* output) { ... }

#define DEVICE_COUNT 4

std::vector<cudaStream_t> streams(DEVICE_COUNT);
for (unsigned i = 0; i < DEVICE_COUNT; ++i) {
    cudaSetDevice(i);
    cudaStreamCreate(&streams[i]);
}

unsigned device = 0;
for (unsigned batch_idx = 0; batch_idx < total_batch; ++batch_idx) {
    cudaSetDevice(device);

    // allocate memory for storing intermediate results
    // note the size of the intermediate results changes from time to time (e.g. based on input)
    int* intermediate_results;
    cudaMallocManaged(&intermediate_results, input[batch_idx] * sizeof(int));

    kernel_1 <<< ..., streams[device] >>> (input, intermediate_results);
    kernel_2 <<< ..., streams[device] >>> (intermediate_results, output);

    cudaFree(intermediate_results);
    device = (device+1) % DEVICE_COUNT;
}

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

Итак, мои вопросы:

  1. Является ли cudaMallocManaged() блокирующим вызовом?
  2. Если это так, будет ли он блокировать код хоста до тех пор, пока не завершится выполнение ядра на активном устройстве (выбирается с помощью cudaSetDevice() до завершения вызова cudaMallocManaged(), или будет он блокирует код хоста до завершения выполнения ядра на всех устройствах?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...