From ba71c7ab462fe5a176839dc019b13951783a07ac Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 18 Oct 2020 16:04:35 +0100 Subject: [PATCH 1/3] Updated manager to have unique sequence added on default operations --- src/Manager.cpp | 12 +++++++++++- src/Sequence.cpp | 15 ++++++++++++--- src/include/kompute/Manager.hpp | 23 ++++++++++++----------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/Manager.cpp b/src/Manager.cpp index b2739d6be..e306ad004 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -95,6 +95,7 @@ std::weak_ptr Manager::getOrCreateManagedSequence(std::string sequenceName) { SPDLOG_DEBUG("Kompute Manager creating Sequence object"); + std::unordered_map>::iterator found = this->mManagedSequences.find(sequenceName); @@ -120,7 +121,16 @@ Manager::createManagedSequence(std::string sequenceName, uint32_t queueIndex) this->mComputeQueues[queueIndex], this->mComputeQueueFamilyIndeces[queueIndex]); sq->init(); - this->mManagedSequences.insert({ sequenceName, sq }); + + if (sequenceName.empty()) { + this->mCurrentSequenceIndex++; + this->mManagedSequences.insert({ KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), sq }); + } + else + { + // TODO: Check if sequence doens't already exist + this->mManagedSequences.insert({ sequenceName, sq }); + } return sq; } diff --git a/src/Sequence.cpp b/src/Sequence.cpp index a03a34afe..b286a2e44 100644 --- a/src/Sequence.cpp +++ b/src/Sequence.cpp @@ -75,10 +75,20 @@ Sequence::begin() return false; } + if (this->isRunning()) { + SPDLOG_WARN("Kompute Sequence begin called when sequence still running"); + return false; + } + if (!this->mCommandPool) { throw std::runtime_error("Kompute Sequence command pool is null"); } + if (this->mOperations.size()) { + SPDLOG_INFO("Kompute Sequence clearing previous operations"); + this->mOperations.clear(); + } + if (!this->mRecording) { SPDLOG_INFO("Kompute Sequence command recording BEGIN"); this->mCommandBuffer->begin(vk::CommandBufferBeginInfo()); @@ -177,9 +187,10 @@ Sequence::evalAwait(uint64_t waitFor) this->mDevice->waitForFences(1, &this->mFence, VK_TRUE, waitFor); this->mDevice->destroy(this->mFence); + this->mIsRunning = false; + if (result == vk::Result::eTimeout) { SPDLOG_WARN("Kompute Sequence evalAwait timed out"); - this->mIsRunning = false; return false; } @@ -187,8 +198,6 @@ Sequence::evalAwait(uint64_t waitFor) this->mOperations[i]->postEval(); } - this->mIsRunning = false; - return true; } diff --git a/src/include/kompute/Manager.hpp b/src/include/kompute/Manager.hpp index 969af9ac5..db67a3790 100644 --- a/src/include/kompute/Manager.hpp +++ b/src/include/kompute/Manager.hpp @@ -72,11 +72,11 @@ class Manager * Create a new managed Kompute sequence so it's available within the * manager. * - * @param sequenceName The name for the named sequence to be created + * @param sequenceName The name for the named sequence to be created, if empty then default indexed value is used * @param queueIndex The queue to use from the available queues * @return Weak pointer to the manager owned sequence resource */ - std::weak_ptr createManagedSequence(std::string sequenceName, + std::weak_ptr createManagedSequence(std::string sequenceName = "", uint32_t queueIndex = 0); /** @@ -113,7 +113,7 @@ class Manager } /** - * Function that evaluates operation against default sequence. + * Function that evaluates operation against a newly created sequence. * * @param tensors The tensors to be used in the operation recorded * @param TArgs Template parameters that will be used to initialise @@ -124,8 +124,9 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOp Default triggered"); + this->mCurrentSequenceIndex++; this->evalOp( - tensors, KP_DEFAULT_SESSION, std::forward(params)...); + tensors, KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), std::forward(params)...); } /** @@ -142,14 +143,11 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOpAsync triggered"); + std::weak_ptr sqWeakPtr = this->getOrCreateManagedSequence(sequenceName); - std::unordered_map>::iterator - found = this->mManagedSequences.find(sequenceName); - - if (found != this->mManagedSequences.end()) { - std::shared_ptr sq = found->second; + if (std::shared_ptr sq = sqWeakPtr.lock()) { SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence BEGIN"); sq->begin(); @@ -181,8 +179,9 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOpAsyncDefault triggered"); + this->mCurrentSequenceIndex++; this->evalOpAsync( - tensors, KP_DEFAULT_SESSION, std::forward(params)...); + tensors, KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), std::forward(params)...); } /** @@ -222,7 +221,7 @@ class Manager void evalOpAwaitDefault(uint64_t waitFor = UINT64_MAX) { SPDLOG_DEBUG("Kompute Manager evalOpAwaitDefault triggered"); - this->evalOpAwait(KP_DEFAULT_SESSION, waitFor); + this->evalOpAwait(KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), waitFor); } /** @@ -266,6 +265,8 @@ class Manager std::vector mComputeQueueFamilyIndeces; std::vector> mComputeQueues; + uint32_t mCurrentSequenceIndex = -1; + #if DEBUG #ifndef KOMPUTE_DISABLE_VK_DEBUG_LAYERS vk::DebugReportCallbackEXT mDebugReportCallback; From 7679070274d417063f479130d05d2713073bd522 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 18 Oct 2020 16:04:52 +0100 Subject: [PATCH 2/3] Updated tests to use new constraints on unique default operations --- test/TestAsyncOperations.cpp | 31 +++++--- test/TestLogisticRegression.cpp | 108 ++++++++++++++-------------- test/TestMultipleAlgoExecutions.cpp | 61 ++++++++-------- 3 files changed, 103 insertions(+), 97 deletions(-) diff --git a/test/TestAsyncOperations.cpp b/test/TestAsyncOperations.cpp index 5c8612fc3..896f32b2a 100644 --- a/test/TestAsyncOperations.cpp +++ b/test/TestAsyncOperations.cpp @@ -142,23 +142,32 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution) std::vector data(size, 0.0); std::vector resultAsync(size, 100000000); - kp::Manager mgrAsync(0); + kp::Manager mgr; - std::vector> inputsAsyncB; + std::shared_ptr tensorA{ new kp::Tensor(data) }; + std::shared_ptr tensorB{ new kp::Tensor(data) }; - inputsAsyncB.push_back(std::make_shared(kp::Tensor(data))); + mgr.createManagedSequence("asyncOne"); + mgr.createManagedSequence("asyncTwo"); - mgrAsync.evalOpAsyncDefault(inputsAsyncB); - mgrAsync.evalOpAwaitDefault(); + mgr.evalOpDefault({ tensorA, tensorB }); - mgrAsync.evalOpAsyncDefault>( - { inputsAsyncB[0] }, + mgr.evalOpAsync>( + { tensorA }, + "asyncOne", std::vector(shader.begin(), shader.end())); - mgrAsync.evalOpAwaitDefault(); + mgr.evalOpAsync>( + { tensorB }, + "asyncTwo", + std::vector(shader.begin(), shader.end())); - mgrAsync.evalOpAsyncDefault({ inputsAsyncB }); - mgrAsync.evalOpAwaitDefault(); + mgr.evalOpAwait("asyncOne"); + mgr.evalOpAwait("asyncTwo"); - EXPECT_EQ(inputsAsyncB[0]->data(), resultAsync); + mgr.evalOpAsyncDefault({ tensorA, tensorB }); + mgr.evalOpAwaitDefault(); + + EXPECT_EQ(tensorA->data(), resultAsync); + EXPECT_EQ(tensorB->data(), resultAsync); } diff --git a/test/TestLogisticRegression.cpp b/test/TestLogisticRegression.cpp index c87ef8e1f..5043a5a36 100644 --- a/test/TestLogisticRegression.cpp +++ b/test/TestLogisticRegression.cpp @@ -31,38 +31,38 @@ TEST(TestLogisticRegressionAlgorithm, TestMainLogisticRegression) { kp::Manager mgr; - if (std::shared_ptr sq = - mgr.getOrCreateManagedSequence("createTensors").lock()) { + std::shared_ptr sqTensor = + mgr.createManagedSequence().lock(); - sq->begin(); + sqTensor->begin(); + sqTensor->record(params); + sqTensor->end(); + sqTensor->eval(); - sq->record(params); + std::shared_ptr sq = + mgr.createManagedSequence().lock(); + + // Record op algo base + sq->begin(); + + sq->record({ wIn, bIn }); + + sq->record>( + params, "test/shaders/glsl/test_logistic_regression.comp"); + + sq->record({ wOutI, wOutJ, bOut, lOut }); + + sq->end(); + + // Iterate across all expected iterations + for (size_t i = 0; i < ITERATIONS; i++) { - sq->end(); sq->eval(); - // Record op algo base - sq->begin(); - - sq->record({ wIn, bIn }); - - sq->record>( - params, "test/shaders/glsl/test_logistic_regression.comp"); - - sq->record({ wOutI, wOutJ, bOut, lOut }); - - sq->end(); - - // Iterate across all expected iterations - for (size_t i = 0; i < ITERATIONS; i++) { - - sq->eval(); - - for (size_t j = 0; j < bOut->size(); j++) { - wIn->data()[0] -= learningRate * wOutI->data()[j]; - wIn->data()[1] -= learningRate * wOutJ->data()[j]; - bIn->data()[0] -= learningRate * bOut->data()[j]; - } + for (size_t j = 0; j < bOut->size(); j++) { + wIn->data()[0] -= learningRate * wOutI->data()[j]; + wIn->data()[1] -= learningRate * wOutJ->data()[j]; + bIn->data()[0] -= learningRate * bOut->data()[j]; } } } @@ -115,39 +115,39 @@ TEST(TestLogisticRegressionAlgorithm, TestMainLogisticRegressionManualCopy) { kp::Manager mgr; - if (std::shared_ptr sq = - mgr.getOrCreateManagedSequence("createTensors").lock()) { + std::shared_ptr sqTensor = + mgr.createManagedSequence().lock(); - sq->begin(); + sqTensor->begin(); + sqTensor->record(params); + sqTensor->end(); + sqTensor->eval(); - sq->record(params); + std::shared_ptr sq = + mgr.createManagedSequence().lock(); + + // Record op algo base + sq->begin(); + + sq->record>( + params, "test/shaders/glsl/test_logistic_regression.comp"); + + sq->record({ wOutI, wOutJ, bOut, lOut }); + + sq->end(); + + // Iterate across all expected iterations + for (size_t i = 0; i < ITERATIONS; i++) { - sq->end(); sq->eval(); - // Record op algo base - sq->begin(); - - sq->record>( - params, "test/shaders/glsl/test_logistic_regression.comp"); - - sq->record({ wOutI, wOutJ, bOut, lOut }); - - sq->end(); - - // Iterate across all expected iterations - for (size_t i = 0; i < ITERATIONS; i++) { - - sq->eval(); - - for (size_t j = 0; j < bOut->size(); j++) { - wIn->data()[0] -= learningRate * wOutI->data()[j]; - wIn->data()[1] -= learningRate * wOutJ->data()[j]; - bIn->data()[0] -= learningRate * bOut->data()[j]; - } - wIn->mapDataIntoHostMemory(); - bIn->mapDataIntoHostMemory(); + for (size_t j = 0; j < bOut->size(); j++) { + wIn->data()[0] -= learningRate * wOutI->data()[j]; + wIn->data()[1] -= learningRate * wOutJ->data()[j]; + bIn->data()[0] -= learningRate * bOut->data()[j]; } + wIn->mapDataIntoHostMemory(); + bIn->mapDataIntoHostMemory(); } } diff --git a/test/TestMultipleAlgoExecutions.cpp b/test/TestMultipleAlgoExecutions.cpp index 1b59d3516..45b672919 100644 --- a/test/TestMultipleAlgoExecutions.cpp +++ b/test/TestMultipleAlgoExecutions.cpp @@ -45,7 +45,6 @@ TEST(TestMultipleAlgoExecutions, SingleSequenceRecord) TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords) { - kp::Manager mgr; std::shared_ptr tensorA{ new kp::Tensor({ 0, 0, 0 }) }; @@ -59,43 +58,41 @@ TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords) pa[index] = pa[index] + 1; })"); - std::weak_ptr sqWeakPtr = - mgr.getOrCreateManagedSequence("newSequence"); - if (std::shared_ptr sq = sqWeakPtr.lock()) { - sq->begin(); + std::shared_ptr sqTensor = + mgr.createManagedSequence().lock(); - sq->record({ tensorA }); + std::shared_ptr sq = + mgr.createManagedSequence().lock(); - sq->record>( - { tensorA }, std::vector(shader.begin(), shader.end())); + // First create the tensor in a separate sequence + sqTensor->begin(); + sqTensor->record({ tensorA }); + sqTensor->end(); + sqTensor->eval(); - sq->end(); - sq->eval(); + // Then perform the computations + sq->begin(); + sq->record>( + { tensorA }, std::vector(shader.begin(), shader.end())); + sq->end(); + sq->eval(); - sq->begin(); + sq->begin(); + sq->record>( + { tensorA }, std::vector(shader.begin(), shader.end())); + sq->end(); + sq->eval(); - sq->record>( - { tensorA }, std::vector(shader.begin(), shader.end())); + sq->begin(); + sq->record>( + { tensorA }, std::vector(shader.begin(), shader.end())); + sq->end(); + sq->eval(); - 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(); + sq->begin(); + sq->record({ tensorA }); + sq->end(); + sq->eval(); EXPECT_EQ(tensorA->data(), std::vector({ 3, 3, 3 })); } From cde84c84aab20a59092983ecefc8d22d1ec50ac8 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 18 Oct 2020 16:05:01 +0100 Subject: [PATCH 3/3] Updated single_include --- single_include/kompute/Kompute.hpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/single_include/kompute/Kompute.hpp b/single_include/kompute/Kompute.hpp index bd7b3a125..31a3b8cc0 100755 --- a/single_include/kompute/Kompute.hpp +++ b/single_include/kompute/Kompute.hpp @@ -1310,11 +1310,11 @@ class Manager * Create a new managed Kompute sequence so it's available within the * manager. * - * @param sequenceName The name for the named sequence to be created + * @param sequenceName The name for the named sequence to be created, if empty then default indexed value is used * @param queueIndex The queue to use from the available queues * @return Weak pointer to the manager owned sequence resource */ - std::weak_ptr createManagedSequence(std::string sequenceName, + std::weak_ptr createManagedSequence(std::string sequenceName = "", uint32_t queueIndex = 0); /** @@ -1351,7 +1351,7 @@ class Manager } /** - * Function that evaluates operation against default sequence. + * Function that evaluates operation against a newly created sequence. * * @param tensors The tensors to be used in the operation recorded * @param TArgs Template parameters that will be used to initialise @@ -1362,8 +1362,9 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOp Default triggered"); + this->mCurrentSequenceIndex++; this->evalOp( - tensors, KP_DEFAULT_SESSION, std::forward(params)...); + tensors, KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), std::forward(params)...); } /** @@ -1380,14 +1381,11 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOpAsync triggered"); + std::weak_ptr sqWeakPtr = this->getOrCreateManagedSequence(sequenceName); - std::unordered_map>::iterator - found = this->mManagedSequences.find(sequenceName); - - if (found != this->mManagedSequences.end()) { - std::shared_ptr sq = found->second; + if (std::shared_ptr sq = sqWeakPtr.lock()) { SPDLOG_DEBUG("Kompute Manager evalOpAsync running sequence BEGIN"); sq->begin(); @@ -1419,8 +1417,9 @@ class Manager TArgs&&... params) { SPDLOG_DEBUG("Kompute Manager evalOpAsyncDefault triggered"); + this->mCurrentSequenceIndex++; this->evalOpAsync( - tensors, KP_DEFAULT_SESSION, std::forward(params)...); + tensors, KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), std::forward(params)...); } /** @@ -1460,7 +1459,7 @@ class Manager void evalOpAwaitDefault(uint64_t waitFor = UINT64_MAX) { SPDLOG_DEBUG("Kompute Manager evalOpAwaitDefault triggered"); - this->evalOpAwait(KP_DEFAULT_SESSION, waitFor); + this->evalOpAwait(KP_DEFAULT_SESSION + std::to_string(this->mCurrentSequenceIndex), waitFor); } /** @@ -1504,6 +1503,8 @@ class Manager std::vector mComputeQueueFamilyIndeces; std::vector> mComputeQueues; + uint32_t mCurrentSequenceIndex = -1; + #if DEBUG #ifndef KOMPUTE_DISABLE_VK_DEBUG_LAYERS vk::DebugReportCallbackEXT mDebugReportCallback;