c# - 将外部 C/C++ CUDA 库与 C# 结合使用

标签 c# c++ dll cuda wrapper

我想用 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/

相关文章:

c++ - 将参数从 C++ 中的 DLL 传递给函数

c# - OutOfMemoryException 仅在使用 VS2010 编译时在 Release 模式下出现?

c# - 此线程使用此 ConcurrentDictionary 和 AddOrUpdate 方法是否安全?

c# - 将指针(即 int[])传递给 DLL 时, "fixed"真的能保证任何事情吗?

c# - 微软是否更改了随机默认种子?

c++ - 为侵入式容器的迭代器分配新值

c++ - 什么是 Blob ?

c++ - 存储二叉搜索树节点中某些叶子的数量(优化)

c - 如何在 C++ 中创建 DLL 库,然后在 C 项目 VisualStudio 中使用它?

c++ - 在非VS项目中包含VS DLL