Disable AVX2 functions on non-Haswell processors

前端 未结 2 1231
终归单人心
终归单人心 2021-02-11 02:29

I have written some AVX2 code to run on a Haswell i7 processor. The same codebase is also used on non-Haswell processors, where the same code should be replaced with their SSE e

2条回答
  •  时光说笑
    2021-02-11 02:56

    I don't think it's a good idea to make separate executable unless you have to. In your case you can make a CPU dispatcher. I did this recently for GCC and Visual studio.

    Let's assume you have a function called product for SSE and AVX. You put the SSE version in a file product_SSE.cpp and the AVX2 version in a file product_AVX2.cpp. You compile each one separately (e.g. with -msse2 and -mavx2). Then make a module like this:

    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);
    }
    

    You compile that module with the lower common instruction set (e.g. with SSE2). Now when you call product it first calls product_dispatch sets the function pointer fpto either product_AVX2 or product_SSE and then calls the function from the function pointer. The second time you call productit jumps right to product_AVX2or product_SSE. This way you don't have to have separate executable.

提交回复
热议问题