在非haswell处理器上禁用AVX2功能
Disable AVX2 functions on non-Haswell processors
我写了一些AVX2代码在Haswell i7处理器上运行。在非haswell处理器上也使用相同的代码库,其中相同的代码应该替换为它们的SSE等效代码。我想知道编译器是否有办法忽略非haswell处理器上的AVX2指令。我需要这样的内容:
public void useSSEorAVX(...){
IF (compiler directive detected AVX2)
AVX2 code (this part is ready)
ELSE
SSE code (this part is also ready)
}
}
现在我在编译之前注释掉了相关的代码,但是必须有一些更有效的方法来做到这一点。我正在使用Ubuntu和gcc。谢谢你的帮助。
我不认为这是一个好主意单独执行,除非你不得不。在您的示例中,您可以创建一个CPU调度程序。我最近为GCC和Visual studio做了这个。
假设您有一个用于SSE和AVX的名为product
的函数。将SSE版本放在文件product_SSE.cpp中,将AVX2版本放在文件product_AVX2.cpp中。分别编译每一个(例如用-msse2
和-mavx2
)。然后创建一个这样的模块:
extern "C" void product_SSE(float *a, float *b, float *c, int n);
extern "C" void product_AVX2(float *a, float *b, float *c, int n);
void product_dispatch(float *a, float *b, float *c, int n);
void (*fp)(float* a, float *b, float *c, int n) = product_dispatch;
inline void product_dispatch(float *a, float *b, float *c, int n) {
int iset = instrset_detect();
if(iset==8) {
fp = product_AVX2
}
else {
fp = product_SSE
}
fp(a,b,c,n);
}
inline void product(float *a, float *b, float*c, int bs) {
fp(a,b,c,n);
}
您使用较低的通用指令集(例如使用SSE2)编译该模块。现在,当你调用product时,它首先调用product_dispatch
,将函数指针fp
设置为product_AVX2
或product_SSE
,然后从函数指针调用函数。第二次调用product
时,它直接跳转到product_AVX2
或product_SSE
。这样,您就不必拥有单独的可执行文件。
如果您只想在编译时执行此操作,则可以这样做:
#ifdef __AVX2__
// AVX2 code
#elif __SSE__
// SSE code
#else
// scalar code
#endif
请注意,当您使用gcc -mavx2 ...
编译时,__AVX2__
将自动定义。__SSE__
也一样。(还请注意,您可以使用咒语gcc -dM -E -mavx2 - < /dev/null
检查编译器为任何给定的命令行切换预定义的内容。)
如果你想做运行时调度那就有点复杂了
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 在非haswell处理器上禁用AVX2功能