我正在研究并行算法优化(稀疏矩阵)和寄存器阻塞。我想找到机器中可用的寄存器的数量和类型(特别是浮点寄存器,然后是其他寄存器),以便根据可用寄存器调整我的代码并使其与平台无关。有没有办法在 C++ 中做到这一点?
谢谢你。小号
一般来说,编译器确实知道这类东西(以及如何最好地使用它),所以我有点惊讶你认为你可以比编译器更聪明——除非我有非常高的领域知识,并开始编写汇编代码,我很少比编译器更聪明。
由于编写汇编代码是高度不可移植的,我不认为这是使用关于有多少寄存器等知识来优化代码的解决方案。很难知道编译器如何使用寄存器。如果你有int x = y + z;
一个简单的例子,它需要多少个寄存器?取决于编译器——它可以使用无、一、二、三、四、五或六,而不会低于最佳寄存器使用率——这完全取决于编译器如何决定处理事物、机器架构、变量的位置/方式被存储等。如果我们更改int
为,同样的原则也适用于浮点寄存器的数量double
. 没有明显的方法可以说明此语句中使用了多少寄存器(尽管我怀疑不超过三个 - 但是,它可能是零或一,取决于编译器决定做什么)。
如果您了解处理器架构以及编译器如何处理某些类型的代码,则可能会做一些巧妙的技巧——但这也假设编译器在下一个版本中不会改变其行为。但是如果你知道它是什么处理器架构,那么你也知道各种寄存器的数量......
恐怕没有简单的便携式解决方案。
有许多因素会影响给定计算机的最佳块大小。发现良好配置的一种方法是自动运行一系列基准测试,并使用结果在运行时调整代码。
另一种方法是根据一些基准测试的结果自动调整源代码。这就是自动调谐线性代数软件(ATLAS) 所做的。