星期五, 七月 17, 2015

Aliasing long function names in C++

最近我忽然对 C++ 的 intrinsic 函数感了兴趣。但这些函数名通常很长,而且往往要贴近硬件。一旦需要考虑两种以上的 CPU 特征,调用函数就变得非常麻烦。好在这些函数通常有两个参数,并返回一个参数,这样就可以在文件头一次定义,在自定义的函数中就省略很多#ifdef...#elif...#endif了。示例:

#ifdef __AVX__      // Note: put super set first.
const int L{4}
using mydbl =  __m256d;
using ldptr = __m256d(*)(const double[L]);
using jsptr = __m256d(*)(__m256d, __m256d);

const ldptr dbload = _mm256_load_pd;
const jsptr db_mul = _mm256_mul_pd;
const jsptr db_add = _mm256_add_pd;

#elif __SSE4_1__   // 2 doubles * 8byte * 8bit = 128 bit width
const int L{2};

using mydbl = __m128d;
using ldptr = __m128d(*)(const double[L]);
using jsptr = __m128d(*)(__m128d, 

const ldptr dbload = _mm_load_pd;
const jsptr db_mul = _mm_mul_pd;
const jsptr db_add = _mm_add_pd;
#endif

这样自定义函数中的db_load, mul, 或 add 等函数就可以随条件编译自动匹配了。

没有评论: