在 DLLMain 中调用 CUDA 函数

Posted

技术标签:

【中文标题】在 DLLMain 中调用 CUDA 函数【英文标题】:Calling CUDA function in DLLMain 【发布时间】:2012-09-09 18:12:59 【问题描述】:

我在 Windows 中开发了一个 C++ DLL,它具有许多 CUDA 加速功能。 目前我还没有创建 DllMain 函数,因为它不是强制性的。

我知道在 DllMain 中可以调用的函数有很多限制。

我只是想知道在DllMain中调用CUDA Runtime函数只是为了初始化默认上下文是否安全,以便后续的CUDA调用更快?

我正在使用 Visual Studio 2008、CUDA 5.0 和 Windows 8 进行开发。

【问题讨论】:

【参考方案1】:

Reading the DLLMain documentation,我建议不要这样做。来自文档:

警告 在 DLL 入口点中可以执行的操作受到严格限制。要提供更复杂的初始化,请为 DLL 创建一个初始化例程。您可以要求应用程序在调用 DLL 中的任何其他例程之前调用初始化例程。

更具体地说:

调用需要 Kernel32.dll 以外的 DLL 的函数可能会导致难以诊断的问题。

由于 CUDA Runtime API 需要 cudart.dll,这适用于您的问题。

所以我会为你的库创建一个初始化函数来进行 CUDA 初始化,并要求在应用程序启动时显式调用它。

【讨论】:

马克是对的。 DllMain() 的限制很多。另见:msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx @ArchaeaSoftware,harrism... 现在静态 cuda 运行时自 CUDA 5.5 起可用,如果我将我的 DLL 链接到静态 cuda 运行时,这个答案是否仍然适用。 静态运行时很好地预防了 DLL 地狱,但它并没有真正满足您从 DllMain() 初始化默认上下文的愿望,这似乎仍然不明智。如果我是你,我只会让我的 DLL 的用户调用一个初始化函数。

以上是关于在 DLLMain 中调用 CUDA 函数的主要内容,如果未能解决你的问题,请参考以下文章

从DllMain调用LoadLibrary

首先调用的是 DllMain() 还是全局静态对象构造函数?

Dllmain的作用

使用 LoadLibrary 后未调用 DllMain

如何在dll注入中调用特定函数?

在不执行 dllmain 函数的情况下加载 Dll