MNN icon indicating copy to clipboard operation
MNN copied to clipboard

使用MNN_FORWARD_VULKAN输出结果不对

Open zengwb-lx opened this issue 1 year ago • 3 comments

1.使用的2.8.0版本预编译库,在window10 和android(adb方式)测试,代码如下: image

在window10 和android(adb方式)使用cpu、opencl、cuda后端识别都是对的,使用vulkan结果却不对 人像风格迁移模型,麻烦帮忙看下什么问题 cartoon_mnn.zip

zengwb-lx avatar Dec 26 '23 03:12 zengwb-lx

问题已经定位了,近期修正。

也可按如下 patch 自行修正

diff --git a/source/backend/vulkan/buffer/execution/VulkanBinary.cpp b/source/backend/vulkan/buffer/execution/VulkanBinary.cpp index b6fe2f798..8857f3d2f 100644 --- a/source/backend/vulkan/buffer/execution/VulkanBinary.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanBinary.cpp @@ -136,8 +136,11 @@ ErrorCode VulkanBinary::onEncode(const std::vector<Tensor*>& inputs, const std:: MNN_ASSERT(1 == outputs.size());

 auto vkBn = (VulkanBackend*)backend();
  • auto input0Scalar = inputs[0]->elementSize() == 1;
  • auto input1Scalar = inputs[1]->elementSize() == 1;
  • auto input0DataCount = TensorUtils::getRawSize(inputs[0]);
  • auto input1DataCount = TensorUtils::getRawSize(inputs[1]);
  • auto input0Scalar = input0DataCount == 1;
  • auto input1Scalar = input1DataCount == 1; auto writeBinary = [&](const VULKAN_TENSOR& input0, const VULKAN_TENSOR& input1, const VULKAN_TENSOR& output, int index) { auto constBuffer = mConstBuffer[index]; auto total = std::get<1>(output) / 4 / sizeof(float); diff --git a/source/backend/vulkan/image/execution/VulkanBinary.cpp b/source/backend/vulkan/image/execution/VulkanBinary.cpp index 55b89b1ac..ece019c90 100644 --- a/source/backend/vulkan/image/execution/VulkanBinary.cpp +++ b/source/backend/vulkan/image/execution/VulkanBinary.cpp @@ -114,8 +114,11 @@ ErrorCode VulkanBinary::onEncode(const std::vector<Tensor*>& inputs, const std:: mDescriptorSet[i].reset(mBinaryPipeline->createSet()); } }
  • auto input0Scalar = inputs[0]->elementSize() == 1;
  • auto input1Scalar = inputs[1]->elementSize() == 1;
  • auto input0DataCount = TensorUtils::getRawSize(inputs[0]);
  • auto input1DataCount = TensorUtils::getRawSize(inputs[1]);
  • auto input0Scalar = input0DataCount == 1;
  • auto input1Scalar = input1DataCount == 1; auto writeBinary = [&](VulkanTensor* input0T, VulkanTensor* input1T, VulkanTensor* outputT, int tensorIndex) { auto imageSize = outputT->imageSize(); for (int index=0; index < imageSize; ++index) {

jxt1234 avatar Feb 06 '24 10:02 jxt1234

问题已经定位了,近期修正。

也可按如下 patch 自行修正

diff --git a/source/backend/vulkan/buffer/execution/VulkanBinary.cpp b/source/backend/vulkan/buffer/execution/VulkanBinary.cpp index b6fe2f798..8857f3d2f 100644 --- a/source/backend/vulkan/buffer/execution/VulkanBinary.cpp +++ b/source/backend/vulkan/buffer/execution/VulkanBinary.cpp @@ -136,8 +136,11 @@ ErrorCode VulkanBinary::onEncode(const std::vector<Tensor*>& inputs, const std:: MNN_ASSERT(1 == outputs.size());

 auto vkBn = (VulkanBackend*)backend();
  • auto input0Scalar = inputs[0]->elementSize() == 1;
  • auto input1Scalar = inputs[1]->elementSize() == 1;
  • auto input0DataCount = TensorUtils::getRawSize(inputs[0]);
  • auto input1DataCount = TensorUtils::getRawSize(inputs[1]);
  • auto input0Scalar = input0DataCount == 1;
  • auto input1Scalar = input1DataCount == 1; auto writeBinary = [&](const VULKAN_TENSOR& input0, const VULKAN_TENSOR& input1, const VULKAN_TENSOR& output, int index) { auto constBuffer = mConstBuffer[index]; auto total = std::get<1>(output) / 4 / sizeof(float); diff --git a/source/backend/vulkan/image/execution/VulkanBinary.cpp b/source/backend/vulkan/image/execution/VulkanBinary.cpp index 55b89b1ac..ece019c90 100644 --- a/source/backend/vulkan/image/execution/VulkanBinary.cpp +++ b/source/backend/vulkan/image/execution/VulkanBinary.cpp @@ -114,8 +114,11 @@ ErrorCode VulkanBinary::onEncode(const std::vector<Tensor*>& inputs, const std:: mDescriptorSet[i].reset(mBinaryPipeline->createSet()); } }
  • auto input0Scalar = inputs[0]->elementSize() == 1;
  • auto input1Scalar = inputs[1]->elementSize() == 1;
  • auto input0DataCount = TensorUtils::getRawSize(inputs[0]);
  • auto input1DataCount = TensorUtils::getRawSize(inputs[1]);
  • auto input0Scalar = input0DataCount == 1;
  • auto input1Scalar = input1DataCount == 1; auto writeBinary = [&](VulkanTensor* input0T, VulkanTensor* input1T, VulkanTensor* outputT, int tensorIndex) { auto imageSize = outputT->imageSize(); for (int index=0; index < imageSize; ++index) {

jxt1234 avatar Feb 06 '24 10:02 jxt1234

问题已经定位了,近期修正。

也可按如下 patch 自行修正 vulkan_temp.patch

jxt1234 avatar Feb 06 '24 10:02 jxt1234

Marking as stale. No activity in 60 days.

github-actions[bot] avatar Apr 07 '24 09:04 github-actions[bot]