From 7fb2ee90720ca64267992647ad5e2951ae833587 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Thu, 2 May 2024 13:22:52 -0300 Subject: [PATCH] Fix sum cuda reduce --- build/cuda.cu.o | Bin 62712 -> 58328 bytes build/libtensor.so | Bin 90440 -> 86112 bytes build/tensor.o | Bin 22976 -> 23736 bytes norch/csrc/cuda.cu | 2 ++ norch/csrc/tensor.cpp | 3 +-- test.py | 16 +++++++++------- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/build/cuda.cu.o b/build/cuda.cu.o index 8bbf51d3ab58a49e5ffb3bbb3cac2193945161b9..004bd903204a106adbc3e9f218ad9553aeedc80a 100644 GIT binary patch delta 16589 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 HrMUkC%r3Cc delta 27172 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℘Msk2}5C4Hsm1^uZ5a27w9vl&MNDV7yg+k6yxoG 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 diff --git a/build/tensor.o b/build/tensor.o index 13c474dcddb187c0832e5a9a9584ae2ba3b0413b..9a674298699400a70765c9f6a03601fee1f5a314 100644 GIT binary patch literal 23736 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 S3$-6!=QjEdwB<{){r>{T8`z5g literal 22976 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 NT2(0lb@|k+|G(wXbY=hm diff --git a/norch/csrc/cuda.cu b/norch/csrc/cuda.cu index c24e48a..c757724 100644 --- a/norch/csrc/cuda.cu +++ b/norch/csrc/cuda.cu @@ -90,6 +90,8 @@ __global__ void sum_tensor_cuda_kernel(float* data, float* result_data) { __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data) { + cudaMemcpy(result_data, tensor->data, tensor->size * sizeof(float), cudaMemcpyHostToDevice); + int number_of_blocks = (int)ceil(tensor->size / THREADS_PER_BLOCK); sum_tensor_cuda_kernel<<>>(tensor->data, result_data); sum_tensor_cuda_kernel<<<1, THREADS_PER_BLOCK>>>(result_data, result_data); diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index 22391ee..c361161 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -10,7 +10,7 @@ extern "C" { Tensor* create_tensor(float* data, int* shape, int ndim, char* device) { - + printf("Creating tensor\n"); Tensor* tensor = (Tensor*)malloc(sizeof(Tensor)); if (tensor == NULL) { @@ -172,7 +172,6 @@ extern "C" { float* result_data; cudaMalloc((void**)&result_data, tensor->size * sizeof(float)); - result_data[0] = 0; sum_tensor_cuda(tensor, result_data); return create_tensor(result_data, shape, ndim, device); } diff --git a/test.py b/test.py index 8cff585..7efccf6 100644 --- a/test.py +++ b/test.py @@ -27,33 +27,35 @@ if __name__ == "__main__": #d = b-c - a = norch.Tensor([[1, 2], [1, 2], [1, 2]], requires_grad=True)#.to("cuda") + """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 = (a@b).reshape([9]) d = c.sum() d.backward() - print(a.grad) + print(a.grad)""" """#print(a) - N = 1000 - a = Tensor([[random.uniform(0, 1) for _ in range(N)] for _ in range(N)]) - b = Tensor([[random.uniform(0, 1) for _ in range(N)] for _ in range(N)]) + """ + N = 10 + a = norch.Tensor([[1 for _ in range(N)] for _ in range(N)]) + #b = norch.Tensor([[random.uniform(0, 1) for _ in range(N)] for _ in range(N)]) #b = Tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) #a = Tensor([[[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]]]) #b = Tensor([[[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]]]) ini = time.time() - c = a + b + c = a.sum() print("\n#####2######") fim = time.time() print(fim-ini) - + print(c) print("\n\n") + """ a = [[random.uniform(0, 1) for _ in range(N)] for _ in range(N)] b = [[random.uniform(0, 1) for _ in range(N)] for _ in range(N)]