MCPcopy Create free account
hub / github.com/alibaba/MNN / onEncodeFast

Method onEncodeFast

source/backend/vulkan/buffer/execution/VulkanRaster.cpp:66–113  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

64}
65
66void VulkanRaster::onEncodeFast(const Tensor* input, const Tensor* output, const VulkanCommandPool::Buffer *cmdBuffer, bool zero) {
67 auto des = TensorUtils::getDescribe(input);
68 auto vkBn = static_cast<VulkanBackend*>(backend());
69 auto dstTensor = vkBn->getTensorBuffer(output);
70 auto dstTensorSize = vkBn->getTensorSize(output);
71 if (zero) {
72 vkCmdFillBuffer(cmdBuffer->get(), dstTensor.first->buffer(), dstTensor.second, dstTensorSize, 0);
73 cmdBuffer->barrierSource(dstTensor.first->buffer(), dstTensor.second, dstTensorSize, VulkanCommandPool::Buffer::WRITE_WRITE);
74 }
75
76 std::string pKey = "glsl_blit_C4_";
77 if (output->getType().code == halide_type_float && vkBn->useFP16()) {
78 pKey += "FP16_";
79 }
80 pKey += "comp";
81 auto blitPipeline = vkBn->getPipeline(pKey, {
82 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
83 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
84 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
85 });
86
87 for (int i=0; i< des->regions.size(); ++i) {
88 auto& slice = des->regions[i];
89 Tensor::InsideDescribe::Region newRegion;
90 OpCommonUtils::turnToPackRegion(slice, newRegion, output, 4, true);
91 // TODO: Find better way
92 newRegion.dst.offset /= 4;
93 newRegion.src.offset /= 4;
94 SamplerInfo info;
95 writeSamplerInfo(info, newRegion);
96 auto total = info.size[0] * info.size[1] * info.size[2];
97 auto group = UP_DIV(total, 256);
98 std::shared_ptr<VulkanLayout::DescriptorSet> describe(blitPipeline->createSet());
99 std::shared_ptr<VulkanBuffer> uniform = vkBn->allocUniform();
100 ::memcpy(uniform->map(), &info, sizeof(SamplerInfo));
101 uniform->unmap();
102 auto srcTensor = vkBn->getTensorBuffer(slice.origin);
103 auto srcTensorSize = vkBn->getTensorSize(slice.origin);
104 describe->writeBuffer(dstTensor.first->buffer(), 0, dstTensorSize, dstTensor.second);
105 describe->writeBuffer(srcTensor.first->buffer(), 1, srcTensorSize, srcTensor.second);
106 describe->writeBuffer(uniform->buffer(), 2, uniform->size());
107 cmdBuffer->barrierSource(srcTensor.first->buffer(), srcTensor.second, srcTensorSize);
108 blitPipeline->bind(cmdBuffer->get(), describe->get());
109 vkCmdDispatch(cmdBuffer->get(), group, 1, 1);
110 mExtraUniform.emplace_back(uniform);
111 mExtraDescribes.emplace_back(describe);
112 }
113}
114
115
116ErrorCode VulkanRaster::onEncode(const std::vector<Tensor *> &____inputs, const std::vector<Tensor *> &outputs,

Callers

nothing calls this directly

Calls 15

backendFunction · 0.85
getTensorBufferMethod · 0.80
barrierSourceMethod · 0.80
useFP16Method · 0.80
createSetMethod · 0.80
writeBufferMethod · 0.80
writeSamplerInfoFunction · 0.70
getTensorSizeMethod · 0.45
getMethod · 0.45
bufferMethod · 0.45
getTypeMethod · 0.45
getPipelineMethod · 0.45

Tested by

no test coverage detected