diff --git a/onnxruntime/core/providers/cuda/generator/range.cc b/onnxruntime/core/providers/cuda/generator/range.cc index 347d54ee85..cc57d9d2a5 100644 --- a/onnxruntime/core/providers/cuda/generator/range.cc +++ b/onnxruntime/core/providers/cuda/generator/range.cc @@ -18,11 +18,15 @@ ONNX_OPERATOR_KERNEL_EX( kOnnxDomain, 11, kCudaExecutionProvider, - KernelDefBuilder().TypeConstraint("T", {DataTypeImpl::GetTensorType(), - DataTypeImpl::GetTensorType(), - DataTypeImpl::GetTensorType(), - DataTypeImpl::GetTensorType(), - DataTypeImpl::GetTensorType()}), + KernelDefBuilder() + .InputMemoryType(0) // start + .InputMemoryType(1) // limit + .InputMemoryType(2) // delta + .TypeConstraint("T", {DataTypeImpl::GetTensorType(), + DataTypeImpl::GetTensorType(), + DataTypeImpl::GetTensorType(), + DataTypeImpl::GetTensorType(), + DataTypeImpl::GetTensorType()}), Range); template @@ -47,17 +51,13 @@ static Status ComputeRange(OpKernelContext* ctx) { delta_tensor_ptr->Shape()); } - // Start, Limit and Delta are stored in GPU. So we need copy it to CPU to read. - // It is better to store these tensors in pinned memory or CPU for better performance. - T start; - CUDA_RETURN_IF_ERROR(cudaMemcpy(&start, start_tensor.template Data(), sizeof(T), cudaMemcpyDeviceToHost)); - - T limit; - CUDA_RETURN_IF_ERROR(cudaMemcpy(&limit, limit_tensor.template Data(), sizeof(T), cudaMemcpyDeviceToHost)); + // Start, Limit and Delta are stored in CPU. + T start = *(start_tensor.template Data()); + T limit = *(limit_tensor.template Data()); T delta = T(1); if (delta_tensor_ptr != nullptr) { - CUDA_RETURN_IF_ERROR(cudaMemcpy(&delta, delta_tensor_ptr->template Data(), sizeof(T), cudaMemcpyDeviceToHost)); + delta = *(delta_tensor_ptr->template Data()); } if (delta == T(0)) {