From 8adb7ab49d46c11e8ace65eb8e1927bd069477b2 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Mon, 31 Aug 2020 12:59:22 +0100 Subject: [PATCH] Added tests to validate opcreatetensor components --- src/Tensor.cpp | 4 +- test/TestMultipleAlgoExecutions.cpp | 167 ++++++++++++++++++ test/TestOpCreateTensor.cpp | 113 ++++++++++++ ...cpp => TestOpShadersFromStringAndFile.cpp} | 0 4 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 test/TestMultipleAlgoExecutions.cpp create mode 100644 test/TestOpCreateTensor.cpp rename test/{TestCustomOpRawShaders.cpp => TestOpShadersFromStringAndFile.cpp} (100%) diff --git a/src/Tensor.cpp b/src/Tensor.cpp index 36871ea7a..7bbcfb3d6 100644 --- a/src/Tensor.cpp +++ b/src/Tensor.cpp @@ -85,7 +85,7 @@ Tensor::tensorType() bool Tensor::isInit() { - return this->mIsInit; + return this->mIsInit && this->mBuffer && this->mMemory; } void @@ -352,6 +352,7 @@ Tensor::freeMemoryDestroyGPUResources() } else { SPDLOG_DEBUG("Kompose Tensor destroying buffer"); this->mDevice->destroy(*this->mBuffer); + this->mBuffer = nullptr; } } @@ -362,6 +363,7 @@ Tensor::freeMemoryDestroyGPUResources() } else { SPDLOG_DEBUG("Kompose Tensor freeing memory"); this->mDevice->freeMemory(*this->mMemory); + this->mDevice = nullptr; } } diff --git a/test/TestMultipleAlgoExecutions.cpp b/test/TestMultipleAlgoExecutions.cpp new file mode 100644 index 000000000..d3a696318 --- /dev/null +++ b/test/TestMultipleAlgoExecutions.cpp @@ -0,0 +1,167 @@ + +#include "catch2/catch.hpp" + +#include "kompute/Kompute.hpp" + +#include + +TEST_CASE("test_multiple_algo_exec_single_cmd_buf_record") { + + kp::Manager mgr; + + std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 })}; + + std::string shader( + "#version 450\n" + "layout (local_size_x = 1) in;\n" + "layout(set = 0, binding = 0) buffer a { uint pa[]; };\n" + "void main() {\n" + " uint index = gl_GlobalInvocationID.x;\n" + " pa[index] = pa[index] + 1;\n" + "}\n" + ); + + std::weak_ptr sqWeakPtr = mgr.getOrCreateManagedSequence("newSequence"); + if (std::shared_ptr sq = sqWeakPtr.lock()) { + sq->begin(); + + sq->record({ tensorA }); + + sq->record>( + { tensorA }, + false, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + sq->record>( + { tensorA }, + false, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + sq->record>( + { tensorA }, + true, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + } + sqWeakPtr.reset(); + + REQUIRE(tensorA->data() == std::vector{3, 3, 3}); +} + +TEST_CASE("test_multiple_algo_exec_multiple_record") { + + kp::Manager mgr; + + std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 })}; + + std::string shader( + "#version 450\n" + "layout (local_size_x = 1) in;\n" + "layout(set = 0, binding = 0) buffer a { uint pa[]; };\n" + "void main() {\n" + " uint index = gl_GlobalInvocationID.x;\n" + " pa[index] = pa[index] + 1;\n" + "}\n" + ); + + std::weak_ptr sqWeakPtr = mgr.getOrCreateManagedSequence("newSequence"); + if (std::shared_ptr sq = sqWeakPtr.lock()) { + sq->begin(); + + sq->record({ tensorA }); + + sq->record>( + { tensorA }, + false, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + + sq->begin(); + + sq->record>( + { tensorA }, + false, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + + sq->begin(); + + sq->record>( + { tensorA }, + true, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + } + sqWeakPtr.reset(); + + REQUIRE(tensorA->data() == std::vector{3, 3, 3}); + +} + +TEST_CASE("test_multiple_algo_exec_multiple_sequence") { + + kp::Manager mgr; + + std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 })}; + + std::string shader( + "#version 450\n" + "layout (local_size_x = 1) in;\n" + "layout(set = 0, binding = 0) buffer a { uint pa[]; };\n" + "void main() {\n" + " uint index = gl_GlobalInvocationID.x;\n" + " pa[index] = pa[index] + 1;\n" + "}\n" + ); + + std::weak_ptr sqWeakPtr = mgr.getOrCreateManagedSequence("newSequence"); + if (std::shared_ptr sq = sqWeakPtr.lock()) { + sq->begin(); + + sq->record({ tensorA }); + + sq->record>( + { tensorA }, + true, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + } + + std::weak_ptr sqWeakPtr2 = mgr.getOrCreateManagedSequence("newSequence2"); + if (std::shared_ptr sq = sqWeakPtr.lock()) { + sq->begin(); + + sq->record>( + { tensorA }, + true, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + } + + + std::weak_ptr sqWeakPtr3 = mgr.getOrCreateManagedSequence("newSequence3"); + if (std::shared_ptr sq = sqWeakPtr.lock()) { + sq->begin(); + + sq->record>( + { tensorA }, + true, // Whether to copy output from device + std::vector(shader.begin(), shader.end())); + + sq->end(); + sq->eval(); + } + + REQUIRE(tensorA->data() == std::vector{3, 3, 3}); +} + diff --git a/test/TestOpCreateTensor.cpp b/test/TestOpCreateTensor.cpp new file mode 100644 index 000000000..1774d3d63 --- /dev/null +++ b/test/TestOpCreateTensor.cpp @@ -0,0 +1,113 @@ + +#include "catch2/catch.hpp" + +#include "kompute/Kompute.hpp" + +#include + +TEST_CASE("test_opcreatetensor_create_single_tensor") { + + kp::Manager mgr; + + std::vector testVecA{ 9, 8, 7 }; + + std::shared_ptr tensorA{new kp::Tensor(testVecA)}; + + mgr.evalOpDefault({tensorA}); + + REQUIRE(tensorA->isInit()); + + REQUIRE(tensorA->data() == testVecA); + + tensorA->freeMemoryDestroyGPUResources(); + REQUIRE(!tensorA->isInit()); +} + +TEST_CASE("test_opcreatetensor_create_multiple_tensors_single_op") { + + kp::Manager mgr; + + std::vector testVecA{ 9, 8, 7 }; + std::vector testVecB{ 6, 5, 4 }; + + std::shared_ptr tensorA{new kp::Tensor(testVecA)}; + std::shared_ptr tensorB{new kp::Tensor(testVecB)}; + + mgr.evalOpDefault({tensorA, tensorB}); + + REQUIRE(tensorA->isInit()); + REQUIRE(tensorB->isInit()); + + REQUIRE(tensorA->data() == testVecA); + REQUIRE(tensorB->data() == testVecB); +} + +TEST_CASE("test_opcreatetensor_create_multiple_tensors_multiple_op") { + + kp::Manager mgr; + + std::vector testVecA{ 9, 8, 7 }; + std::vector testVecB{ 6, 5, 4 }; + + std::shared_ptr tensorA{new kp::Tensor(testVecA)}; + std::shared_ptr tensorB{new kp::Tensor(testVecB)}; + + mgr.evalOpDefault({tensorA}); + mgr.evalOpDefault({tensorB}); + + REQUIRE(tensorA->isInit()); + REQUIRE(tensorB->isInit()); + + REQUIRE(tensorA->data() == testVecA); + REQUIRE(tensorB->data() == testVecB); +} + +TEST_CASE("test_opcreatetensor_manage_tensor_memory_when_destroyed") { + + std::vector testVecA{ 9, 8, 7 }; + std::vector testVecB{ 6, 5, 4 }; + + std::shared_ptr tensorA{new kp::Tensor(testVecA)}; + std::shared_ptr tensorB{new kp::Tensor(testVecB)}; + + { + kp::Manager mgr; + mgr.evalOpDefault({tensorA}); + mgr.evalOpDefault({tensorB}); + + REQUIRE(tensorA->isInit()); + REQUIRE(tensorB->isInit()); + + REQUIRE(tensorA->data() == testVecA); + REQUIRE(tensorB->data() == testVecB); + } + + REQUIRE(!tensorA->isInit()); + REQUIRE(!tensorB->isInit()); +} + +TEST_CASE("test_opcreatetensor_no_error_if_tensor_freed_before") { + + std::vector testVecA{ 9, 8, 7 }; + std::vector testVecB{ 6, 5, 4 }; + + std::shared_ptr tensorA{new kp::Tensor(testVecA)}; + std::shared_ptr tensorB{new kp::Tensor(testVecB)}; + + kp::Manager mgr; + + mgr.evalOpDefault({tensorA}); + mgr.evalOpDefault({tensorB}); + + REQUIRE(tensorA->isInit()); + REQUIRE(tensorB->isInit()); + + REQUIRE(tensorA->data() == testVecA); + REQUIRE(tensorB->data() == testVecB); + + tensorA->freeMemoryDestroyGPUResources(); + tensorB->freeMemoryDestroyGPUResources(); + REQUIRE(!tensorA->isInit()); + REQUIRE(!tensorB->isInit()); +} + diff --git a/test/TestCustomOpRawShaders.cpp b/test/TestOpShadersFromStringAndFile.cpp similarity index 100% rename from test/TestCustomOpRawShaders.cpp rename to test/TestOpShadersFromStringAndFile.cpp