Я пользователь 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, и копирование не произошло.