2016-06-07 28 views
5

如何根据主机处理器/操作系统创建可在SSE,AVX和AVX2代码路径之间动态切换的库?我正在使用Agner Fog的VCL(矢量类库)并使用GCC for Linux进行编译。使用Agner的矢量类库编译多架构代码

+0

听起来像是一个makefile解决方案。您在构建时了解主处理器/操作系统。运行时无需这样做。 – duffymo

+0

对于那些阅读这个问题但不限于VCL和GCC的人来说,英特尔编译器有一系列“-axcode”编译标志,它们可以生成多个针对多个指令集体系结构的代码路径(例如,针对SSE ,AVX和AVX-512)在相同的库/可执行文件中,并在运行时自动(不可见)地在它们之间进行分派。看看这个页面的底部:https://software.intel.com/en-us/blogs/2016/01/13/compiling-for-the-intel-xeon-phi-processor-x200-and-the- intel-avx-512-isa – zam

回答

3

汇编指令cpuid可以在运行时为您提供此信息。有人已经基于此创建了一个图书馆到what you need

您可以创建一个函数调度表,并根据使用此代码的查询结果填充正确的代码路径函数。

UPDATE:(答案在评论质疑)

要在第一时间创建不同的代码路径,则需要分别编制不同的代码路径,然后将它们链接在一起。对于每一个,您都可以在编译行中指定使用各种-march开关所需的架构。

+0

问题是我不能(很简单地)创建不同的代码路径,因为VCL使用内部函数(不是内联汇编),编译器会将其转换为编译器参数中指定的任何指令集。我想我应该提到我正在使用GCC。 –

+0

查看更新的答案 – Smeeheey

+0

如何为编译器的每次调用调整函数名称? –

3

请参见“指令集和CPU调度”部分in the manual to the Vector Class Library。在这一节中写入昂纳

文件 dispatch_example.cpp示出了如何使一个CPU调度 ,其选择适当的代码版本的示例。

阅读the source codedistpatch_example.cpp。在文件开始处,您应该看到评论

# Compile dispatch_example.cpp five times for different instruction sets: 
| 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 -od7.o 
| g++ -O3 -mavx2 -c dispatch_example.cpp -od8.o 
| g++ -O3 -mavx512f -c dispatch_example.cpp -od9.o 
| g++ -O3 -msse2 -otest instrset_detect.cpp d2.o d5.o d7.o d8.o d9.o 
| ./test 

该文件instrset_detect.cpp。你也应该阅读源代码。这就是所谓的CPUID。

Here是我对CPU调度程序的一些问题和答案的总结,但不是全部。

+0

'dispatch_example.cpp'调用在'instrset.h'中声明并在'instrset_detect.cpp'中定义的'instrset_detect'。 –

+0

对不起,没关系 –