Я пишу математическую библиотеку SOA SIMD для компьютеров x64 для игрового движка. Я хочу заменить такие функции, как dot
, на те, которые специализируются по ширине кодирования / simd во время инициализации. Это позволит избежать внутренних штрафов FPU на процессорах Intel при переключении между SSE и AVX и обратно. Указатели функций и настраиваемые разделы, выровненные по страницам, - это название игры, но могу ли я получить время выполнения, чтобы настроить его во время инициализации, а не лениво при первом вызове?
Я думаю, что здесь псевдо C
__cinit // puts function in init section, to be called at cinit
func __cinit select_dot();
f32 *(*dot)(f32 *, f32 *, int); // constant after cinit
f32 *dot32(f32 *, f32 *, int);
f32 *dot128(m128 *, m128 *, int); // 3 encodings: SSE, AVX, AVX512
f32 *dot256(m256 *, m256 *, int); // 2 encodings: AVX, AVX512
f32 *dot512(m512 *, m512 *, int); // 1 encoding: AVX512
// in cinit, repeat for all functions
dot = select_dot() // all calls to dot reroute through us now