将外部 C/C++ CUDA 库与 C# 一起使用

本文关键字:一起 库与 CUDA 外部 C++ | 更新日期: 2023-09-27 18:36:15

我想用C#制作使用外部C/C++ CUDA库的程序。

我对此仍然是新手。我听说我可以在我的代码中添加外部 DLL。

我只想解析 CUDA 函数的输出图像,我不想在 C# 层中使用设备指针。

这可能吗,如果是的话,我该如何实现这一目标?

干杯

将外部 C/C++ CUDA 库与 C# 一起使用

一种方法

是使用要使用的 CUDA 库编写一个 C++ dll 应用程序,然后从 C# 代码调用通过 dll 公开的函数。这意味着您正在进入非托管世界,如果有多个线程进入图片,这将很棘手。

C++DLL代码中,以下内容进入标头,您必须在cpp文件中实现body。

#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/获取依赖 walker 并打开您刚刚创建的 dll,您必须浏览一点,但这将为您提供通过 dll 公开的函数的这个损坏名称。

就是这样,这就是我在为使用C#的客户端之一使用ArrayFire(用于基于GPU的计算的CUDA/OpenCL库)时所做的。它工作正常,但我不得不在 C# 中放置包含这些函数调用的不安全和固定语句,以便在函数处理内存时不会移动内存。

我敢打赌有多种方法可以做到这一点,但是这种方法将所有不需要的东西保留在函数调用(CUDA)中,当函数返回时,结果在CPU内存空间中。