diff --git a/test/TestMultipleAlgoExecutions.cpp b/test/TestMultipleAlgoExecutions.cpp index 74f7b3c52..0ddbbffc8 100644 --- a/test/TestMultipleAlgoExecutions.cpp +++ b/test/TestMultipleAlgoExecutions.cpp @@ -3,351 +3,193 @@ #include "kompute/Kompute.hpp" -//TEST(TestMultipleAlgoExecutions, SingleSequenceRecord) -//{ -// -// kp::Manager mgr; -// -// std::shared_ptr tensorA{ new kp::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; -// })"); -// -// mgr.rebuild({ tensorA }); -// -// std::shared_ptr sq = -// mgr.sequence("newSequence"); -// -// { -// sq->begin(); -// -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// -// sq->record({ tensorA }); -// -// sq->end(); -// sq->eval(); -// } -// -// 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(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; -// })"); -// -// mgr.rebuild({ tensorA }, false); -// -// std::shared_ptr sqTensor = mgr.sequence(); -// -// std::shared_ptr sq = mgr.sequence(); -// -// // First create the tensor in a separate sequence -// sqTensor->begin(); -// sqTensor->record({ tensorA }); -// sqTensor->end(); -// sqTensor->eval(); -// -// // Then perform the computations -// sq->begin(); -// sq->record({ tensorA }, -// kp::Shader::compile_source(shader)); -// sq->end(); -// sq->eval(); -// -// sq->begin(); -// sq->record({ tensorA }, -// kp::Shader::compile_source(shader)); -// sq->end(); -// sq->eval(); -// -// sq->begin(); -// sq->record({ tensorA }, -// kp::Shader::compile_source(shader)); -// sq->end(); -// sq->eval(); -// -// sq->begin(); -// sq->record({ tensorA }); -// sq->end(); -// sq->eval(); -// -// 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(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; -// })"); -// -// mgr.rebuild({ tensorA }); -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence"); -// -// sq->begin(); -// -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// -// sq->end(); -// sq->eval(); -// } -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence2"); -// -// sq->begin(); -// -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// -// sq->end(); -// sq->eval(); -// } -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence3"); -// -// sq->begin(); -// -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// -// sq->end(); -// sq->eval(); -// } -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence5"); -// -// 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(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; -// })"); -// -// mgr.rebuild({ tensorA }, false); -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence"); -// -// sq->begin(); -// -// sq->record({ tensorA }); -// -// sq->end(); -// sq->eval(); -// } -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence2"); -// -// sq->begin(); -// -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// -// sq->end(); -// -// sq->eval(); -// sq->eval(); -// sq->eval(); -// } -// -// { -// std::shared_ptr sq = -// mgr.sequence("newSequence3"); -// -// sq->begin(); -// -// sq->record({ tensorA }); -// -// sq->end(); -// -// sq->eval(); -// sq->eval(); -// sq->eval(); -// } -// -// EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); -//} -// -//TEST(TestMultipleAlgoExecutions, ManagerEvalMultSourceStrOpCreate) -//{ -// -// kp::Manager mgr; -// -// std::shared_ptr tensorInA{ new kp::Tensor({ 2.0, 4.0, 6.0 }) }; -// std::shared_ptr tensorInB{ new kp::Tensor({ 0.0, 1.0, 2.0 }) }; -// std::shared_ptr tensorOut{ new kp::Tensor({ 0.0, 0.0, 0.0 }) }; -// -// mgr.rebuild({ tensorInA, tensorInB, tensorOut }); -// -// std::string shader(R"( -// // The version to use -// #version 450 -// -// // The execution structure -// layout (local_size_x = 1) in; -// -// // The buffers are provided via the tensors -// layout(binding = 0) buffer bufA { float a[]; }; -// layout(binding = 1) buffer bufB { float b[]; }; -// layout(binding = 2) buffer bufOut { float o[]; }; -// -// void main() { -// uint index = gl_GlobalInvocationID.x; -// -// o[index] = a[index] * b[index]; -// } -// )"); -// -// mgr.evalOpDefault( -// { tensorInA, tensorInB, tensorOut }, -// kp::Shader::compile_source(shader)); -// -// mgr.evalOpDefault({ tensorOut }); -// -// EXPECT_EQ(tensorOut->data(), std::vector({ 0.0, 4.0, 12.0 })); -//} -// -//TEST(TestMultipleAlgoExecutions, ManagerEvalMultSourceStrMgrCreate) -//{ -// -// kp::Manager mgr; -// -// auto tensorInA = mgr.tensor( -// { 2.0, 4.0, 6.0 }, kp::Tensor::TensorTypes::eDevice, false); -// auto tensorInB = mgr.tensor( -// { 0.0, 1.0, 2.0 }, kp::Tensor::TensorTypes::eDevice, false); -// auto tensorOut = mgr.tensor( -// { 0.0, 0.0, 0.0 }, kp::Tensor::TensorTypes::eDevice, false); -// -// std::string shader(R"( -// // The version to use -// #version 450 -// -// // The execution structure -// layout (local_size_x = 1) in; -// -// // The buffers are provided via the tensors -// layout(binding = 0) buffer bufA { float a[]; }; -// layout(binding = 1) buffer bufB { float b[]; }; -// layout(binding = 2) buffer bufOut { float o[]; }; -// -// void main() { -// uint index = gl_GlobalInvocationID.x; -// -// o[index] = a[index] * b[index]; -// } -// )"); -// -// mgr.evalOpDefault( -// { tensorInA, tensorInB, tensorOut }); -// -// mgr.evalOpDefault( -// { tensorInA, tensorInB, tensorOut }, -// kp::Shader::compile_source(shader)); -// -// mgr.evalOpDefault({ tensorOut }); -// -// EXPECT_EQ(tensorOut->data(), std::vector({ 0.0, 4.0, 12.0 })); -//} -// -//TEST(TestMultipleAlgoExecutions, SequenceAlgoDestroyOutsideManagerScope) -//{ -// std::shared_ptr tensorA{ new kp::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::shared_ptr sq = nullptr; -// -// { -// kp::Manager mgr; -// -// mgr.rebuild({ tensorA }); -// -// sq = mgr.sequence(); -// -// sq->begin(); -// sq->record( -// { tensorA }, kp::Shader::compile_source(shader)); -// sq->end(); -// -// sq->eval(); -// -// mgr.evalOpDefault({ tensorA }); -// } -// } -// EXPECT_EQ(tensorA->data(), std::vector({ 1, 1, 1 })); -//} -// +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 })); +} +