2

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

我还是这方面的新手。我听说我可以在我的代码中添加外部 DLL。

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

这可能吗,如果可以,我怎么能做到这一点?

干杯

4

1 回答 1

2

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

C++ DLL 代码,以下进入头文件,您必须在 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/获取依赖 walker并打开您刚刚创建的 dll,您将不得不浏览一下,但这会给您这个通过您的 dll 公开的函数的错位名称。

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

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

于 2013-10-22T14:01:10.720 回答