#include "gtest/gtest.h" #include "kompute/Kompute.hpp" TEST(TestMultipleAlgoExecutions, SingleSequenceRecord) { kp::Manager mgr; std::shared_ptr tensorA = mgr.tensor({ 0, 0, 0 }); 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 = kp::Shader::compile_source(shader); { mgr.sequence() ->record({ tensorA }) ->record(mgr.algorithm({tensorA}, spirv)) ->record(mgr.algorithm({tensorA}, spirv)) ->record(mgr.algorithm({tensorA}, spirv)) ->record({ tensorA }) ->eval(); } EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); } TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords) { kp::Manager mgr; std::shared_ptr tensorA = mgr.tensor({ 0, 0, 0 }); 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 = kp::Shader::compile_source(shader); std::shared_ptr algorithm = mgr.algorithm({tensorA}, spirv); std::shared_ptr sq = mgr.sequence(); mgr.sequence() ->record({ tensorA }) ->eval(); mgr.sequence() ->record(algorithm) ->eval(); mgr.sequence() ->record(algorithm) ->eval(); mgr.sequence() ->record(algorithm) ->eval(); mgr.sequence() ->record({ tensorA }) ->eval(); EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); } TEST(TestMultipleAlgoExecutions, MultipleSequences) { kp::Manager mgr; std::shared_ptr tensorA = mgr.tensor({ 0, 0, 0 }); 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 = kp::Shader::compile_source(shader); std::shared_ptr algorithm = mgr.algorithm({tensorA}, spirv); std::shared_ptr sq = mgr.sequence(); sq->record({ tensorA })->eval(); sq->record(algorithm) ->eval(); sq->record(algorithm) ->eval(); sq->record(algorithm) ->eval(); sq->record({ tensorA }) ->eval(); EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); } TEST(TestMultipleAlgoExecutions, SingleRecordMultipleEval) { kp::Manager mgr; std::shared_ptr tensorA = mgr.tensor({ 0, 0, 0 }); 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 = kp::Shader::compile_source(shader); std::shared_ptr algorithm = mgr.algorithm({tensorA}, spirv); std::shared_ptr sq = mgr.sequence(); sq->record({ tensorA })->eval(); sq->record(algorithm) ->eval() ->eval() ->eval(); sq->record({ tensorA }) ->eval(); EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); } TEST(TestMultipleAlgoExecutions, SequenceAlgoDestroyOutsideManagerScope) { std::shared_ptr tensorA = nullptr; { std::shared_ptr sq = nullptr; { kp::Manager mgr; tensorA = mgr.tensor({ 0, 0, 0 }); 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 = kp::Shader::compile_source(shader); std::shared_ptr algorithm = mgr.algorithm({tensorA}, spirv); sq = mgr.sequence(); sq->record({ tensorA })->eval(); sq->record(algorithm) ->eval() ->eval() ->eval(); sq->record({ tensorA }) ->eval(); } } EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); }