ManagedCUDA非常适合这类事情。首先,您需要按照文档中的说明设置您的 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。