我正在检查一些模拟,但我的工作可能会在其他依赖于类似处理器功能的计算机上被终止并恢复。例如,使用 SSE4 检查点并在旧的 SSE2 机器上恢复将崩溃。因此,我不希望我的软件使用 SSE2 以上的任何东西(或者可能没有 SSE)。
为确保使用最少的优化功能,我是否需要静态链接手动编译的 glibc 版本和其他库?或者有没有更简单的方法来指定所需的动态库应该使用最少的优化功能?
我正在检查一些模拟,但我的工作可能会在其他依赖于类似处理器功能的计算机上被终止并恢复。例如,使用 SSE4 检查点并在旧的 SSE2 机器上恢复将崩溃。因此,我不希望我的软件使用 SSE2 以上的任何东西(或者可能没有 SSE)。
为确保使用最少的优化功能,我是否需要静态链接手动编译的 glibc 版本和其他库?或者有没有更简单的方法来指定所需的动态库应该使用最少的优化功能?
让我假设您可以运行的作业数量有限(除非您使用网格计算。例如使用 LHCgrid)并且您必须将您的作业排队并且可能在其他人正在运行作业时等待进入队列。在这种情况下,您应该使用能够利用可用于每个作业的硬件的代码。
对于 SSE/AVX,我建议使用 Agner Fog 的矢量类http://www.agner.org/optimize/#vectorclass。这样您就可以使用相同的代码,但只需编译为不同的 SSE/AVX 版本(包括对 AVX2 的支持)。然后,您可以创建一个 CPU 调度程序(在向量类中描述),它确定可用的指令集,然后选择适当的代码路径以获得最佳性能。因此,一项作业在仅具有 SSE2 的系统上运行良好,而另一项作业在具有 AVX2 的系统上运行良好,您不必为每个系统编写不同的代码。
如果您设法让 CPU 调度程序工作,请告诉我。
似乎为最薄弱的环节减慢了整个模拟的速度。您可能想研究ifunc
GCC 的函数属性,它使用特殊的STT_GNU_IFUNC
ELF 符号/部分。本质上,您可以根据处理器进行功能选择。搜索应该会找到一些比 GCC 手册描述更具体的示例。