File size: 1,311 Bytes
e14d114 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <ATen/cuda/CUDAContext.h>
#include <c10/cuda/CUDAGuard.h>
#include <torch/all.h>
__global__ void selective_update_kernel(float *__restrict__ out,
float const *__restrict__ input, const int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
out[idx] = input[idx] + 1.0f;
}
}
void selective_update(torch::Tensor &out, torch::Tensor const &input) {
TORCH_CHECK(input.device().is_cuda(), "input must be a CUDA tensor");
TORCH_CHECK(input.is_contiguous(), "input must be contiguous");
TORCH_CHECK(input.scalar_type() == at::ScalarType::Float,
"selective_update only supports float32");
TORCH_CHECK(input.sizes() == out.sizes(),
"Tensors must have the same shape");
TORCH_CHECK(input.scalar_type() == out.scalar_type(),
"Tensors must have the same dtype");
TORCH_CHECK(input.device() == out.device(),
"Tensors must be on the same device");
int n = input.numel();
int threads = 256;
int blocks = (n + threads - 1) / threads;
const at::cuda::OptionalCUDAGuard device_guard(device_of(input));
const cudaStream_t stream = at::cuda::getCurrentCUDAStream();
selective_update_kernel<<<blocks, threads, 0, stream>>>(
out.data_ptr<float>(), input.data_ptr<float>(), n);
} |