#include "gtest/gtest.h" #include "kompute/Kompute.hpp" TEST(TestMultipleAlgoExecutions, SingleSequenceRecord) { 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 { float 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 }, std::vector(shader.begin(), shader.end())); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->record({ tensorA }); sq->end(); sq->eval(); } sqWeakPtr.reset(); EXPECT_EQ(tensorA->data(), std::vector({3, 3, 3})); } TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords) { 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 { float 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 }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); sq->begin(); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); sq->begin(); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); sq->begin(); sq->record( { tensorA }); sq->end(); sq->eval(); } sqWeakPtr.reset(); EXPECT_EQ(tensorA->data(), std::vector({3, 3, 3})); } TEST(TestMultipleAlgoExecutions, MultipleSequences) { 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 { float 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 }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); } std::weak_ptr sqWeakPtr2 = mgr.getOrCreateManagedSequence("newSequence2"); if (std::shared_ptr sq = sqWeakPtr2.lock()) { sq->begin(); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); } std::weak_ptr sqWeakPtr3 = mgr.getOrCreateManagedSequence("newSequence3"); if (std::shared_ptr sq = sqWeakPtr3.lock()) { sq->begin(); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); } std::weak_ptr sqWeakPtr4 = mgr.getOrCreateManagedSequence("newSequence5"); if (std::shared_ptr sq = sqWeakPtr4.lock()) { sq->begin(); sq->record( { tensorA }); sq->end(); sq->eval(); } EXPECT_EQ(tensorA->data(), std::vector({3, 3, 3})); } TEST(TestMultipleAlgoExecutions, SingleRecordMultipleEval) { 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 { float 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->end(); sq->eval(); } std::weak_ptr sqWeakPtr2 = mgr.getOrCreateManagedSequence("newSequence2"); if (std::shared_ptr sq = sqWeakPtr2.lock()) { sq->begin(); sq->record>( { tensorA }, std::vector(shader.begin(), shader.end())); sq->end(); sq->eval(); sq->eval(); sq->eval(); } std::weak_ptr sqWeakPtr3 = mgr.getOrCreateManagedSequence("newSequence3"); if (std::shared_ptr sq = sqWeakPtr2.lock()) { sq->begin(); sq->record( { tensorA }); sq->end(); sq->eval(); sq->eval(); sq->eval(); } EXPECT_EQ(tensorA->data(), std::vector({3, 3, 3})); }