我正在编写一个针对x64 PC的SOA SIMD数学库,用于游戏引擎。我想在初始化时用编码/ simd宽度专用的功能替换dot
之类的功能。这是为了避免在SSE和AVX之间切换并再次返回时对Intel处理器的内部FPU惩罚。函数指针和自定义页面对齐部分是游戏的名称,但是我可以让运行时在初始化时进行设置,而不是在第一次调用时懒惰吗?
我在这里用伪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