C# 在CUDAfy中传递结构中的数组

C# 在CUDAfy中传递结构中的数组,c#,cuda,marshalling,cuda.net,cudafy.net,C#,Cuda,Marshalling,Cuda.net,Cudafy.net,使用VS 2012、.NET 4.5、64位和CUDAfy 1.12,我有以下概念证明 使用系统; 使用System.Runtime.InteropServices; 使用Cudafy; 使用Cudafy.Host; 使用Cudafy.Translator; 名称空间测试 { [Cudafy(eCudafyType.Struct)] [StructLayout(LayoutKind.Sequential)] 公共结构ChildStruct { [Marshallas(UnmanagedType.

使用VS 2012、.NET 4.5、64位和CUDAfy 1.12,我有以下概念证明

使用系统;
使用System.Runtime.InteropServices;
使用Cudafy;
使用Cudafy.Host;
使用Cudafy.Translator;
名称空间测试
{
[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
公共结构ChildStruct
{
[Marshallas(UnmanagedType.LPArray)]
公众花车[]法拉利;
公共长线长度;
}
[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
公共结构ParentStruct
{
公共儿童结构儿童;
}
公共课程
{
[库达菲]
公共静态void内核函数(GThread GThread,ParentStruct parent)
{
长长度=parent.Child.FArrayLength;
}
公共静态void Main(字符串[]args)
{
var模块=CudafyTranslator.Cudafy(
ePlatform.x64,eArchitecture.sm_35,
新[]{typeof(ChildStruct)、typeof(ParentStruct)、typeof(Program)};
var dev=CudafyHost.GetDevice();
dev.LoadModule(模块);
浮动[]主机浮动=新浮动[10];
对于(inti=0;i
当程序运行时,我在开发启动时遇到以下错误:

类型“Test.ParentStruct”不能作为非托管结构封送;无法计算有意义的大小或偏移量。

如果我从ChildStruct中删除float数组,它将按预期工作

我过去曾在C/C++/Cli和CUDA C中工作过,我知道错误的本质。此错误的一些解决方案建议使用
marshallas
size
参数手动设置结构大小,但这是不可能的,因为结构中的类型多种多样

我查看了生成的.cu文件,它将浮点数组生成为
float*
,这正是我所期望的


有没有办法将结构中的数组传递给内核?如果没有最好的第二种选择是什么?这个问题在CUDA C中不存在,它的存在只是因为我们从CLR进行封送。

我花了很长时间阅读CUDAfy的源代码,看看是否有解决这个问题的方法

CUDAfy试图使.NET开发人员的工作变得过于简单,并使他们远离
IntPtr
和其他指针概念。然而,抽象的层次使得如果不对这个库的工作方式进行重大的重构,就很难找到这个问题的答案


无法在结构中发送浮点数组是一个阻碍。最后,我对CUDA运行时进行了PInvoke,而没有使用CUDAfy。

这是.NET的限制,而不是CUDAfy。数据必须是可空袭的,而非固定大小的数组则不是。这是有效的,并且基于codeplex上的CUDAfy单元测试:

[Cudafy]
[StructLayout(LayoutKind.Sequential, Size=64, CharSet = CharSet.Unicode)]
public unsafe struct PrimitiveStruct
{
    public fixed sbyte Message[32];
    public fixed char MessageChars[16];
}

也没有理由显式存储数组长度,因为您可以在设备代码中使用length属性。

我看过这段代码,但是它处理的是固定大小的数组,问题是可变大小的数组。只需设置最大大小,清空rest是否也意味着列表不可能与CUDAFY一起使用?首先,它需要是您正在发送的数组,而不是列表。但是,我不认为这是一个问题,除非你的结构有一个数组。该结构只包含datetime、字符串decimal等。我感觉小数可能是个问题,尽管我在“CUDA示例”中没有看到它1关于您的评论和问题(顺便说一句;)或者你也可以通过另一个阵列发送psuedo ptr,作为C#和C++/ASM开发人员。我经常使用它,IMO C#集成现在需要这样的解决方案;解耦内存管理。