c++ - 在 C++ 中以编程方式查找浮点寄存器的数量

标签 c++ c assembly

<分区>

我正在研究并行算法优化(稀疏矩阵)和寄存器阻塞。我想找到机器中可用的寄存器(特别是浮点寄存器,然后是其他寄存器)的数量和类型,以便根据可用寄存器调整我的代码并使其与平台无关。有什么办法可以在 C++ 中做到这一点吗?

谢谢。 早安

最佳答案

一般来说,编译器确实知道这类东西(以及如何最好地使用它),所以我有点惊讶你认为你可以超越编译器 - 除非我有非常高的领域知识,并开始编写汇编程序代码,我很少比编译器聪明。

由于编写汇编代码是高度不可移植的,我认为这不算是使用有关多少寄存器等知识来优化代码的解决方案。很难知道编译器如何使用寄存器。如果你有 int x = y + z; 作为一个简单的例子,它需要多少个寄存器?取决于编译器——它可以不使用、一、二、三、四、五或六,而不会低于最佳寄存器使用——这完全取决于编译器决定如何处理事物、机器架构、变量在哪里/如何如果我们将 int 更改为 double,则相同的原则适用于浮点寄存器的数量。没有明显的方法可以判断此语句中使用了多少个寄存器(尽管我怀疑不超过三个 - 但是,它可能是零或一个,具体取决于编译器决定做什么)。

如果您了解处理器体系结构以及编译器如何处理某些类型的代码,则可能会采取一些巧妙的技巧 - 但前提是编译器不会在下一个版本中更改其行为。但是如果你知道它是什么处理器架构,那么你也就知道了各种寄存器的数量……

关于c++ - 在 C++ 中以编程方式查找浮点寄存器的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171143/

相关文章:

c++ - 向标准模板的特化添加新方法(std::vector、std::list...)

c++ - 如何查看我发送的流 libvlc C/C++

c - 如何使此代码适用于大输入值?

assembly - 汇编语言有多不可移植,/真的/?

gcc - 如何在x86平台上使用gcc将内存范围声明为不可缓存?

c++ - dynamic_cast 理解

c++ - 使用命令行参数控制程序中的打印输出

c++ - volatile 是在 C/C++ 中生成单字节原子的正确方法吗?

c - 什么是 'undefined reference to ` pow''

assembly - 不使用 MOVZX/MOVSX 的汇编中的零/符号扩展