From 718a4c9823d7a4c5b25bd37082f816c5ed70bc2d Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Wed, 22 May 2024 19:55:00 -0300 Subject: [PATCH] sum axis cuda version 2 --- build/cuda.cu.o | Bin 172480 -> 166768 bytes build/tensor.o | Bin 52248 -> 52448 bytes norch/csrc/cuda.cu | 65 ++++++++++++++++++------------------------ norch/csrc/cuda.h | 2 +- norch/csrc/tensor.cpp | 5 ++++ norch/libtensor.so | Bin 224720 -> 220544 bytes norch/tensor.py | 9 ++++++ 7 files changed, 42 insertions(+), 39 deletions(-) diff --git a/build/cuda.cu.o b/build/cuda.cu.o index ff4eb61095d9598c4ccc397047d2297249d74628..a60bfa824dbe46bca8440778da4b8210a02983cd 100644 GIT binary patch delta 25588 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 Q5;j1!;#=A94O-#<0}d$TXaE2J diff --git a/build/tensor.o b/build/tensor.o index a24d9f744a9502641647a3264ae7c3d1c2f7b056..f49cc8826197a6d53d0f1c55bdd5b8c263457af8 100644 GIT binary patch literal 52448 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 Pp>}r 0; s >>= 1) { - if (tid < s) { + if (tid < s && i < block_offset + axis_size) { partial_sum[tid] += partial_sum[tid + s]; } __syncthreads(); @@ -175,7 +166,7 @@ __global__ void sum_tensor_cuda_kernel_axis(float* data, float* result_data, int // Write block sum to global memory if (tid == 0) { - result_data[bid] = partial_sum[0]; + result_data[blockIdx.x] = partial_sum[0]; } } @@ -203,33 +194,31 @@ __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data, int axis) { } cudaDeviceSynchronize(); - - } else { - if (axis < 0 || axis >= tensor->ndim) { - printf("Invalid axis\n"); - return; - } - int total_size = tensor->size; + } else { int axis_size = tensor->shape[axis]; - int outer_dim_size = total_size / axis_size; + // Allocate memory for temporary storage on the device + float* temp_data; + cudaMalloc(&temp_data, tensor->size * sizeof(float)); - int num_blocks = (outer_dim_size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; + // Copy tensor data to device + cudaMemcpy(temp_data, tensor->data, tensor->size * sizeof(float), cudaMemcpyHostToDevice); - int* d_shape; - int* d_strides; - cudaMalloc(&d_shape, tensor->ndim * sizeof(int)); - cudaMalloc(&d_strides, tensor->ndim * sizeof(int)); - cudaMemcpy(d_shape, tensor->shape, tensor->ndim * sizeof(int), cudaMemcpyHostToDevice); - cudaMemcpy(d_strides, tensor->strides, tensor->ndim * sizeof(int), cudaMemcpyHostToDevice); + int num_blocks = (tensor->size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; - sum_tensor_cuda_kernel_axis<<>>( - tensor->data, result_data, d_shape, d_strides, tensor->ndim, axis, axis_size - ); + // First-level reduction + sum_tensor_axis_cuda_kernel<<>>(temp_data, result_data, tensor->size, axis_size); - cudaFree(d_shape); - cudaFree(d_strides); + // If necessary, perform multiple levels of reduction + while (num_blocks > 1) { + int num_blocks_next = (num_blocks + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; + sum_tensor_cuda_kernel<<>>(result_data, result_data, num_blocks); + num_blocks = num_blocks_next; + } + + // Free allocated memory on the device + cudaFree(temp_data); cudaError_t error = cudaGetLastError(); if (error != cudaSuccess) { diff --git a/norch/csrc/cuda.h b/norch/csrc/cuda.h index 153173b..5e180cf 100644 --- a/norch/csrc/cuda.h +++ b/norch/csrc/cuda.h @@ -14,7 +14,7 @@ __host__ void sub_broadcasted_tensor_cuda(Tensor* tensor1, Tensor* tensor2, float* result_data, int* broadcasted_shape, int broadcasted_size); __global__ void sum_tensor_cuda_kernel(float* data, float* result_data); - __global__ void sum_tensor_cuda_kernel_axis(float* data, float* result_data, int* shape, int* strides, int ndim, int axis, int axis_size); + __global__ void sum_tensor_axis_cuda_kernel(float* data, float* result_data, int size, int axis_size); __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data, int axis); __global__ void sub_tensor_cuda_kernel(float* data1, float* data2, float* result_data, int size); diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index b6d2aae..1f374f8 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -182,6 +182,11 @@ extern "C" { } int ndim; int* shape; + + if (axis > tensor->ndim - 1) { + fprintf(stderr, "Error: axis argument %d must be smaller than tensor dimension %d", axis, tensor->ndim); + } + if (axis == -1) { shape = (int*) malloc(sizeof(int)); diff --git a/norch/libtensor.so b/norch/libtensor.so index 709baff8c43f879330fcdfbdf2b06ae1cfdcbf9e..d5ff2a22ca085e02c213e9795b8508a103ab1fc2 100755 GIT binary patch delta 42939 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 CE$Mv# delta 49072 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– zsuXrFiOulls>oYDxYsj5=C?<;k;&#)lU0Vg;XKd$v^~m==R4w`%x~afZx7eoN#=L6 zP@mOX%r{!1;^>wifDRnpw;bNm42f!K?*xhzZoNa5Ry<};F$NE?dQv-n(!%39}C z&iqKOfax5hTJzlA^bxj=Q5BP3qJ+9i)0n@WaBq!FQT&r)F5gk>@o6nPDx>BjOs z^Y$mDFzIty$NZtoO8*E~VN2Yi+vhUINn5xSF7w2R))XlHT`TfSSW*7Fvgp`5nV-Vf zx;qL^_gG7 zic>uO*W*A9^EZoC*1E#H5>!sXe6N(nB}-!dh1-hIZ8}G$rkD`{W7#}3x%AN#v!}zW z)3`BD%f(J}sbfNETB`Yt!;vBVI+^O{M4SKN_cwFK4IP~`VW@NTgwmd!%=dhav<$gt zx}(`2e_C{YH#2r&&yH$0R0dH56>$`;E`~eZ1seh5~`n}YrM5VKJ|o|9H5_}J8#R9C(JGZ z`q_E*ZCQc+Q2oqYqX?Jrxn^>RerB%Gl=-=))1MbWs$0mCTpYH39v&kr>h1c)$mo%< z@>6lYSec7my$&McO#8s9<%*Fw9{nu5y0xqri2@3KE{0{I=uy~r^1d@c=8iIZ7{C%> hKyiW!gO8EVLg!!HQ|-@`t^Q self.ndim - 1: + raise ValueError(f"Error: axis argument {axis} cannot be higher than tensor dimension {self.ndim}") + Tensor._C.sum_tensor.argtypes = [ctypes.POINTER(CTensor), ctypes.c_int, ctypes.c_bool] Tensor._C.sum_tensor.restype = ctypes.POINTER(CTensor) @@ -834,6 +837,9 @@ class Tensor: if axis == None: axis = -1 + if axis > self.ndim - 1: + raise ValueError(f"Error: axis argument {axis} cannot be higher than tensor dimension {self.ndim}") + Tensor._C.max_tensor.argtypes = [ctypes.POINTER(CTensor), ctypes.c_int, ctypes.c_bool] Tensor._C.max_tensor.restype = ctypes.POINTER(CTensor) @@ -874,6 +880,9 @@ class Tensor: if axis == None: axis = -1 + + if axis > self.ndim - 1: + raise ValueError(f"Error: axis argument {axis} must be smaller than tensor dimension {self.ndim}") Tensor._C.min_tensor.argtypes = [ctypes.POINTER(CTensor), ctypes.c_int, ctypes.c_bool] Tensor._C.min_tensor.restype = ctypes.POINTER(CTensor)