如何制作可在C#应用程序中使用的CUDA DLL?

时间:2013-02-22 18:04:38

标签: c# c cuda nvidia

如果你能给我一个简短的教程而不是几句话,那将是件好事。

我的CUDA应用程序正在按我的意愿运行。现在,问题是如何将CUDA代码导出到C#,因为我想在C#中创建前端和其他所有内容。

从这个链接:

http://www.codeproject.com/Articles/9826/How-to-create-a-DLL-library-in-C-and-then-use-it-w

我知道如何用C语言创建一个可以作为Win32 dll导入C#应用程序的库。

但我的问题是,如何制作可以发送到C#并从C#应用程序使用的CUDA应用程序DLL(或其他扩展程序)? 如果有一个CUDA的教程就像C库到C#app的那个教程(上面的链接)那样会很好。

我正在使用Win7 64位,Visual Studio 2010 Ultimate,Cuda Toolikt 5.0和NSight 2.2.012313

1 个答案:

答案 0 :(得分:3)

ManagedCUDA非常适合此类事情。首先,您需要按照documentation中的说明设置Visual Studio项目。

以下是解决方案的示例:

test.cu(编译成test.ptx)

#if !defined(__CUDACC__)
#define __CUDACC__
#include <host_config.h>
#include <device_launch_parameters.h>
#include <device_functions.h>
#include <math_functions.h>
#endif

extern "C"
{
    __global__ void test(float * data)
    {
        float a = data[0];
        float b = data[1];
        float c = data[2];

        data[0] = max(a, max(b, c));
    }
}

这是C#代码:

private static void Test()
{
    using (CudaContext ctx = new CudaContext())
    {

        CudaDeviceVariable<float> d = new CudaDeviceVariable<float>(3);
        CUmodule module = ctx.LoadModulePTX("test.ptx");
        CudaKernel kernel = new CudaKernel("test", module, ctx)
            {
                GridDimensions = new dim3(1, 1),
                BlockDimensions = new dim3(1, 1)
            };
        kernel.Run(d.DevicePointer);
    }
}

这只是一个概念验证,设备内存甚至没有被初始化,结果也没有被读取,但足以说明如何去做。

您可以通过多种方式分发应用程序。在这种情况下,我选择将.cu文件编译为PTX并将其从文件系统加载到C#项目中 您还可以将PTX作为资源直接嵌入到C#应用程序中 你也可以编译成一个cubin并加载或嵌入而不是PTX。