我是软件包的首席开发人员,其性能至关重要。当某些设施可用时,所述软件的性能可以大大提高,例如:
我处在一种情况,我觉得很难决定最明智的做法。我看待事物的方式,这些是我的选择:
我目前倾向于选项2,因为这是我希望大多数用户欣赏的内容。另外,在默认行为中迎合新手可能更有意义。我知道这在可移植性方面构成了一个重要的罪恶。你们认为最明智的做法是什么?
我的困境是否有任何我不知道的解决方案?
答案 0 :(得分:1)
这个问题本质上是主观的,但我认为选项(1)是更好的选择 - 因为你指定"表现至关重要。"
软件包的大多数用户(即发行版用户)都会对预构建的软件包或使用默认选项的源代码构建感到满意。如果性能 至关重要,那么期望用户熟悉编译器标志和configure ...
用法是合理的。如果用户没有被性能所困扰,或者懒得在分发中阅读简单的README
,那么默认构建应该只是有用的东西 - 它不需要是最佳的。
我不确定交叉编译的缺点 - 似乎您可能会混淆host
和target
,因为target
在构建交叉编译器之外很少见工具。正确使用host
三联与config.guess
一起提供了大量有用的信息。例如:
case $host_cpu in
x86_64) ... we always have SSE available ... ;;
esac
现在让我们说-march=core2
为[cross]编译器标志:
#if defined (__SSE3__)
#include <pmmintrin.h> /* (SSE3 Intel intrinsics)
#endif
即使使用交叉编译器,也能正常工作。 (虽然现在<immintrin.h>
更可取)
简而言之,新手用户获得了新手。您无法针对每种可能的主机和环境组合进行优化,但您可以提供选项。
答案 1 :(得分:0)
无论SSE库的可用性如何,您都不能构建非优化的二进制文件,并在运行时确定将使用哪些版本?如果使用动态链接,则不应在运行时导致任何性能提升或开销。