除非必须,否则我认为制作单独的可执行文件不是一个好主意。在您的情况下,您可以制作一个 CPU 调度程序。我最近为 GCC 和 Visual Studio 做了这个。
假设您有一个调用product
SSE 和 AVX 的函数。您将 SSE 版本放在文件 product_SSE.cpp 中,将 AVX2 版本放在文件 product_AVX2.cpp 中。您分别编译每一个(例如,使用-msse2
and -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
orproduct_SSE
然后从函数指针调用函数。第二次调用product
它会直接跳转到product_AVX2
or product_SSE
。这样您就不必拥有单独的可执行文件。