我想用 C# 编写程序,使用外部 C/C++ CUDA 库。
我在这方面还是新手。我听说我可以在代码中添加外部 DLL。
我只想解析 CUDA 函数的输出图像,我不想在 C# 层使用设备指针。
这可能吗?如果可以,我该如何实现这一目标?
干杯
最佳答案
一种方法是使用您想要使用的 CUDA 库编写 C++ dll 应用程序,然后从 C# 代码调用通过 dll 公开的函数。这意味着您正在进入非托管世界,如果出现多个线程,这就很棘手。
C++ DLL 代码,以下内容进入 header ,您必须在 cpp 文件中实现主体。
#ifndef __MYFUNC_H__
#define __MYFUNC_H__
#if defined MYFUNC_EXPORT
#define EXPOSE_API __declspec(dllexport)
#else
#define EXPOSE_API __declspec(dllimport)
#endif
\\ better to have namespace to avoid conflicts with other libs
namespace myspace
{
EXPOSE_API void myCall(const float * const array, const int numelements);
}
#endif
C# 代码需要如下所示的内容:
[DllImport("myfunc.dll",EntryPoint="?myCall@CUnmanagedTestClass@@QAEXH@Z",CallingConvention=CallingConvention.ThisCall)]
static public extern void myCall(float* array, int numelements);
我相信,上面的语句应该写在所有你想使用这个函数的.cpp文件中。
此外,您可能在“EntryPoint”属性中观察到的疯狂字符串是带有编码参数的函数的损坏名称。你不需要理解它是什么,你只需要把它放在入口点即可。从 http://www.dependencywalker.com/ 获取依赖步行器并打开您刚刚创建的 dll,您必须稍微浏览一下,但这会给您通过 dll 公开的函数的损坏名称。
就是这样,这就是我在为一位使用 C# 的客户使用 ArrayFire(用于基于 GPU 的计算的 CUDA/OpenCL 库)时所做的事情。它工作正常,但我必须在 C# 中放置包含这些函数调用的不安全和固定语句,以便在函数处理它时内存不会移动。
我敢打赌有多种方法可以做到这一点,但这种方法将所有不需要的东西保留在函数调用(CUDA)中,并且当函数返回时,结果位于 CPU 内存空间中。
关于c# - 将外部 C/C++ CUDA 库与 C# 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19504011/