我将举一个例子来问我的问题。现在我有了一个名为do_something()的函数。
它有三个版本:do_something()、do_something_sse3()和do_something_sse4()。当我的程序运行时,它将检测CPU特性(看看它是否支持SSE3或SSE4),并相应地调用这三个版本中的一个。
问题是:当我用GCC构建我的程序时,我必须将-msse4设置为do_something_sse4()来编译(例如,将头文件<smmintrin.h>包括在内)。
但是,如果我设置了-msse4,那么gcc可以使用SSE4指令,而do_something_sse3()中的一些本质元素也被翻译成了一些SSE4指令。因此,如果我的程序运行在只支持SSE3 (但不支持SSE4)的CPU上,则在调用do_something_sse3()时会导致“非法指令”。
也许我有一些不好的练习。你能给我一些建议吗?谢谢。
发布于 2013-03-23 09:16:20
我认为神秘的提示很好,但是如果您真的想在一个文件中这样做,可以使用适当的语用学,例如:
#pragma GCC target("sse4.1")GCC 4.4是需要的。
发布于 2013-03-25 08:38:40
我认为您想要构建所谓的"CPU调度器“。我有一份工作(据我所知)为GCC工作,但还没有与Visual一起工作。
我会查看Agner的向量类和文件dispatch_example.cpp http://www.agner.org/optimize/#vectorclass
g++ -O3 -msse2 -c dispatch_example.cpp -od2.o
g++ -O3 -msse4.1 -c dispatch_example.cpp -od5.o
g++ -O3 -mavx -c dispatch_example.cpp -od8.o
g++ -O3 -msse2 instrset_detect.cpp d2.o d5.o d8.o发布于 2013-03-25 05:04:37
下面是为每个优化设置编译一个单独的对象文件的示例:http://notabs.org/lfsr/software/index.htm
但是,当使用gcc链路时间优化(-flto)时,即使这种方法也失败了。那么,如何为不同的处理器构建一个完全优化的可执行文件呢?我能找到的唯一解决方案是使用include指令使C文件表现为一个编译单元,这样就不需要-flto了。下面是一个使用该方法的示例:http://notabs.org/blcutil/index.htm
https://stackoverflow.com/questions/15584983
复制相似问题