From 9981bb8b6f3d04133e536801547f7ced12394bb7 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Wed, 1 May 2024 03:09:05 -0300 Subject: [PATCH] Fix cuda sum reduce --- build/cuda.cu.o | Bin 55088 -> 58576 bytes build/libtensor.so | Bin 85592 -> 85808 bytes build/tensor.o | Bin 22560 -> 22600 bytes norch/__pycache__/tensor.cpython-38.pyc | Bin 8844 -> 8844 bytes norch/csrc/cuda.cu | 4 ++-- norch/csrc/cuda.h | 3 ++- norch/csrc/tensor.cpp | 6 +++--- test.py | 9 +++++---- 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/build/cuda.cu.o b/build/cuda.cu.o index f088d3ea8de827c2949403e062217d944669e50e..99d9f0fa5f492b85a3fef8205868978b48cef51b 100644 GIT binary patch delta 14202 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 delta 11370 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 Pj4$NnJ_P>jqxJs*G12s* delta 18349 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 delta 189 zcmV;u07CzaMT|uaRSgXa00000=*cl=y|E2G1pxxHOa+qx0Xvi626zEFvsni{0Rc;s z$q5~^v 1) { int threads = (remaining + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; - sum_block<<<1, threads, threads * sizeof(float)>>>(result_data, remaining); - remaining = (remaining + threadsPerBlock - 1) / threadsPerBlock; + aux_sum_block_kernel<<<1, threads, threads * sizeof(float)>>>(result_data, remaining); + remaining = (remaining + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; levelSize = remaining; } diff --git a/norch/csrc/cuda.h b/norch/csrc/cuda.h index bb06a67..606fb70 100644 --- a/norch/csrc/cuda.h +++ b/norch/csrc/cuda.h @@ -7,8 +7,8 @@ __global__ void add_tensor_cuda_kernel(float* data1, float* data2, float* result_data, int size); __host__ void add_tensor_cuda(Tensor* tensor1, Tensor* tensor2, float* result_data); + __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data, int number_of_blocks); __global__ void sum_tensor_cuda_kernel(float* data, float* result_data, int size); - __host__ void sum_tensor_cuda(Tensor* tensor1, float* result_data); __global__ void sub_tensor_cuda_kernel(float* data1, float* data2, float* result_data, int size); __host__ void sub_tensor_cuda(Tensor* tensor1, Tensor* tensor2, float* result_data); @@ -36,4 +36,5 @@ + #endif /* CUDA_KERNEL_H_ */ diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index 20d9f85..4f7d765 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -171,9 +171,9 @@ extern "C" { if (strcmp(tensor->device, "cuda") == 0) { float* result_data; - int num_of_blocks = (tensor->size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; - cudaMalloc((void **)&num_of_blocks, 1 * sizeof(float)); - sum_tensor_cuda(tensor, result_data, int num_of_blocks); + int number_of_blocks = (tensor->size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; + cudaMalloc((void**)&result_data, number_of_blocks * sizeof(float)); + sum_tensor_cuda(tensor, result_data, number_of_blocks); return create_tensor(result_data, shape, ndim, device); } else { diff --git a/test.py b/test.py index fb6378b..56813ba 100644 --- a/test.py +++ b/test.py @@ -30,11 +30,12 @@ if __name__ == "__main__": a = norch.Tensor([[1, 2], [1, 2], [1, 2]], requires_grad=True)#.to("cuda") b = norch.Tensor([[1, 400, 3], [1, 2, 3]], requires_grad=True) - c = (b @ a) * 5 - d = c.sum() - d.backward() + print(a.sum()) + #c = (b @ a) * 5 + #d = c.sum() + #d.backward() - print(a.grad) + #print(a.grad) """#print(a) N = 1000