【问题标题】:The proper way to invalidate and flush Vulkan memory使 Vulkan 内存无效和刷新的正确方法
【发布时间】:2021-11-09 20:13:13
【问题描述】:

在 Vulkan 中刷新和使非相干内存无效时,您需要将其范围与起始偏移量和大小都与称为“nonCoherentAtomSize”的对齐方式对齐,在我的物理设备上为 128 字节。为此,您将向下舍入起始偏移并将大小向上舍入到此对齐方式(128 字节)。我可以看到的问题是类型的对齐不太严格(较小),并且这种向上和向下舍入可能会溢出分配内存之外的范围。所以:

// CREATE A BUFFER WITH SIZE 17
VkMemoryRequirements memRequirements;
vkGetBufferMemoryRequirements(logicalDevice, vk_buffer, &memRequirements);

memRequirements.size; // == 20
memRequirements.alignment; // == 4
// ON MY SETUP

假设我分配了 20 字节的内存,并且我在开始时分配了这个缓冲区 (0),并且我想刷新这个范围,我将使用大小 20 刷新偏移量 0(但这需要四舍五入到 128( nonCoherentAtomSize), 比缓冲区大。这是不对的,对吧?同样,从 vkAllocateMemory 返回的内存是否保证至少与 nonCoherentAtomSize 对齐?如果不是,内存可能仅以 16 字节对齐开始,如果我向下取整,那么我会在内存之前刷新一个范围,对吗?

编辑:抱歉,在四舍五入的情况下是不可能的,因为flush和invalidate的参数是一个偏移量,任何四舍五入到其对齐的东西都不能小于0。但是在四舍五入的情况下它仍然是一个问题我可以看到。

【问题讨论】:

    标签: vulkan memory-alignment


    【解决方案1】:

    没有理由映射未与nonCoherentAtomSize 对齐的分配范围。如果你这样做,那么你会发现你将无法正确刷新或使该范围的一部分无效。

    确实,没有理由只映射您打算映射的分配的部分。只需在分配后立即映射整个事物。此时,如果nonCoherentAtomSize对齐的size超出分配范围,您可以使用VK_WHOLE_SIZE指定大小。

    【讨论】:

    • 如果分配大小为 146,那么我会将刷新范围大小四舍五入为 256,然后在内存分配之外进行刷新,这就是我的观点。舍入并使用舍入数字和分配大小的最大值的典型方法是什么?
    • @Zebrafish: "如果分配大小为 146,那么我会将刷新范围大小四舍五入为 256" 然后你会意识到四舍五入的大小超出了内存分配,所以你会使用VK_WHOLE_SIZE,就像我说的那样。
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 2019-02-16
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多