C# 将结构数组传递给GPU内核(ALEA库)时,clrobj(<;类名>;)没有llvm 我得到了“Fodi/Alea. CUDA:CLBROJ(CGPU)没有LLVM”的代码错误,在其中我尝试使用ALEA库将结构数组传递到英伟达内核。这是我的代码的简化版本。为了使代码简单,我删除了输出收集功能。我现在只需要能够将struct数组发送到GPU using Alea.CUDA; using Alea.CUDA.Utilities; using Alea.CUDA.IL; namespace GPUProgramming { public class cGPU { public int Slice; public float FloatValue; } [AOTCompile(AOTOnly = true)] public class TestModule : ILGPUModule { public TestModule(GPUModuleTarget target) : base(target) { } const int blockSize = 64; [Kernel] public void Kernel2(deviceptr<cGPU> Data, int n) { var start = blockIdx.x * blockDim.x + threadIdx.x; int ind = threadIdx.x; var sharedSlice = __shared__.Array<int>(64); var sharedFloatValue = __shared__.Array<float>(64); if (ind < n && start < n) { sharedSlice[ind] = Data[start].Slice; sharedFloatValue[ind] = Data[start].FloatValue; Intrinsic.__syncthreads(); } } public void Test2(deviceptr<cGPU> Data, int n, int NumOfBlocks) { var GridDim = new dim3(NumOfBlocks, 1); var BlockDim = new dim3(64, 1); try { var lp = new LaunchParam(GridDim, BlockDim); GPULaunch(Kernel2, lp, Data, n); } catch (CUDAInterop.CUDAException x) { var code = x.Data0; Console.WriteLine("ErrorCode = {0}", code); } } public void Test2(cGPU[] Data) { int NumOfBlocks = Common.divup(Data.Length, blockSize); using (var d_Slice = GPUWorker.Malloc(Data)) { try { Test_Kernel2(d_Slice.Ptr, Data.Length, NumOfBlocks); } catch (CUDAInterop.CUDAException x) { var code = x.Data0; Console.WriteLine("ErrorCode = {0}", x.Data0); } } } } } 使用Alea.CUDA; 使用Alea.CUDA.Utilities; 使用Alea.CUDA.IL; 命名空间编程 { 公共类cGPU { 公共int切片; 公众价值; } [AOTComile(AOTOnly=true)] 公共类测试模块:ILGPUModule { 公共测试模块(GPUModuleTarget):基本(目标) { } const int blockSize=64; [内核] public void Kernel2(deviceptr数据,int n) { var start=blockIdx.x*blockDim.x+threadIdx.x; int ind=threadIdx.x; var sharedSlice=\uuuuuuuuuuuuuuuuuuuuu共享数组(64); var sharedFloatValue=\uuuu shared\uuuu.Array(64); 如果(ind

C# 将结构数组传递给GPU内核(ALEA库)时,clrobj(<;类名>;)没有llvm 我得到了“Fodi/Alea. CUDA:CLBROJ(CGPU)没有LLVM”的代码错误,在其中我尝试使用ALEA库将结构数组传递到英伟达内核。这是我的代码的简化版本。为了使代码简单,我删除了输出收集功能。我现在只需要能够将struct数组发送到GPU using Alea.CUDA; using Alea.CUDA.Utilities; using Alea.CUDA.IL; namespace GPUProgramming { public class cGPU { public int Slice; public float FloatValue; } [AOTCompile(AOTOnly = true)] public class TestModule : ILGPUModule { public TestModule(GPUModuleTarget target) : base(target) { } const int blockSize = 64; [Kernel] public void Kernel2(deviceptr<cGPU> Data, int n) { var start = blockIdx.x * blockDim.x + threadIdx.x; int ind = threadIdx.x; var sharedSlice = __shared__.Array<int>(64); var sharedFloatValue = __shared__.Array<float>(64); if (ind < n && start < n) { sharedSlice[ind] = Data[start].Slice; sharedFloatValue[ind] = Data[start].FloatValue; Intrinsic.__syncthreads(); } } public void Test2(deviceptr<cGPU> Data, int n, int NumOfBlocks) { var GridDim = new dim3(NumOfBlocks, 1); var BlockDim = new dim3(64, 1); try { var lp = new LaunchParam(GridDim, BlockDim); GPULaunch(Kernel2, lp, Data, n); } catch (CUDAInterop.CUDAException x) { var code = x.Data0; Console.WriteLine("ErrorCode = {0}", code); } } public void Test2(cGPU[] Data) { int NumOfBlocks = Common.divup(Data.Length, blockSize); using (var d_Slice = GPUWorker.Malloc(Data)) { try { Test_Kernel2(d_Slice.Ptr, Data.Length, NumOfBlocks); } catch (CUDAInterop.CUDAException x) { var code = x.Data0; Console.WriteLine("ErrorCode = {0}", x.Data0); } } } } } 使用Alea.CUDA; 使用Alea.CUDA.Utilities; 使用Alea.CUDA.IL; 命名空间编程 { 公共类cGPU { 公共int切片; 公众价值; } [AOTComile(AOTOnly=true)] 公共类测试模块:ILGPUModule { 公共测试模块(GPUModuleTarget):基本(目标) { } const int blockSize=64; [内核] public void Kernel2(deviceptr数据,int n) { var start=blockIdx.x*blockDim.x+threadIdx.x; int ind=threadIdx.x; var sharedSlice=\uuuuuuuuuuuuuuuuuuuuu共享数组(64); var sharedFloatValue=\uuuu shared\uuuu.Array(64); 如果(ind,c#,arrays,struct,cuda,aleagpu,C#,Arrays,Struct,Cuda,Aleagpu,您的数据是类,这是引用类型。尝试使用struct。引用类型不适合Gpu,因为它需要在堆上分配小内存。您的数据是类,这是引用类型。尝试使用struct。引用类型不适合Gpu,因为它需要在堆上分配小内存。你是对的。我想我已经把它声明为struct了。很好,我在这里分享了代码。在将cGPU定义为struct之后,错误消失了,现在我可以向GPU发送一个巨大的struct数组。非常感谢。到目前为止,我的大多数编码问题都只有一个词。再来一次。我是新来的。我想你需要写下这个评论作为答案,这样我就可以选择它作为

您的数据是类,这是引用类型。尝试使用struct。引用类型不适合Gpu,因为它需要在堆上分配小内存。

您的数据是类,这是引用类型。尝试使用struct。引用类型不适合Gpu,因为它需要在堆上分配小内存。你是对的。我想我已经把它声明为struct了。很好,我在这里分享了代码。在将cGPU定义为struct之后,错误消失了,现在我可以向GPU发送一个巨大的struct数组。非常感谢。到目前为止,我的大多数编码问题都只有一个词。再来一次。我是新来的。我想你需要写下这个评论作为答案,这样我就可以选择它作为我问题的答案。很好,我复制了这个文本作为答案。谢谢你的回答。我没有注意到我在上课。我把它改成struct后,错误就消失了。