#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 { 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 }, 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 { 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 }, 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 { 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 }, 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}); }