gpt4 book ai didi

c++ - 关于 Vulkan 中的函数加载器

转载 作者:太空狗 更新时间:2023-10-29 23:49:37 25 4
gpt4 key购买 nike

在 Vulkan 中,我们有两个全局函数需要使用 dlopen/LoadLibrary 加载。它们是 vkGetInstanceProcAddr 和 vkGetDeviceProcAddr。

我有一个 gpu 并安装了 vulkan 驱动程序。我应该更好地在运行时或链接时加载库吗?我将不同的逻辑设备(从相同的 gpu 创建)提供给 vkGetDeviceProcAddr 以查询相同的功能。他们都向我返回相同的地址。我认为重新加载可能很浪费。

我的问题是这个想法是怎么来的?是多实现还是多GPU?

我的加载器函数目前看起来像这样:

class VulkanDevice
{
public:
VkDevice m_Device;
void LoadAllCoreFunctions();
void LoadExtension(const char *name);
void LoadExtensions(const char *postfix); // for example: "KHR"

PFN_vkCreateCommandBuffers vkCreateCommandBuffers;
// Then a lot of function pointers.....
}

int main() {
// After creating instance and creating device with vkCreateDevice
VulkanDevice vkd(device);
vkd.LoadAllCoreFunctions();
vkd.vkCreateCommandBuffers(vkd.m_Device, ....);
}

如您所见,如果我有多个设备,重新加载会非常浪费...而且函数指针也会占用大量内存...

最佳答案

In Vulkan, we have two global functions that need to load with dlopen/LoadLibrary. They are vkGetInstanceProcAddr and vkGetDeviceProcAddr.

错了。只有 vkGetInstanceProcAddrvkGetDeviceProcAddr 本身可以从 vkGetInstanceProcAddr 加载。

Should I better load library at runtime or linktime? I give difference logical devices(created from the same gpu) to vkGetDeviceProcAddr to query the same function. They both return the same address to me.

VkInstance 获取从 vkGetInstanceProcAddr 获取的命令仅限于用于获取它们的完全相同的实例

类似地,从 vkGetDeviceProcAddr 获取的命令只能用于获取它们的设备(类型为 VkDevice)。

它们可能并且经常会是相同的,但您无法提前知道并让它在每个平台/PC 上都以这种方式工作。您可以只加载单个命令,以测试它是同一个指针并推断其他命令也是如此 — 但这是如履薄冰,没有任何合理的好处。

为方便起见,在与 The Official Loader 的链接时执行此操作,除非您有理由不这样做。

I think the reload could be wasteful.

除非您计划使用数百万个不断连接和断开连接的 GPU 制作硬件,否则请不要担心并正确加载命令。这是一次(或很少)一次的小成本,毫无疑问,它会在您之后要做的所有渲染中迅速摊销。

也没有“重新加载”。新指针可以与旧指针和平共处。在 C++ 中,您可能会创建实例或设备的那些成员函数...

My question is how this idea come from? Is it for multi-implementation or multi-gpus?

是的,有点。

你肯定会看到,如果你有两个 GPU(来自不同的供应商),具有不同的驱动程序文件(通常是一些 *.dll 或其他平台上的等效文件),那么必须以某种方式选择正确文件的 fpointer。

vkGetInstanceProcAddr 解决了它,因此它为您提供了指向另一个选择并调用正确指针的函数的指针。 (“一切都可以通过另一层间接来解决”,对吧?)。静态加载 Khronos/Official/LunargSDK 加载器可能会做类似的事情。

对于 vkGetDeviceProcAddr,您只需提供确切的设备,然后它会简单地为您提供指向该特定 GPU 驱动程序的直接函数指针。

实例也可能发生同样的情况(加载器必须只导出 vkGetInstanceProcAddr,其余的可以在其他地方)。尽管通常(如 The Loader 的情况)它会导出所有实例级甚至间接设备级函数指针以方便使用。

As you can see, if I have multiple device it will be pretty wasteful to reload... and the function pointer could use a lot of memory too....

如前所述,实际上并没有那么多 CPU 时间浪费。

如果您没有那几 kB 的指针,您可能无论如何都无法创建可行的基于 Vulkan 的应用程序。您可以只加载您实际使用的那些命令,但我看不出这种过早优化的原因。您是否有一些特殊的硬件,需要如此绝望的措施或进行 64K 演示?

关于c++ - 关于 Vulkan 中的函数加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com