【问题标题】:LLVM front end register class error OpenCL -- GPU targetLLVM 前端寄存器类错误 OpenCL -- GPU 目标
【发布时间】:2014-03-25 21:57:46
【问题描述】:

我最近在使用我的 LLVM_IR 通行证编译 OpenCL 内核文件时遇到了这个错误:

aoc: ../../../TargetRegisterInfo.cpp:89: const llvm::TargetRegisterClass* llvm::TargetRegisterInfo::getMinimalPhysRegClass(unsigned int, llvm::EVT) const: Assertion `BestRC && "Couldn't find the register class"' failed.

我不确定这意味着什么。我从文档中读到的内容没有多大意义。基本上这意味着后端不知道将什么类型放入寄存器?

有人知道这个错误是什么意思吗?

它出现在各种内核中,似乎没有明确的模式,我可以举例说明。如果需要,我可以发布更多详细信息,但实际上我只想知道错误告诉我什么。

提前感谢您的帮助。

更新: LLVM 中的这个命令似乎导致了这个问题:

AllocaInst* llvm::IRBuilder< preserveNames, T, Inserter >::CreateAlloca(Type * Ty, Value * ArraySize = 0,const Twine &  Name = "")

当我以这种方式进行非特定分配时,它会产生此错误。我使用这个命令的原因是有时在内核中会有一个常量存储值。由于 LLVM 通常需要一个值,我需要一种转换它的方法。所以我做了一个立即存储和加载的分配。这是另一位 SOF 用户建议的。有谁知道在 LLVM 中将常量转换为值的另一种方法?

谢谢大家。

好吧,这似乎是一个常规的:

Value *new_val = dyn_cast<Value>(old_val);

工作得很好。希望这些知识对其他人有所帮助。

UPDATE3:从头开始。动态转换不会将常量转换为值类型。所以如果有人知道怎么做,请告诉我。

【问题讨论】:

  • 发生这种情况的内核是否分配更多内存或执行特定命令?您可以关闭优化并查看是否可以吗?什么 OpenCL 设备?
  • 另外,它是在所有 OpenCL 设备上执行此操作还是仅在一个设备上执行此操作?
  • @Austin:它既不会发生在特定命令上,也不会发生在内存分配上。目标是 AMD GPGPU 我没有在任何其他目标硬件上尝试过它,因为这完全是我正在研究的。
  • 关闭内核优化会怎样? AMD 平台可以针对 Intel CPU,因此很容易在另一台设备上对其进行测试。
  • 它是否提供堆栈转储,您的设备中安装了 llvm 或 clang 的操作系统是什么

标签: opencl llvm gpgpu llvm-ir


【解决方案1】:

我承认我不明白你得到的断言错误。然而:

我使用这个命令的原因是有时在内核中会有一个存储值是一个常量。由于 LLVM 通常需要一个值,我需要一种转换它的方法。所以我做了一个立即存储和加载的分配。

这对我来说没有意义:

  1. 任何llvm::Constant 已经是llvm::Value
  2. 存储一个值然后将其加载回来似乎是一项昂贵的操作...

【讨论】:

  • 我知道它应该起作用是有道理的。它继承自从 Value 继承的 User。但是,当我尝试将它用作 CreateStore() 中的值时,它会发出一个错误,指出操作数需要是值类型的 Ptr。
  • @user2765828 可能会编辑问题以包含生成错误的更完整的代码 sn-p。
  • 我想此时我将创建一个新问题,专门针对常量到值问题。这是我所有其他错误的根源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多