AVX512 log2或pow指令

时间:2017-02-07 09:36:19

标签: x86 pow xeon-phi avx512

我需要一个AVX512 double pow(double, int n)函数(我需要它来进行二项分布计算,这需要精确)。对于拥有AVX512ER的Knights Landing,我特别喜欢这个。获得这个的一种方法是

x^n = exp2(log2(x)*n)

Knights Corner有vlog2ps指令(_mm512_log2_ps内在的)和vexp223ps指令(_mm512_exp223_ps intrinsic),所以至少我可以float pow(float, float)执行log2指令。

然而,在Knights Landing中,我找不到vexp2pd指令。我确实在AVX512ER中找到了_mm512_exp2a23_pd指令(log2内在的)。我觉得奇怪的是Knights Corner有一个pow(double, n)指令,但Knights Landing更新更好。

目前我已实施log2 using repeated squaring但我认为如果我有//AVX2 but easy to convert to AVX512 with mask registers static __m256d pown_AVX2(__m256d base, __m256i exp) { __m256d result = _mm256_set1_pd(1.0); int mask = _mm256_testz_si256(exp, exp); __m256i onei = _mm256_set1_epi64x(1); __m256d onef = _mm256_set1_pd(1.0); while(!mask) { __m256i t1 = _mm256_and_si256(exp, onei); __m256i t2 = _mm256_cmpeq_epi64(t1, _mm256_setzero_si256()); __m256d t3 = _mm256_blendv_pd(base, onef, _mm256_castsi256_pd(t2)); result = _mm256_mul_pd(result, t3); exp = _mm256_srli_epi64(exp, 1); base = _mm256_mul_pd(base,base); mask = _mm256_testz_si256(exp, exp); } return result; } 指令会更有效率。

double pow(double, int n)

使用AVX512和AVX512ER获得log2比重复平方有更高效的算法吗?是否有一种简单的方法(例如,使用一些指令)来获取static __m512d pown_AVX512(__m512d base, __m512i pexp) { __m512d result = _mm512_set1_pd(1.0); __m512i onei = _mm512_set1_epi32(1); __mmask8 mask; do { __m512i t1 = _mm512_and_epi32(pexp, onei); __mmask8 mask2 = _mm512_cmp_epi32_mask(onei, t1, 0); result = _mm512_mask_mul_pd(result, mask2, result, base); pexp = _mm512_srli_epi32(pexp, 1); base = _mm512_mul_pd(base,base); mask = _mm512_test_epi32_mask(pexp, pexp); } while(mask); return result; }

这是使用重复平方的AVX512F版本

__m256i

指数是int32而不是int64。理想情况下,我会使用<input id="savePath" type="file" webkitdirectory /> 作为八个整数。但是,这需要AVX512VL,它将512b操作扩展到256b和128b,但KNL没有AVX512VL。相反,我在32位整数上使用512b操作,然后将16b掩码转换为8b。

0 个答案:

没有答案