// // VulkanBasicExecution.cpp // MNN // // Created by MNN on 2019/01/31. // Copyright © 2018, Alibaba Group Holding Limited // #include "VulkanBasicExecution.hpp" #include "VulkanBackend.hpp" #include "core/TensorUtils.hpp" //#define MNN_VULKAN_DEBUG //#define MNN_VULKAN_DEBUG_EAGER namespace MNN { VulkanBasicExecutionDirect::VulkanBasicExecutionDirect(std::shared_ptr encoder) : Execution(encoder->backend()) { mEncoder = encoder; auto extra = static_cast(encoder->backend()); mCmdBuffer.reset(const_cast(extra->getPool().allocBuffer())); } ErrorCode VulkanBasicExecutionDirect::onExecute(const std::vector &inputs, const std::vector &outputs) { auto extra = static_cast(backend()); extra->pushCommand(mCmdBuffer->get()); return NO_ERROR; } static void _initLayout(const std::vector &inputs, const std::vector &outputs, const VulkanCommandPool::Buffer* initCmdBuffer) { for (auto input : inputs) { auto vkTensor = reinterpret_cast(input->deviceId()); if (nullptr == vkTensor) { continue; } for (int i=0; iimageSize(); ++i) { auto img = vkTensor->image(i); if (img->currentLayout() == VK_IMAGE_LAYOUT_UNDEFINED) { img->barrierRead(initCmdBuffer->get()); } } } } static void _postTreat(const std::vector &outputs, const VulkanCommandPool::Buffer* initCmdBuffer) { for (auto output : outputs) { auto vkTensor = reinterpret_cast(output->deviceId()); if (nullptr == vkTensor) { continue; } for (int i=0; iimageSize(); ++i) { auto img = vkTensor->image(i); if (img->currentLayout() == VK_IMAGE_LAYOUT_UNDEFINED) { auto img = vkTensor->image(i); img->barrierRead(initCmdBuffer->get()); } } } } ErrorCode VulkanBasicExecutionDirect::onResize(const std::vector &inputs, const std::vector &outputs) { auto initCmdBuffer = static_cast(backend())->getInitCommandBuffer(); _initLayout(inputs, outputs, initCmdBuffer); mCmdBuffer->begin(0); #ifdef ENABLE_VULKAN_TIME_PROFILE auto vkBn = static_cast(backend()); ErrorCode code = NO_ERROR; { VulkanTimeProfileScope scope(vkBn->timeProfiler(), mCmdBuffer->get(), mEncoder->getName().c_str(), VulkanTimeProfiler::Kind::Execution); code = mEncoder->onEncode(inputs, outputs, mCmdBuffer.get()); } #else auto code = mEncoder->onEncode(inputs, outputs, mCmdBuffer.get()); #endif for (auto output : outputs) { auto vkTensor = reinterpret_cast(output->deviceId()); for (int i=0; iimageSize(); ++i) { auto img = vkTensor->image(i); img->barrierRead(mCmdBuffer->get()); } } _postTreat(outputs, mCmdBuffer.get()); mCmdBuffer->end(); #ifdef MNN_VULKAN_DEBUG #ifdef MNN_VULKAN_DEBUG_EAGER static_cast(backend())->onExecuteBegin(); static_cast(backend())->pushCommand(mCmdBuffer->get()); static_cast(backend())->onExecuteEnd(); #endif #endif return code; } VulkanBasicExecutionInDirect::VulkanBasicExecutionInDirect(std::shared_ptr encoder) : Execution(encoder->backend()) { mEncoder = encoder; } ErrorCode VulkanBasicExecutionInDirect::onResize(const std::vector &inputs, const std::vector &outputs) { auto extra = static_cast(backend()); auto initCmdBuffer = static_cast(backend())->getInitCommandBuffer(); _initLayout(inputs, outputs, initCmdBuffer); auto mCmdBuffer = extra->getSingleCommand(); auto vkBn = static_cast(backend()); ErrorCode code = NO_ERROR; #ifdef ENABLE_VULKAN_TIME_PROFILE VulkanTimeProfileScope scope(vkBn->timeProfiler(), mCmdBuffer->get(), mEncoder->getName().c_str(), VulkanTimeProfiler::Kind::Execution); code = mEncoder->onEncode(inputs, outputs, mCmdBuffer.get()); #else code = mEncoder->onEncode(inputs, outputs, mCmdBuffer.get()); #endif _postTreat(outputs, mCmdBuffer.get()); return code; } } // namespace MNN