// SPDX-License-Identifier: Apache-2.0 #include "gtest/gtest.h" #include "kompute/Kompute.hpp" #include "kompute/logger/Logger.hpp" #include "shaders/Utils.hpp" TEST(TestDestroy, TestDestroyTensorSingle) { std::shared_ptr> tensorA = nullptr; std::string shader(R"( #version 450 layout (local_size_x = 1) in; layout(set = 0, binding = 0) buffer a { float pa[]; }; void main() { uint index = gl_GlobalInvocationID.x; pa[index] = pa[index] + 1; })"); std::vector spirv = compileSource(shader); { std::shared_ptr sq = nullptr; { kp::Manager mgr; const std::vector initialValues = { 0.0f, 0.0f, 0.0f }; tensorA = mgr.tensor(initialValues); std::shared_ptr algo = mgr.algorithm({ tensorA }, spirv); // Sync values to and from device mgr.sequence()->eval(algo->getTensors()); EXPECT_EQ(tensorA->vector(), initialValues); mgr.sequence() ->record(algo) ->eval() ->eval(algo->getTensors()); const std::vector expectedFinalValues = { 1.0f, 1.0f, 1.0f }; EXPECT_EQ(tensorA->vector(), expectedFinalValues); tensorA->destroy(); EXPECT_FALSE(tensorA->isInit()); } EXPECT_FALSE(tensorA->isInit()); } } TEST(TestDestroy, TestDestroyTensorVector) { std::shared_ptr> tensorA = nullptr; std::shared_ptr> tensorB = nullptr; std::string shader(R"( #version 450 layout (local_size_x = 1) in; layout(set = 0, binding = 0) buffer a { float pa[]; }; layout(set = 0, binding = 1) buffer b { float pb[]; }; void main() { uint index = gl_GlobalInvocationID.x; pa[index] = pa[index] + 1; pb[index] = pb[index] + 2; })"); std::vector spirv = compileSource(shader); { std::shared_ptr sq = nullptr; { kp::Manager mgr; tensorA = mgr.tensor({ 1, 1, 1 }); tensorB = mgr.tensor({ 1, 1, 1 }); std::shared_ptr algo = mgr.algorithm({ tensorA, tensorB }, spirv); mgr.sequence() ->record(algo->getTensors()) ->record(algo) ->record(algo->getTensors()) ->eval(); EXPECT_EQ(tensorA->vector(), std::vector({ 2, 2, 2 })); EXPECT_EQ(tensorB->vector(), std::vector({ 3, 3, 3 })); tensorA->destroy(); tensorB->destroy(); EXPECT_FALSE(tensorA->isInit()); EXPECT_FALSE(tensorB->isInit()); } } } TEST(TestDestroy, TestDestroySequenceSingle) { std::shared_ptr> tensorA = nullptr; std::string shader(R"( #version 450 layout (local_size_x = 1) in; layout(set = 0, binding = 0) buffer a { float pa[]; }; void main() { uint index = gl_GlobalInvocationID.x; pa[index] = pa[index] + 1; })"); std::vector spirv = compileSource(shader); { std::shared_ptr sq = nullptr; { kp::Manager mgr; tensorA = mgr.tensor({ 0, 0, 0 }); sq = mgr.sequence() ->record({ tensorA }) ->record(mgr.algorithm({ tensorA }, spirv)) ->record({ tensorA }) ->eval(); sq->destroy(); EXPECT_FALSE(sq->isInit()); EXPECT_EQ(tensorA->vector(), std::vector({ 1, 1, 1 })); } } }