Я не смог найти никакой документации о том, является ли 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()
является блокирующим вызовом.
Итак, мои вопросы:
- Является ли
cudaMallocManaged()
блокирующим вызовом? - Если это так, будет ли он блокировать код хоста до тех пор, пока не завершится выполнение ядра на активном устройстве (выбирается с помощью
cudaSetDevice()
до завершения вызова cudaMallocManaged()
, или будет он блокирует код хоста до завершения выполнения ядра на всех устройствах?