diff --git a/build/cuda.cu.o b/build/cuda.cu.o index 94ea9cd..e6f0304 100644 Binary files a/build/cuda.cu.o and b/build/cuda.cu.o differ diff --git a/build/tensor.o b/build/tensor.o index f49cc88..43889bd 100644 Binary files a/build/tensor.o and b/build/tensor.o differ diff --git a/norch/csrc/cuda.cu b/norch/csrc/cuda.cu index 46af278..c9de11f 100644 --- a/norch/csrc/cuda.cu +++ b/norch/csrc/cuda.cu @@ -172,9 +172,10 @@ __global__ void sum_tensor_axis_cuda_kernel(float* data, float* result_data, int __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data, int axis) { - if (axis == -1) { - cudaMemcpy(result_data, tensor->data, tensor->size * sizeof(float), cudaMemcpyHostToDevice); + cudaMemcpy(result_data, tensor->data, tensor->size * sizeof(float), cudaMemcpyHostToDevice); + if (axis == -1) { + int num_blocks = (tensor->size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; // First-level reduction @@ -198,17 +199,10 @@ __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data, int axis) { } else { int axis_size = tensor->shape[axis]; - // Allocate memory for temporary storage on the device - float* temp_data; - cudaMalloc(&temp_data, tensor->size * sizeof(float)); - - // Copy tensor data to device - cudaMemcpy(temp_data, tensor->data, tensor->size * sizeof(float), cudaMemcpyHostToDevice); - int num_blocks = (tensor->size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; // First-level reduction - sum_tensor_axis_cuda_kernel<<>>(temp_data, result_data, tensor->size, axis_size); + sum_tensor_axis_cuda_kernel<<>>(result_data, result_data, tensor->size, axis_size); // If necessary, perform multiple levels of reduction while (num_blocks > 1) { @@ -217,9 +211,6 @@ __host__ void sum_tensor_cuda(Tensor* tensor, float* result_data, int axis) { num_blocks = num_blocks_next; } - // Free allocated memory on the device - cudaFree(temp_data); - cudaError_t error = cudaGetLastError(); if (error != cudaSuccess) { printf("CUDA error: %s\n", cudaGetErrorString(error)); diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index 1f374f8..9b08196 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -182,7 +182,7 @@ 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); } @@ -208,10 +208,9 @@ extern "C" { } if (strcmp(tensor->device, "cuda") == 0) { - + float* result_data; cudaMalloc((void**)&result_data, size * sizeof(float)); - cudaMemset(result_data, 0, size * sizeof(float)); sum_tensor_cuda(tensor, result_data, axis); if (keepdim) { diff --git a/norch/libtensor.so b/norch/libtensor.so index 6074e46..6c1f5ae 100755 Binary files a/norch/libtensor.so and b/norch/libtensor.so differ