diff --git a/single_include/kompute/Kompute.hpp b/single_include/kompute/Kompute.hpp index 01a2e7522..e60a5bdf0 100755 --- a/single_include/kompute/Kompute.hpp +++ b/single_include/kompute/Kompute.hpp @@ -1341,6 +1341,7 @@ class Sequence: public std::enable_shared_from_this * * @return shared_ptr of the Sequence class itself */ + // TODO: Aim to have only a single function with tensors/algorithm template std::shared_ptr eval(std::vector> tensors, TArgs&&... params) @@ -1355,6 +1356,7 @@ class Sequence: public std::enable_shared_from_this std::shared_ptr op{ new T(tensors, std::forward(params)...) }; + // TODO: Aim to be able to handle errors when returning without throw except return this->eval(op); } // Needded as otherise can't use initialiser list @@ -1383,6 +1385,7 @@ class Sequence: public std::enable_shared_from_this * @return Boolean stating whether execution was successful. */ std::shared_ptr evalAsync(); + std::shared_ptr evalAsync(std::shared_ptr op); /** * Eval sends all the recorded and stored operations in the vector of @@ -1742,7 +1745,7 @@ class OpMult : public OpAlgoDispatch * @param komputeWorkgroup Optional parameter to specify the layout for processing */ OpMult(std::vector> tensors, std::shared_ptr algorithm) - : OpAlgoDispatch(tensors, algorithm) + : OpAlgoDispatch(algorithm) { KP_LOG_DEBUG("Kompute OpMult constructor with params"); @@ -1755,7 +1758,7 @@ class OpMult : public OpAlgoDispatch (uint32_t*)(shader_data::shaders_glsl_opmult_comp_spv + kp::shader_data::shaders_glsl_opmult_comp_spv_len)); - algorithm->rebuild(tensors, spirv, Workgroup({tensors[0]->size()})); + algorithm->rebuild(tensors, spirv); } /** diff --git a/src/Sequence.cpp b/src/Sequence.cpp index 52e147aaa..e341e734c 100644 --- a/src/Sequence.cpp +++ b/src/Sequence.cpp @@ -23,7 +23,7 @@ Sequence::~Sequence() { KP_LOG_DEBUG("Kompute Sequence Destructor started"); - this->freeMemoryDestroyGPUResources(); + this->destroy(); } void @@ -112,6 +112,15 @@ Sequence::evalAsync() return shared_from_this(); } +std::shared_ptr +Sequence::evalAsync(std::shared_ptr op) +{ + this->clear(); + this->record(op); + this->evalAsync(); + return shared_from_this(); +} + std::shared_ptr Sequence::evalAwait(uint64_t waitFor) { @@ -162,10 +171,10 @@ Sequence::isInit() { void Sequence::destroy() { - KP_LOG_DEBUG("Kompute Sequence freeMemoryDestroyGPUResources called"); + KP_LOG_DEBUG("Kompute Sequence destroy called"); if (!this->mDevice) { - KP_LOG_ERROR("Kompute Sequence freeMemoryDestroyGPUResources called " + KP_LOG_ERROR("Kompute Sequence destroy called " "with null Device pointer"); return; } @@ -174,7 +183,7 @@ Sequence::destroy() KP_LOG_INFO("Freeing CommandBuffer"); if (!this->mCommandBuffer) { KP_LOG_ERROR( - "Kompute Sequence freeMemoryDestroyGPUResources called with null " + "Kompute Sequence destroy called with null " "CommandPool pointer"); return; } @@ -191,7 +200,7 @@ Sequence::destroy() KP_LOG_INFO("Destroying CommandPool"); if (this->mCommandPool == nullptr) { KP_LOG_ERROR( - "Kompute Sequence freeMemoryDestroyGPUResources called with null " + "Kompute Sequence destroy called with null " "CommandPool pointer"); return; } diff --git a/src/Tensor.cpp b/src/Tensor.cpp index 461e3ca1e..f5341830f 100644 --- a/src/Tensor.cpp +++ b/src/Tensor.cpp @@ -23,7 +23,7 @@ Tensor::~Tensor() KP_LOG_DEBUG("Kompute Tensor destructor started. Type: {}", this->tensorType()); - this->freeMemoryDestroyGPUResources(); + this->destroy(); KP_LOG_DEBUG("Kompute Tensor destructor success"); } @@ -40,7 +40,7 @@ Tensor::rebuild(const std::vector& data, if (this->mPrimaryBuffer || this->mPrimaryMemory) { KP_LOG_DEBUG("Kompute Tensor destroying existing resources before rebuild"); - this->freeMemoryDestroyGPUResources(); + this->destroy(); } this->allocateMemoryCreateGPUResources(); @@ -440,7 +440,7 @@ Tensor::allocateBindMemory(std::shared_ptr buffer, void Tensor::destroy() { - KP_LOG_DEBUG("Kompute Tensor started freeMemoryDestroyGPUResources()"); + KP_LOG_DEBUG("Kompute Tensor started destroy()"); if (!this->mDevice) { KP_LOG_ERROR( @@ -508,7 +508,7 @@ Tensor::destroy() this->mDevice = nullptr; } - KP_LOG_DEBUG("Kompute Tensor successful freeMemoryDestroyGPUResources()"); + KP_LOG_DEBUG("Kompute Tensor successful destroy()"); } } diff --git a/src/include/kompute/Sequence.hpp b/src/include/kompute/Sequence.hpp index e3bac936e..fa3b399e8 100644 --- a/src/include/kompute/Sequence.hpp +++ b/src/include/kompute/Sequence.hpp @@ -138,6 +138,7 @@ class Sequence: public std::enable_shared_from_this * @return Boolean stating whether execution was successful. */ std::shared_ptr evalAsync(); + std::shared_ptr evalAsync(std::shared_ptr op); /** * Eval sends all the recorded and stored operations in the vector of diff --git a/src/include/kompute/operations/OpMult.hpp b/src/include/kompute/operations/OpMult.hpp index 184a30cd9..992b0e8a0 100644 --- a/src/include/kompute/operations/OpMult.hpp +++ b/src/include/kompute/operations/OpMult.hpp @@ -33,7 +33,7 @@ class OpMult : public OpAlgoDispatch * @param komputeWorkgroup Optional parameter to specify the layout for processing */ OpMult(std::vector> tensors, std::shared_ptr algorithm) - : OpAlgoDispatch(tensors, algorithm) + : OpAlgoDispatch(algorithm) { KP_LOG_DEBUG("Kompute OpMult constructor with params"); @@ -46,7 +46,7 @@ class OpMult : public OpAlgoDispatch (uint32_t*)(shader_data::shaders_glsl_opmult_comp_spv + kp::shader_data::shaders_glsl_opmult_comp_spv_len)); - algorithm->rebuild(tensors, spirv, Workgroup({tensors[0]->size()})); + algorithm->rebuild(tensors, spirv); } /** diff --git a/test/TestManager.cpp b/test/TestManager.cpp index 754941561..f87e81159 100644 --- a/test/TestManager.cpp +++ b/test/TestManager.cpp @@ -3,53 +3,41 @@ #include "kompute/Kompute.hpp" -TEST(TestManager, EndToEndOpMultFlow) +TEST(TestManager, EndToEndOpMultEvalFlow) { kp::Manager mgr; - std::shared_ptr tensorLHS{ new kp::Tensor({ 0, 1, 2 }) }; - mgr.rebuild({ tensorLHS }); + std::shared_ptr tensorLHS = mgr.tensor({ 0, 1, 2 }); + std::shared_ptr tensorRHS = mgr.tensor({ 2, 4, 6 }); + std::shared_ptr tensorOutput = mgr.tensor({ 0, 0, 0 }); - std::shared_ptr tensorRHS{ new kp::Tensor({ 2, 4, 6 }) }; - mgr.rebuild({ tensorRHS }); + std::vector> params = + { tensorLHS, tensorRHS, tensorOutput }; - std::shared_ptr tensorOutput{ new kp::Tensor({ 0, 0, 0 }) }; - - mgr.rebuild({ tensorOutput }); - - mgr.evalOpDefault({ tensorLHS, tensorRHS, tensorOutput }); - - mgr.evalOpDefault({ tensorOutput }); + mgr.sequence() + ->eval(params) + ->eval(params, mgr.algorithm()) + ->eval(params); EXPECT_EQ(tensorOutput->data(), std::vector({ 0, 4, 12 })); } -TEST(TestManager, OpMultSequenceFlow) +TEST(TestManager, EndToEndOpMultSeqFlow) { - - std::shared_ptr tensorLHS{ new kp::Tensor({ 0, 1, 2 }) }; - - std::shared_ptr tensorRHS{ new kp::Tensor({ 2, 4, 6 }) }; - - std::shared_ptr tensorOutput{ new kp::Tensor({ 0, 0, 0 }) }; - kp::Manager mgr; - { - mgr.rebuild({ tensorLHS, tensorRHS, tensorOutput }); + std::shared_ptr tensorLHS = mgr.tensor({ 0, 1, 2 }); + std::shared_ptr tensorRHS = mgr.tensor({ 2, 4, 6 }); + std::shared_ptr tensorOutput = mgr.tensor({ 0, 0, 0 }); - std::shared_ptr sq = - mgr.sequence("newSequence"); + std::vector> params = + { tensorLHS, tensorRHS, tensorOutput }; - sq->begin(); - - sq->record({ tensorLHS, tensorRHS, tensorOutput }); - - sq->record({ tensorOutput }); - - sq->end(); - sq->eval(); - } + mgr.sequence() + ->record(params) + ->record(params, mgr.algorithm()) + ->record(params) + ->eval(); EXPECT_EQ(tensorOutput->data(), std::vector({ 0, 4, 12 })); } @@ -58,75 +46,17 @@ TEST(TestManager, TestMultipleSequences) { kp::Manager mgr; - std::shared_ptr sqOne = - mgr.sequence("sqOne"); + std::shared_ptr tensorLHS = mgr.tensor({ 0, 1, 2 }); + std::shared_ptr tensorRHS = mgr.tensor({ 2, 4, 6 }); + std::shared_ptr tensorOutput = mgr.tensor({ 0, 0, 0 }); - std::shared_ptr sqTwo = - mgr.sequence("sqTwo"); + std::vector> params = + { tensorLHS, tensorRHS, tensorOutput }; - std::shared_ptr sqOneRef = - mgr.sequence("sqOne"); - - std::shared_ptr sqTwoRef = - mgr.sequence("sqTwo"); - - EXPECT_EQ(sqOne, sqOneRef); - EXPECT_NE(sqTwo, sqOneRef); - EXPECT_EQ(sqTwo, sqTwoRef); - EXPECT_NE(sqOneRef, sqTwoRef); -} - -TEST(TestManager, TestMultipleTensorsAtOnce) -{ - - std::shared_ptr tensorLHS{ new kp::Tensor({ 0, 1, 2 }) }; - - std::shared_ptr tensorRHS{ new kp::Tensor({ 2, 4, 6 }) }; - - std::shared_ptr tensorOutput{ new kp::Tensor({ 0, 0, 0 }) }; - - kp::Manager mgr; - - std::shared_ptr sq = - mgr.sequence("newSequence"); - - { - mgr.rebuild({ tensorLHS, tensorRHS, tensorOutput }); - - EXPECT_TRUE(tensorLHS->isInit()); - EXPECT_TRUE(tensorRHS->isInit()); - EXPECT_TRUE(tensorOutput->isInit()); - - sq->begin(); - - sq->record({ tensorLHS, tensorRHS, tensorOutput }); - - sq->record({ tensorOutput }); - - sq->end(); - sq->eval(); - } + mgr.sequence()->eval(params); + mgr.sequence()->eval(params, mgr.algorithm()); + mgr.sequence()->eval(params); EXPECT_EQ(tensorOutput->data(), std::vector({ 0, 4, 12 })); } -TEST(TestManager, TestCreateInitTensor) -{ - kp::Manager mgr; - - std::shared_ptr tensorA = mgr.tensor({ 0, 1, 2 }); - std::shared_ptr tensorB = mgr.tensor({ 0, 0, 0 }); - - mgr.evalOpDefault({ tensorA, tensorB }); - - mgr.evalOpDefault({ tensorB }); - - EXPECT_EQ(tensorB->data(), std::vector({ 0, 1, 2 })); - - std::shared_ptr tensorC = - mgr.tensor({ 0, 0, 0 }, kp::Tensor::TensorTypes::eHost); - - mgr.evalOpDefault({ tensorA, tensorC }); - - EXPECT_EQ(tensorC->data(), std::vector({ 0, 1, 2 })); -} diff --git a/test/TestMultipleAlgoExecutions.cpp b/test/TestMultipleAlgoExecutions.cpp index a1503cc83..74f7b3c52 100644 --- a/test/TestMultipleAlgoExecutions.cpp +++ b/test/TestMultipleAlgoExecutions.cpp @@ -3,351 +3,351 @@ #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{ 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 })); +//} +// diff --git a/test/TestOpAlgoLoopsPassingData.cpp b/test/TestOpAlgoLoopsPassingData.cpp deleted file mode 100644 index 83cbb6619..000000000 --- a/test/TestOpAlgoLoopsPassingData.cpp +++ /dev/null @@ -1,80 +0,0 @@ - -#include "gtest/gtest.h" - -#include "kompute/Kompute.hpp" - -TEST(TestProcessingIterations, IterateThroughMultipleSumAndCopies) -{ - kp::Manager mgr; - - float TOTAL_ITER = 10; - - std::vector testExpectedOutVec = { TOTAL_ITER, - TOTAL_ITER, - TOTAL_ITER }; - - std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 }) }; - std::shared_ptr tensorB{ 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[]; }; - layout(set = 0, binding = 1) buffer b { float pb[]; }; - - void main() { - uint index = gl_GlobalInvocationID.x; - pb[index] = pa[index] + 1; - } - )"); - - mgr.rebuild({ tensorA, tensorB }, false); - - { - std::shared_ptr sq = - mgr.sequence("default"); - - sq->begin(); - - sq->record({ tensorA, tensorB }); - - sq->end(); - - sq->eval(); - } - - { - std::shared_ptr sq = - mgr.sequence("run"); - - sq->begin(); - - sq->record( - { tensorA, tensorB }, - kp::Shader::compile_source(shader)); - - sq->record({ tensorB, tensorA }); - sq->end(); - - for (size_t i = 0; i < TOTAL_ITER; i++) { - sq->eval(); - } - } - - { - std::shared_ptr sq = - mgr.sequence("export"); - - sq->begin(); - - sq->record({ tensorA, tensorB }); - - sq->end(); - - sq->eval(); - } - - EXPECT_EQ(tensorA->data(), testExpectedOutVec); -} diff --git a/test/TestOpShadersFromStringAndFile.cpp b/test/TestOpShadersFromStringAndFile.cpp index 09908b722..60cb8af24 100644 --- a/test/TestOpShadersFromStringAndFile.cpp +++ b/test/TestOpShadersFromStringAndFile.cpp @@ -5,73 +5,73 @@ #include "kompute_test/shaders/shadertest_op_custom_shader.hpp" -TEST(TestOpAlgoCreate, ShaderRawDataFromConstructor) -{ - kp::Manager mgr; - - std::shared_ptr tensorA{ new kp::Tensor({ 3, 4, 5 }) }; - std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; - mgr.rebuild({ tensorA, tensorB }); - - 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; - pb[index] = pa[index]; - pa[index] = index; - } - )"); - - mgr.evalOpDefault( - { tensorA, tensorB }, kp::Shader::compile_source(shader)); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), std::vector({ 0, 1, 2 })); - EXPECT_EQ(tensorB->data(), std::vector({ 3, 4, 5 })); -} - -TEST(TestOpAlgoCreate, ShaderCompiledDataFromConstructor) -{ - kp::Manager mgr; - - std::shared_ptr tensorA{ new kp::Tensor({ 3, 4, 5 }) }; - std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; - mgr.rebuild({ tensorA, tensorB }); - - mgr.evalOpDefault( - { tensorA, tensorB }, - std::vector( - (uint32_t*)kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv, - (uint32_t*)(kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv + - kp::shader_data:: - test_shaders_glsl_test_op_custom_shader_comp_spv_len))); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), std::vector({ 0, 1, 2 })); - EXPECT_EQ(tensorB->data(), std::vector({ 3, 4, 5 })); -} - -TEST(TestOpAlgoCreate, ShaderCompiledDataFromFile) -{ - kp::Manager mgr; - - std::shared_ptr tensorA{ new kp::Tensor({ 3, 4, 5 }) }; - std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; - mgr.rebuild({ tensorA, tensorB }); - - mgr.evalOpDefault( - { tensorA, tensorB }, "test/shaders/glsl/test_op_custom_shader.comp.spv"); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), std::vector({ 0, 1, 2 })); - EXPECT_EQ(tensorB->data(), std::vector({ 3, 4, 5 })); -} +//TEST(TestOpAlgoCreate, ShaderRawDataFromConstructor) +//{ +// kp::Manager mgr; +// +// std::shared_ptr tensorA{ new kp::Tensor({ 3, 4, 5 }) }; +// std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; +// mgr.rebuild({ tensorA, tensorB }); +// +// 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; +// pb[index] = pa[index]; +// pa[index] = index; +// } +// )"); +// +// mgr.evalOpDefault( +// { tensorA, tensorB }, kp::Shader::compile_source(shader)); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), std::vector({ 0, 1, 2 })); +// EXPECT_EQ(tensorB->data(), std::vector({ 3, 4, 5 })); +//} +// +//TEST(TestOpAlgoCreate, ShaderCompiledDataFromConstructor) +//{ +// kp::Manager mgr; +// +// std::shared_ptr tensorA{ new kp::Tensor({ 3, 4, 5 }) }; +// std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; +// mgr.rebuild({ tensorA, tensorB }); +// +// mgr.evalOpDefault( +// { tensorA, tensorB }, +// std::vector( +// (uint32_t*)kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv, +// (uint32_t*)(kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv + +// kp::shader_data:: +// test_shaders_glsl_test_op_custom_shader_comp_spv_len))); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), std::vector({ 0, 1, 2 })); +// EXPECT_EQ(tensorB->data(), std::vector({ 3, 4, 5 })); +//} +// +//TEST(TestOpAlgoCreate, ShaderCompiledDataFromFile) +//{ +// kp::Manager mgr; +// +// std::shared_ptr tensorA{ new kp::Tensor({ 3, 4, 5 }) }; +// std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; +// mgr.rebuild({ tensorA, tensorB }); +// +// mgr.evalOpDefault( +// { tensorA, tensorB }, "test/shaders/glsl/test_op_custom_shader.comp.spv"); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), std::vector({ 0, 1, 2 })); +// EXPECT_EQ(tensorB->data(), std::vector({ 3, 4, 5 })); +//} diff --git a/test/TestOpTensorCopy.cpp b/test/TestOpTensorCopy.cpp index 3f2bc9500..449e30da1 100644 --- a/test/TestOpTensorCopy.cpp +++ b/test/TestOpTensorCopy.cpp @@ -3,163 +3,163 @@ #include "kompute/Kompute.hpp" -TEST(TestOpTensorCopy, CopyDeviceToDeviceTensor) -{ - - kp::Manager mgr; - - std::vector testVecA{ 1, 2, 3 }; - std::vector testVecB{ 0, 0, 0 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - mgr.rebuild({ tensorA, tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), tensorB->data()); - - // Making sure the GPU holds the same data - mgr.evalOpDefault({ tensorB }); - EXPECT_EQ(tensorA->data(), tensorB->data()); -} - -TEST(TestOpTensorCopy, CopyDeviceToDeviceTensorMulti) -{ - - kp::Manager mgr; - - std::vector testVecA{ 2, 3, 4 }; - std::vector testVecB{ 0, 0, 0 }; - std::vector testVecC{ 0, 0, 0 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - std::shared_ptr tensorC{ new kp::Tensor(testVecC) }; - - mgr.rebuild({ tensorA, tensorB, tensorC }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - EXPECT_TRUE(tensorC->isInit()); - - mgr.evalOpDefault({ tensorA, tensorB, tensorC }); - - EXPECT_EQ(tensorA->data(), tensorB->data()); - EXPECT_EQ(tensorA->data(), tensorC->data()); - - // Making sure the GPU holds the same data - mgr.evalOpDefault({ tensorB, tensorC }); - EXPECT_EQ(tensorA->data(), tensorB->data()); - EXPECT_EQ(tensorA->data(), tensorC->data()); -} - -TEST(TestOpTensorCopy, CopyDeviceToHostTensor) -{ - - kp::Manager mgr; - - std::vector testVecA{ 3, 4, 5 }; - std::vector testVecB{ 0, 0, 0 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor( - testVecB, kp::Tensor::TensorTypes::eHost) }; - - mgr.rebuild({ tensorA, tensorB }, false); - - // Only calling sync on device type tensor - mgr.evalOpDefault({ tensorA }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), tensorB->data()); - - // Making sure the GPU holds the same data - mgr.evalOpDefault({ tensorB }); - EXPECT_EQ(tensorA->data(), tensorB->data()); -} - -TEST(TestOpTensorCopy, CopyHostToDeviceTensor) -{ - - kp::Manager mgr; - - std::vector testVecA{ 4, 5, 6 }; - std::vector testVecB{ 0, 0, 0 }; - - std::shared_ptr tensorA{ new kp::Tensor( - testVecA, kp::Tensor::TensorTypes::eHost) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - mgr.rebuild({ tensorA, tensorB }, false); - - // Manually copy data into host memory of Tensor - tensorA->mapDataIntoHostMemory(); - - // Only calling sync on device type tensor - mgr.evalOpDefault({ tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), tensorB->data()); - - // Making sure the GPU holds the same data - mgr.evalOpDefault({ tensorB }); - EXPECT_EQ(tensorA->data(), tensorB->data()); -} - -TEST(TestOpTensorCopy, CopyHostToHostTensor) -{ - - kp::Manager mgr; - - std::vector testVecA{ 5, 6, 7 }; - std::vector testVecB{ 0, 0, 0 }; - - std::shared_ptr tensorA{ new kp::Tensor( - testVecA, kp::Tensor::TensorTypes::eHost) }; - std::shared_ptr tensorB{ new kp::Tensor( - testVecB, kp::Tensor::TensorTypes::eHost) }; - - mgr.rebuild({ tensorA, tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - mgr.evalOpDefault({ tensorA, tensorB }); - - EXPECT_EQ(tensorA->data(), tensorB->data()); - - // Making sure the GPU holds the same data - mgr.evalOpDefault({ tensorB }); - EXPECT_EQ(tensorA->data(), tensorB->data()); -} - -TEST(TestOpTensorCopy, SingleTensorShouldFail) -{ - - kp::Manager mgr; - - std::vector testVecA{ 6, 7, 8 }; - - std::shared_ptr tensorA{ new kp::Tensor( - testVecA, kp::Tensor::TensorTypes::eHost) }; - - mgr.rebuild({ tensorA }, false); - - EXPECT_TRUE(tensorA->isInit()); - - EXPECT_THROW(mgr.evalOpDefault({ tensorA }), - std::runtime_error); -} +//TEST(TestOpTensorCopy, CopyDeviceToDeviceTensor) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 1, 2, 3 }; +// std::vector testVecB{ 0, 0, 0 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// mgr.rebuild({ tensorA, tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), tensorB->data()); +// +// // Making sure the GPU holds the same data +// mgr.evalOpDefault({ tensorB }); +// EXPECT_EQ(tensorA->data(), tensorB->data()); +//} +// +//TEST(TestOpTensorCopy, CopyDeviceToDeviceTensorMulti) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 2, 3, 4 }; +// std::vector testVecB{ 0, 0, 0 }; +// std::vector testVecC{ 0, 0, 0 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// std::shared_ptr tensorC{ new kp::Tensor(testVecC) }; +// +// mgr.rebuild({ tensorA, tensorB, tensorC }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// EXPECT_TRUE(tensorC->isInit()); +// +// mgr.evalOpDefault({ tensorA, tensorB, tensorC }); +// +// EXPECT_EQ(tensorA->data(), tensorB->data()); +// EXPECT_EQ(tensorA->data(), tensorC->data()); +// +// // Making sure the GPU holds the same data +// mgr.evalOpDefault({ tensorB, tensorC }); +// EXPECT_EQ(tensorA->data(), tensorB->data()); +// EXPECT_EQ(tensorA->data(), tensorC->data()); +//} +// +//TEST(TestOpTensorCopy, CopyDeviceToHostTensor) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 3, 4, 5 }; +// std::vector testVecB{ 0, 0, 0 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor( +// testVecB, kp::Tensor::TensorTypes::eHost) }; +// +// mgr.rebuild({ tensorA, tensorB }, false); +// +// // Only calling sync on device type tensor +// mgr.evalOpDefault({ tensorA }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), tensorB->data()); +// +// // Making sure the GPU holds the same data +// mgr.evalOpDefault({ tensorB }); +// EXPECT_EQ(tensorA->data(), tensorB->data()); +//} +// +//TEST(TestOpTensorCopy, CopyHostToDeviceTensor) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 4, 5, 6 }; +// std::vector testVecB{ 0, 0, 0 }; +// +// std::shared_ptr tensorA{ new kp::Tensor( +// testVecA, kp::Tensor::TensorTypes::eHost) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// mgr.rebuild({ tensorA, tensorB }, false); +// +// // Manually copy data into host memory of Tensor +// tensorA->mapDataIntoHostMemory(); +// +// // Only calling sync on device type tensor +// mgr.evalOpDefault({ tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), tensorB->data()); +// +// // Making sure the GPU holds the same data +// mgr.evalOpDefault({ tensorB }); +// EXPECT_EQ(tensorA->data(), tensorB->data()); +//} +// +//TEST(TestOpTensorCopy, CopyHostToHostTensor) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 5, 6, 7 }; +// std::vector testVecB{ 0, 0, 0 }; +// +// std::shared_ptr tensorA{ new kp::Tensor( +// testVecA, kp::Tensor::TensorTypes::eHost) }; +// std::shared_ptr tensorB{ new kp::Tensor( +// testVecB, kp::Tensor::TensorTypes::eHost) }; +// +// mgr.rebuild({ tensorA, tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// mgr.evalOpDefault({ tensorA, tensorB }); +// +// EXPECT_EQ(tensorA->data(), tensorB->data()); +// +// // Making sure the GPU holds the same data +// mgr.evalOpDefault({ tensorB }); +// EXPECT_EQ(tensorA->data(), tensorB->data()); +//} +// +//TEST(TestOpTensorCopy, SingleTensorShouldFail) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 6, 7, 8 }; +// +// std::shared_ptr tensorA{ new kp::Tensor( +// testVecA, kp::Tensor::TensorTypes::eHost) }; +// +// mgr.rebuild({ tensorA }, false); +// +// EXPECT_TRUE(tensorA->isInit()); +// +// EXPECT_THROW(mgr.evalOpDefault({ tensorA }), +// std::runtime_error); +//} diff --git a/test/TestOpTensorCreate.cpp b/test/TestOpTensorCreate.cpp index ca3473576..0d7a26524 100644 --- a/test/TestOpTensorCreate.cpp +++ b/test/TestOpTensorCreate.cpp @@ -3,155 +3,155 @@ #include "kompute/Kompute.hpp" -TEST(TestOpTensorCreate, CreateSingleTensorSingleOp) -{ - std::vector testVecA{ 9, 8, 7 }; - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - - { - kp::Manager mgr; - - mgr.rebuild({ tensorA }); - - EXPECT_TRUE(tensorA->isInit()); - - EXPECT_EQ(tensorA->data(), testVecA); - } - - EXPECT_FALSE(tensorA->isInit()); -} - -TEST(TestOpTensorCreate, CreateMultipleTensorSingleOp) -{ - - kp::Manager mgr; - - std::vector testVecA{ 9, 8, 7 }; - std::vector testVecB{ 6, 5, 4 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - mgr.rebuild({ tensorA, tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - EXPECT_EQ(tensorA->data(), testVecA); - EXPECT_EQ(tensorB->data(), testVecB); -} - -TEST(TestOpTensorCreate, CreateMultipleTensorMultipleOp) -{ - - kp::Manager mgr; - - std::vector testVecA{ 9, 8, 7 }; - std::vector testVecB{ 6, 5, 4 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - mgr.rebuild({ tensorA }); - mgr.rebuild({ tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - EXPECT_EQ(tensorA->data(), testVecA); - EXPECT_EQ(tensorB->data(), testVecB); -} - -TEST(TestOpTensorCreate, TestTensorMemoryManagedByManagerDestroyed) -{ - - std::vector testVecA{ 9, 8, 7 }; - std::vector testVecB{ 6, 5, 4 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - { - kp::Manager mgr; - mgr.rebuild({ tensorA }); - mgr.rebuild({ tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - EXPECT_EQ(tensorA->data(), testVecA); - EXPECT_EQ(tensorB->data(), testVecB); - } - - EXPECT_FALSE(tensorA->isInit()); - EXPECT_FALSE(tensorB->isInit()); -} - -TEST(TestOpTensorCreate, TestTensorMemoryManagedByManagerNOTDestroyed) -{ - - std::vector testVecA{ 9, 8, 7 }; - std::vector testVecB{ 6, 5, 4 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - kp::Manager mgr; - - { - mgr.rebuild({ tensorA }); - mgr.rebuild({ tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - EXPECT_EQ(tensorA->data(), testVecA); - EXPECT_EQ(tensorB->data(), testVecB); - } - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); -} - -TEST(TestOpTensorCreate, NoErrorIfTensorFreedBefore) -{ - - std::vector testVecA{ 9, 8, 7 }; - std::vector testVecB{ 6, 5, 4 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; - - kp::Manager mgr; - - mgr.rebuild({ tensorA }); - mgr.rebuild({ tensorB }); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - - EXPECT_EQ(tensorA->data(), testVecA); - EXPECT_EQ(tensorB->data(), testVecB); - - tensorA->freeMemoryDestroyGPUResources(); - tensorB->freeMemoryDestroyGPUResources(); - EXPECT_FALSE(tensorA->isInit()); - EXPECT_FALSE(tensorB->isInit()); -} - -TEST(TestOpTensorCreate, ExceptionOnZeroSizeTensor) -{ - std::vector testVecA; - - std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; - - kp::Manager mgr; - - try { - mgr.rebuild({ tensorA }); - } catch (const std::runtime_error& err) { - // check exception - ASSERT_TRUE(std::string(err.what()).find("zero-sized") != - std::string::npos); - } -} +//TEST(TestOpTensorCreate, CreateSingleTensorSingleOp) +//{ +// std::vector testVecA{ 9, 8, 7 }; +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// +// { +// kp::Manager mgr; +// +// mgr.rebuild({ tensorA }); +// +// EXPECT_TRUE(tensorA->isInit()); +// +// EXPECT_EQ(tensorA->data(), testVecA); +// } +// +// EXPECT_FALSE(tensorA->isInit()); +//} +// +//TEST(TestOpTensorCreate, CreateMultipleTensorSingleOp) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 9, 8, 7 }; +// std::vector testVecB{ 6, 5, 4 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// mgr.rebuild({ tensorA, tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// EXPECT_EQ(tensorA->data(), testVecA); +// EXPECT_EQ(tensorB->data(), testVecB); +//} +// +//TEST(TestOpTensorCreate, CreateMultipleTensorMultipleOp) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecA{ 9, 8, 7 }; +// std::vector testVecB{ 6, 5, 4 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// mgr.rebuild({ tensorA }); +// mgr.rebuild({ tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// EXPECT_EQ(tensorA->data(), testVecA); +// EXPECT_EQ(tensorB->data(), testVecB); +//} +// +//TEST(TestOpTensorCreate, TestTensorMemoryManagedByManagerDestroyed) +//{ +// +// std::vector testVecA{ 9, 8, 7 }; +// std::vector testVecB{ 6, 5, 4 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// { +// kp::Manager mgr; +// mgr.rebuild({ tensorA }); +// mgr.rebuild({ tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// EXPECT_EQ(tensorA->data(), testVecA); +// EXPECT_EQ(tensorB->data(), testVecB); +// } +// +// EXPECT_FALSE(tensorA->isInit()); +// EXPECT_FALSE(tensorB->isInit()); +//} +// +//TEST(TestOpTensorCreate, TestTensorMemoryManagedByManagerNOTDestroyed) +//{ +// +// std::vector testVecA{ 9, 8, 7 }; +// std::vector testVecB{ 6, 5, 4 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// kp::Manager mgr; +// +// { +// mgr.rebuild({ tensorA }); +// mgr.rebuild({ tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// EXPECT_EQ(tensorA->data(), testVecA); +// EXPECT_EQ(tensorB->data(), testVecB); +// } +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +//} +// +//TEST(TestOpTensorCreate, NoErrorIfTensorFreedBefore) +//{ +// +// std::vector testVecA{ 9, 8, 7 }; +// std::vector testVecB{ 6, 5, 4 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; +// +// kp::Manager mgr; +// +// mgr.rebuild({ tensorA }); +// mgr.rebuild({ tensorB }); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// +// EXPECT_EQ(tensorA->data(), testVecA); +// EXPECT_EQ(tensorB->data(), testVecB); +// +// tensorA->freeMemoryDestroyGPUResources(); +// tensorB->freeMemoryDestroyGPUResources(); +// EXPECT_FALSE(tensorA->isInit()); +// EXPECT_FALSE(tensorB->isInit()); +//} +// +//TEST(TestOpTensorCreate, ExceptionOnZeroSizeTensor) +//{ +// std::vector testVecA; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; +// +// kp::Manager mgr; +// +// try { +// mgr.rebuild({ tensorA }); +// } catch (const std::runtime_error& err) { +// // check exception +// ASSERT_TRUE(std::string(err.what()).find("zero-sized") != +// std::string::npos); +// } +//} diff --git a/test/TestOpTensorSync.cpp b/test/TestOpTensorSync.cpp index f992805f5..8e8c4cda2 100644 --- a/test/TestOpTensorSync.cpp +++ b/test/TestOpTensorSync.cpp @@ -3,55 +3,55 @@ #include "kompute/Kompute.hpp" -TEST(TestOpTensorSync, SyncToDeviceMemorySingleTensor) -{ - - kp::Manager mgr; - - std::vector testVecPreA{ 0, 0, 0 }; - std::vector testVecPostA{ 9, 8, 7 }; - - std::shared_ptr tensorA{ new kp::Tensor(testVecPreA) }; - - mgr.rebuild({ tensorA }, false); - - EXPECT_TRUE(tensorA->isInit()); - - tensorA->setData(testVecPostA); - - mgr.evalOpDefault({ tensorA }); - - mgr.evalOpDefault({ tensorA }); - - EXPECT_EQ(tensorA->data(), testVecPostA); -} - -TEST(TestOpTensorSync, SyncToDeviceMemoryMultiTensor) -{ - - kp::Manager mgr; - - std::vector testVec{ 9, 8, 7 }; - - std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 }) }; - std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; - std::shared_ptr tensorC{ new kp::Tensor({ 0, 0, 0 }) }; - - mgr.rebuild({ tensorA, tensorB, tensorC }, false); - - EXPECT_TRUE(tensorA->isInit()); - EXPECT_TRUE(tensorB->isInit()); - EXPECT_TRUE(tensorC->isInit()); - - tensorA->setData(testVec); - - mgr.evalOpDefault({ tensorA }); - - mgr.evalOpDefault({ tensorA, tensorB, tensorC }); - - mgr.evalOpDefault({ tensorA, tensorB, tensorC }); - - EXPECT_EQ(tensorA->data(), testVec); - EXPECT_EQ(tensorB->data(), testVec); - EXPECT_EQ(tensorC->data(), testVec); -} +//TEST(TestOpTensorSync, SyncToDeviceMemorySingleTensor) +//{ +// +// kp::Manager mgr; +// +// std::vector testVecPreA{ 0, 0, 0 }; +// std::vector testVecPostA{ 9, 8, 7 }; +// +// std::shared_ptr tensorA{ new kp::Tensor(testVecPreA) }; +// +// mgr.rebuild({ tensorA }, false); +// +// EXPECT_TRUE(tensorA->isInit()); +// +// tensorA->setData(testVecPostA); +// +// mgr.evalOpDefault({ tensorA }); +// +// mgr.evalOpDefault({ tensorA }); +// +// EXPECT_EQ(tensorA->data(), testVecPostA); +//} +// +//TEST(TestOpTensorSync, SyncToDeviceMemoryMultiTensor) +//{ +// +// kp::Manager mgr; +// +// std::vector testVec{ 9, 8, 7 }; +// +// std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 }) }; +// std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; +// std::shared_ptr tensorC{ new kp::Tensor({ 0, 0, 0 }) }; +// +// mgr.rebuild({ tensorA, tensorB, tensorC }, false); +// +// EXPECT_TRUE(tensorA->isInit()); +// EXPECT_TRUE(tensorB->isInit()); +// EXPECT_TRUE(tensorC->isInit()); +// +// tensorA->setData(testVec); +// +// mgr.evalOpDefault({ tensorA }); +// +// mgr.evalOpDefault({ tensorA, tensorB, tensorC }); +// +// mgr.evalOpDefault({ tensorA, tensorB, tensorC }); +// +// EXPECT_EQ(tensorA->data(), testVec); +// EXPECT_EQ(tensorB->data(), testVec); +// EXPECT_EQ(tensorC->data(), testVec); +//} diff --git a/test/TestSequence.cpp b/test/TestSequence.cpp index 0dec484b5..8c1ae3751 100644 --- a/test/TestSequence.cpp +++ b/test/TestSequence.cpp @@ -3,40 +3,40 @@ #include "kompute/Kompute.hpp" -TEST(TestSequence, CmdBufSequenceBeginEnd) -{ - kp::Manager mgr; - - { - std::shared_ptr sq = - mgr.sequence("newSequence"); - - EXPECT_TRUE(sq->eval()); - EXPECT_TRUE(!sq->isRecording()); - EXPECT_TRUE(sq->begin()); - EXPECT_TRUE(sq->isRecording()); - EXPECT_TRUE(!sq->begin()); - EXPECT_TRUE(sq->isRecording()); - EXPECT_TRUE(sq->end()); - EXPECT_TRUE(!sq->isRecording()); - EXPECT_TRUE(!sq->end()); - EXPECT_TRUE(!sq->isRecording()); - EXPECT_TRUE(sq->eval()); - } -} - -TEST(TestSequence, SequenceDestructorViaManager) -{ - std::shared_ptr sq = nullptr; - - { - kp::Manager mgr; - - sq = mgr.sequence("newSequence"); - - EXPECT_TRUE(sq->isInit()); - } - - EXPECT_FALSE(sq->isInit()); -} +//TEST(TestSequence, CmdBufSequenceBeginEnd) +//{ +// kp::Manager mgr; +// +// { +// std::shared_ptr sq = +// mgr.sequence("newSequence"); +// +// EXPECT_TRUE(sq->eval()); +// EXPECT_TRUE(!sq->isRecording()); +// EXPECT_TRUE(sq->begin()); +// EXPECT_TRUE(sq->isRecording()); +// EXPECT_TRUE(!sq->begin()); +// EXPECT_TRUE(sq->isRecording()); +// EXPECT_TRUE(sq->end()); +// EXPECT_TRUE(!sq->isRecording()); +// EXPECT_TRUE(!sq->end()); +// EXPECT_TRUE(!sq->isRecording()); +// EXPECT_TRUE(sq->eval()); +// } +//} +// +//TEST(TestSequence, SequenceDestructorViaManager) +//{ +// std::shared_ptr sq = nullptr; +// +// { +// kp::Manager mgr; +// +// sq = mgr.sequence("newSequence"); +// +// EXPECT_TRUE(sq->isInit()); +// } +// +// EXPECT_FALSE(sq->isInit()); +//} diff --git a/test/TestSpecializationConstant.cpp b/test/TestSpecializationConstant.cpp index e4075314f..d1e4cdc9e 100644 --- a/test/TestSpecializationConstant.cpp +++ b/test/TestSpecializationConstant.cpp @@ -4,46 +4,44 @@ TEST(TestSpecializationConstants, TestTwoConstants) { - std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 }) }; - std::shared_ptr tensorB{ new kp::Tensor({ 0, 0, 0 }) }; - - std::string shader(R"( - #version 450 - layout (constant_id = 0) const float cOne = 1; - layout (constant_id = 1) const float cTwo = 1; - 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] = cOne; - pb[index] = cTwo; - })"); - { + std::string shader(R"( + #version 450 + layout (constant_id = 0) const float cOne = 1; + layout (constant_id = 1) const float cTwo = 1; + 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] = cOne; + pb[index] = cTwo; + })"); + + std::vector spirv = kp::Shader::compile_source(shader); + std::shared_ptr sq = nullptr; { kp::Manager mgr; - mgr.rebuild({ tensorA, tensorB }); + std::shared_ptr tensorA = mgr.tensor({ 0, 0, 0 }); + std::shared_ptr tensorB = mgr.tensor({ 0, 0, 0 }); - sq = mgr.sequence(); + std::vector> params = {tensorA, tensorB}; - auto spec = kp::Constants({5.0, 0.3}); + kp::Constants spec = kp::Constants({5.0, 0.3}); - sq->begin(); - sq->record( - { tensorA, tensorB }, - kp::Shader::compile_source(shader), - kp::Workgroup(), spec); - sq->end(); + std::shared_ptr algo = mgr.algorithm(params, spirv, {}, spec); - sq->eval(); + sq = mgr.sequence() + ->record(params) + ->record(algo) + ->record(params) + ->eval(); - mgr.evalOpDefault({ tensorA, tensorB }); + EXPECT_EQ(tensorA->data(), std::vector({ 5, 5, 5 })); + EXPECT_EQ(tensorB->data(), std::vector({ 0.3, 0.3, 0.3 })); } } - EXPECT_EQ(tensorA->data(), std::vector({ 5, 5, 5 })); - EXPECT_EQ(tensorB->data(), std::vector({ 0.3, 0.3, 0.3 })); } diff --git a/test/TestTensor.cpp b/test/TestTensor.cpp index 705c825f7..76ecbe60d 100644 --- a/test/TestTensor.cpp +++ b/test/TestTensor.cpp @@ -5,36 +5,10 @@ TEST(TestTensor, ConstructorData) { - std::vector vec{ 0, 1, 2 }; - kp::Tensor tensor(vec); - EXPECT_EQ(tensor.size(), vec.size()); - EXPECT_EQ(tensor.data(), vec); -} - -TEST(TestTensor, CopyFromHostData) -{ - std::vector vecA{ 0, 1, 2 }; - std::vector vecB{ 0, 0, 0 }; - - std::shared_ptr tensorA = - std::make_shared(vecA, kp::Tensor::TensorTypes::eHost); - std::shared_ptr tensorB = - std::make_shared(vecB, kp::Tensor::TensorTypes::eHost); - kp::Manager mgr; - - mgr.rebuild({ tensorA, tensorB }); - - if (std::shared_ptr sq = - mgr.sequence("new")) { - sq->begin(); - - sq->record({ tensorA, tensorB }); - - sq->end(); - - sq->eval(); - } - - EXPECT_EQ(tensorA->data(), tensorB->data()); + std::vector vec{ 0, 1, 2 }; + std::shared_ptr tensor = mgr.tensor(vec); + EXPECT_EQ(tensor->size(), vec.size()); + EXPECT_EQ(tensor->data(), vec); } + diff --git a/test/TestWorkgroup.cpp b/test/TestWorkgroup.cpp index 59ab1ff10..5da0a4c54 100644 --- a/test/TestWorkgroup.cpp +++ b/test/TestWorkgroup.cpp @@ -3,6 +3,8 @@ #include "kompute/Kompute.hpp" +#include "kompute_test/shaders/shadertest_workgroup.hpp" + TEST(TestWorkgroup, TestSimpleWorkgroup) { std::shared_ptr tensorA = nullptr; @@ -29,7 +31,7 @@ TEST(TestWorkgroup, TestSimpleWorkgroup) sq = mgr.sequence(); sq->record(params); - sq->record(params, algorithm); + sq->record(algorithm); sq->record(params); sq->eval(); }