Jacob Faibussowitsch <[email protected]> writes: >> working out dispatch in MatCreate_XXX() instead of for each function. > > Or use compiler extensions for multiversioned functions (I recall GCC has > something similar): > https://clang.llvm.org/docs/AttributeReference.html#target > <https://clang.llvm.org/docs/AttributeReference.html#target>
Yes, if you want multiple kernel variants to live in the same source file. https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-target-function-attribute I believe you can do something like the following to specialize "portable" code. static inline void f_portable(size_t n, double *x) { for (size_t i=0; i<n; i++) x[i] += 1.; } void f_haswell(size_t n, double *x) __attribute__((__target__("arch=haswell"))) { f_portable(n, x); } void f_skylakeavx512(size_t n, double *x) __attribute__((__target__("arch=skylake-avx512"))) { f_portable(n, x); }
