【问题标题】:clrobj(<class name>) does not have llvm when passing array of struct to GPU Kernel (ALEA Library)将结构数组传递给 GPU 内核(ALEA 库)时,clrobj(<class name>) 没有 llvm
【发布时间】:2017-05-22 20:51:18
【问题描述】:

我在尝试使用 ALEA 库将结构数组传递给 NVIDIA 内核的代码中收到“Fody/Alea.CUDA:clrobj(cGPU) 没有 llvm”构建错误。这是我的代码的简化版本。我删除了输出收集功能以保持代码简单。我现在只需要能够将结构数组发送到 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);
        }
      }
    }
  }
}

【问题讨论】:

  • 你的数据是类,是引用类型。尝试使用结构。引用类型不太适合 Gpu,因为它需要在堆上分配小内存。
  • 当然。你说的对。我在想我已经将它声明为结构。很好,我在这里分享了代码。将 cGPU 定义为 struct 后,错误消失了,现在我可以向 GPU 发送大量的 struct 数组。谢谢你。到目前为止,我的大部分编码问题都只是一个词。又来了。我是stackoverflow的新手。我想您需要将此评论写为答案,以便我可以选择它作为我问题的答案。
  • 很好,我复制了该文本作为答案。

标签: c# arrays struct cuda aleagpu


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我没有注意到我正在使用类。一旦我将其更改为结构,错误就消失了。
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 2018-05-21
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
相关资源
最近更新 更多