今天,我尝试从C#应用程序启动我的CUDA C / C ++程序。
所以,我在网上做了一些研究,但我没有找到那么多信息。我只看过" GitHub"但是,没有......
所以我有一个内核定义如下: (这是一个例子)
__global__ void kernel(Cartesian a, Cartesian b, Cartesian *c)
使用"笛卡尔" :
class Cartesian
{
public:
double x;
double y;
double z;
};
根据我对managedCUDA的理解。这就像取代CUDA C / C ++程序的主要功能一样。使用lib为我们做的工作"
所以我跟着这个页面的例子:
写下我的C#程序:
创建上下文的部分:(不要真的得到这个"概念")
static void InitKernels()
{
CudaContext cntxt = new CudaContext();
CUmodule cumodule = cntxt.LoadModule(@"C:\Users\stage\Documents\Visual Studio 2013\Projects\Cs_link_test\Cs_link_test\x64\Release\kernel.ptx");
addWithCuda = new CudaKernel("kernel", cumodule, cntxt);
}
启动(我猜)函数的部分并取回内核所做的修改:
static Func<Cartesian, Cartesian, Cartesian> cudaAdd = (a, b) =>
{
CudaDeviceVariable<Cartesian> result_dev;
Cartesian result_host;
addWithCuda.Run(a, b, result_dev.DevicePointer);
result_dev.CopyToHost(ref result_host);
return result_host;
};
从这一部分我不了解任何内容:
static Func<Cartesian, Cartesian, Cartesian> cudaAdd = (a, b) =>
我不熟悉C#(只是说)
所以我的问题来自result_dev和result_host引起的错误;
错误说:
使用未分配的本地变量&#39;结果_ *&#39;
那么,是因为他们没有初始化吗?
如果是这样,为什么result_host会导致错误?它必须从result_dev获取必须由内核修改的数据。
如果没有,如何解决这个问题?
我也想知道,是否可以通过内核函数传递Class参数?如果是这样,如何设置CudaDeviceVariable,导致它说该类型必须是非可空的。这就是我用struct更改类的原因。
答案 0 :(得分:1)
好的..我只是想出了如何解决我的问题。阅读&#34;讨论&#34; https://managedcuda.codeplex.com/discussions/659183部分帮助我做到这一点。那么如何使用managedCUDA继续将struct参数传递给内核?
我做错的第一件事(我猜)是使用Func<T, T, T>
部分。
您必须在.cu文件中声明您的课程,如下所示:
class Cartesian
{
public:
double x;
double y;
double z;
}
在您的.cs文件中也是如此:
[StructLayout(LayoutKind.Sequential)]
struct Cartesian
{
public double x;
public double y;
public double z;
public Cartesian(double x, double y, double z) { this.x = x; this.y = y; this.z = z; }
};
然后你可以根据需要初始化你的内核,我这样做:
static void InitKernels()
{
CudaContext ctx = new CudaContext();
CUmodule cumodule = ctx.LoadModule(@"C:\Users\stage\Documents\Visual Studio 2013\Projects\Cs_link_test\Cs_link_test\x64\Release\kernel.ptx");
kernel = new CudaKernel("kernelPosGeo", cumodule, ctx);
kernel.BlockDimensions = 1024;
kernel.GridDimensions = 614;
}
您需要做的只是使用您想要的参数调用内核。
Cartesian a = new Cartesian(1, 2, 3);
kernel.Run(a);
我想我遇到了问题,因为我使用Func<T, T,T>
但是直到我不再使用它,它似乎更容易。并且Func
的声明最多有2个参数和1个。所以我有一个有4或5个参数的内核,我在这里受到限制......但是现在,没有任何问题。