除非必须,否则我认为将可执行文件分开不是一个好主意。在您的情况下,您可以制作一个CPU调度程序。我最近为GCC和Visual Studio做过这个。
让我们假设您有一个名为product
的函数用于SSE和AVX。将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。这样你就不需要有单独的可执行文件。