Вопросы о cudaStreamSynchronize в Pytorch - PullRequest
0 голосов
/ 21 марта 2020

Я пользователь pytorch (1.0.1). Я хотел бы задать вопрос об операторе cuda. Этот вопрос беспокоил меня долгое время, и я не нашел ответа.

Многие операторы cuda, такие как "aten / src / ATen / native / cuda / Activation.cu: prelu_cuda".

Tensor prelu_cuda(const Tensor& self, const Tensor& weight_) {
...
    // config to run cuda kernel
    int64_t input_numel = input.numel();
    const dim3 block = dim3(std::min(static_cast<int64_t>(cuda::getApplyBlock().x), input_numel));
    dim3 grid;
    int curDevice = -1;
    cudaGetDevice(&curDevice);
    cudaStream_t stream = at::cuda::getCurrentCUDAStream(curDevice);
    TORCH_CHECK(cuda::getApplyGrid(input_numel, grid, curDevice), "prelu: input too large or too many dimensions");

    AT_DISPATCH_FLOATING_TYPES_AND(at::ScalarType::Half, input.scalar_type(), "prelu_cuda", [&] {
      prelu_cuda_kernel_multi_weights<scalar_t>
      <<<grid, block, 0, stream>>>(
        result.data_ptr<scalar_t>(),
        input.data_ptr<scalar_t>(),
        weight.data_ptr<scalar_t>(),
        input_stride0,
        input_stride1,
        input_numel);
    });
  }
  return result;
}

В этой функции «at :: cuda :: getCurrentCUDAStream (curDevice)» вызывается для prelu_cuda, но «cudaStreamSynchronize (stream)» не вызывается, я знаю, что операторы cuda являются асинхронными, но должен разумно вызвать "cudaStreamSynchronize (stream)" в подходящем месте, я нашел только "cudaStreamSynchronize (stream)" в "aten / src / ATen / native / cuda / Copy.cu", но это происходит в процессе копирования процессора в када или када к процессору. Если работает сеть, ЦП высвобождает память, выделенную для cuda заранее, например, вызывая cudaFree, но cuda не рассчитывается в это время, освобождение этих ресурсов cuda инициируется освобождением временного Tensor в сети (если Я ошибаюсь, пожалуйста, поправьте меня, спасибо), это вызовет серьезные проблемы, верно? Итак, я хочу знать, как pytorch гарантирует, что cuda уже рассчитывается при выпуске временного Tensor, я думаю, что cudaStreamSynchronize должен быть вызван один раз перед выпуском промежуточного Tensor, и копирование не произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...