C# C中结构中嵌入结构的编组数组
我正在使用CUDAfy.NET,希望将结构中的结构数组传递给设备 我已用c语言声明,如下所示:C# C中结构中嵌入结构的编组数组,c#,structure,cudafy.net,C#,Structure,Cudafy.net,我正在使用CUDAfy.NET,希望将结构中的结构数组传递给设备 我已用c语言声明,如下所示: [Cudafy(eCudafyType.Struct)] [StructLayout(LayoutKind.Sequential)] public struct A { [MarshalAs(UnmanagedType.ByValArray, ArraySubType= UnmanagedType.Struct, SizeConst = 3)] public B[] ba; } [C
[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
public struct A
{
[MarshalAs(UnmanagedType.ByValArray, ArraySubType= UnmanagedType.Struct, SizeConst = 3)]
public B[] ba;
}
[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
public struct B
{
public byte id;
}
这将生成GPU的以下源代码:
struct B
{
unsigned char id;
};
struct A
{
B ba [3];
int baLen0;
};
我在试图将其转换为OpenCL代码时遇到了这个编译错误:
Compilation error: <kernel>:20:2: error: must use 'struct' tag to refer to type 'B'
B ba [3]; int baLen0;
^
struct
我意识到这可能是编组和CUDAfy.NET如何处理结构之间的问题,但是有没有办法解决这个问题
提前感谢我设法修改了CUDAfy Translator中的CUDAfy.NET库。在结构进入内存流后,我添加了:
StreamReader sr = new StreamReader(structs);
String sStructs = sr.ReadToEnd();
String sNewStructs;
foreach(string structName in cm.Types.Values.Select(t => t.Name))
{
while (true)
{
string regex = @"^(?<start>\s+)" + structName + @"(?<end>\s+\S+( \[\d+\])?;)";
sNewStructs = Regex.Replace(sStructs, regex, @"${start}struct " + structName + "${end}", RegexOptions.Multiline);
if (sNewStructs.Length == sStructs.Length)
{
break;
} else
{
sStructs = sNewStructs;
}
}
}
structs = new MemoryStream();
StreamWriter sw = new StreamWriter(structs);
sw.WriteLine(sStructs);
sw.Flush();
这有点草率,但它可以工作,然后我重建了CUDAfy.NET并合并它,替换了我的dll,如果你把struct放在B ba[3]之前;并尝试重新编译?如果我从C/C++中正确地记得,非类型定义的结构在引用该值类型时必须包含struct关键字。我相信这是可行的,但是C/C++代码是生成的中间步骤。如果我能以某种方式通过编组来完成它,或者做出改变,使结构不再必要,我相信这个问题会得到解决。