diff --git a/unit_tests/Test_AvgPoolingImpl.cpp b/unit_tests/Test_AvgPoolingImpl.cpp index d270fbc9c72f5d057c4617bd1ba28704bf0ce6ee..d4d39db555e9d12c7e5135d1eb3db6ffc8f459c3 100644 --- a/unit_tests/Test_AvgPoolingImpl.cpp +++ b/unit_tests/Test_AvgPoolingImpl.cpp @@ -160,140 +160,4 @@ TEST_CASE("[gpu/operator] AvgPooling(forward)", "[AvgPooling][GPU]") { delete[] computedOutput; } - - int number_of_operation{0}; - SECTION("Random Input") { - constexpr std::uint16_t NBTRIALS = 10; - std::size_t kernel = 2; - std::size_t stride = 2; - // Create a random number generator - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_real_distribution<float> valueDist( - 0.1f, 1.1f); // Random float distribution between 0 and 1 - std::uniform_int_distribution<std::size_t> dimSizeDist(std::size_t(2), - std::size_t(10)); - - std::uniform_int_distribution<std::size_t> nbDimsDist(std::size_t(4), std::size_t(4)); - - // Create AveragePooling Operator - std::shared_ptr<Node> myAvgPool = AvgPooling({kernel,kernel}, "myAvgPool", {stride,stride}); - auto op = std::static_pointer_cast<OperatorTensor>(myAvgPool -> getOperator()); - op->setDataType(DataType::Float32); - op->setBackend("cpu"); - - // Create the input Tensor - std::shared_ptr<Tensor> T0 = std::make_shared<Tensor>(); - op->associateInput(0, T0); - T0->setDataType(DataType::Float32); - T0->setBackend("cpu"); - - // To measure execution time of 'AveragePooling_Op::forward()' - std::chrono::time_point<std::chrono::system_clock> start; - std::chrono::time_point<std::chrono::system_clock> end; - std::chrono::duration<double, std::micro> duration{}; - std::size_t number_of_operation = 0; - - SECTION("OutDims") { - for (std::uint16_t trial = 0; trial < NBTRIALS; ++trial) { - // generate a random Tensor - const std::size_t nbDims = nbDimsDist(gen); - std::vector<std::size_t> dims; - for (std::size_t i = 0; i < nbDims; ++i) { - dims.push_back(dimSizeDist(gen)); - } - - const std::size_t nb_elements = std::accumulate(dims.cbegin(), dims.cend(), std::size_t(1), std::multiplies<std::size_t>()); - number_of_operation += nb_elements; - - // Fill input tensor - float* array0 = new float[nb_elements]; - for (std::size_t i = 0; i < nb_elements; ++i) { - array0[i] = valueDist(gen); - } - T0->resize(dims); - T0 -> getImpl() -> setRawPtr(array0, nb_elements); - - // Run inference - op->computeOutputDims(); - start = std::chrono::system_clock::now(); - myAvgPool->forward(); - end = std::chrono::system_clock::now(); - duration += std::chrono::duration_cast<std::chrono::microseconds>(end - start); - - // Verify output dimensions - REQUIRE(op->getOutput(0)->nbDims() == dims.size()); - for (size_t i = 0; i < op->getOutput(0)->nbDims(); ++i) { - if(i == 2 || i == 3) - REQUIRE(op->getOutput(0)->dims()[i] == (1 + static_cast<DimSize_t>(std::floor(static_cast<float>(dims[i] - kernel) / static_cast<float>(stride))))); - else - REQUIRE(op->getOutput(0)->dims()[i] == dims[i]); - } - - delete[] array0; - } - std::cout << "number of elements over time spent: " << (number_of_operation / duration.count())<< std::endl; - std::cout << "total time: " << duration.count() << "μs" << std::endl; - } - - SECTION("Values") { - for (std::uint16_t trial = 0; trial < NBTRIALS; ++trial) { - // generate a random Tensor - const std::size_t nbDims = nbDimsDist(gen); - std::vector<std::size_t> dims; - for (std::size_t i = 0; i < nbDims; ++i) { - dims.push_back(dimSizeDist(gen)); - } - - const std::size_t nb_elements = std::accumulate(dims.cbegin(), dims.cend(), std::size_t(1), std::multiplies<std::size_t>()); - number_of_operation += nb_elements; - - // Fill input tensor - float* array0 = new float[nb_elements]; - for (std::size_t i = 0; i < nb_elements; ++i) { - array0[i] = valueDist(gen); - } - T0->resize(dims); - T0 -> getImpl() -> setRawPtr(array0, nb_elements); - - // Fill expected output - std::vector<float> result; - std::size_t rows = dims[2], cols = dims[3], nbMat = dims[0] * dims[1], matSize = rows*cols; - for (size_t i = 0; i < nbMat; i++) - { - for(size_t r=0; r< rows; r += stride){ - for(size_t c=0; c< cols; c += stride){ - float sum = 0.0f; - for (size_t m = 0; m < kernel; m++) - { - for (size_t n = 0; n < kernel; n++) - { - sum += array0[i * matSize + (r + m) * cols + c + n]; - } - } - result.push_back(sum/(kernel*kernel)); - } - } - } - - // Run inference - op->computeOutputDims(); - start = std::chrono::system_clock::now(); - myAvgPool->forward(); - end = std::chrono::system_clock::now(); - duration += std::chrono::duration_cast<std::chrono::microseconds>(end - start); - - op->getOutput(0)->print(); - float* computedOutput = static_cast<float*>(op->getOutput(0)->getImpl()->rawPtr()); - for (size_t i = 0; i < op->getOutput(0)->size(); i++) - { - REQUIRE(abs(computedOutput[i] - result[i]) < 1e-6); - } - - delete[] array0; - } - std::cout << "number of elements over time spent: " << (number_of_operation / duration.count())<< std::endl; - std::cout << "total time: " << duration.count() << "μs" << std::endl; - } - } } \ No newline at end of file