【发布时间】: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 的操作系统是什么