相关疑难解决方法(0)

在AVX2中高效实现log2(__ m256d)

__m256d _mm256_log2_pd (__m256d a)除了英特尔之外,SVML 还没有其他编译器可用,他们表示其性能在AMD处理器上是有缺陷的.在g ++ - 4.8中缺少AVX日志内在函数(_mm256_log_ps)中的一些互联网实现SSE和AVX的SIMD数学库,但它们似乎比AVX2更多的SSE.还有Agner Fog的矢量库,但是它是一个包含更多东西的大型库,它只是向量log2,所以从它的实现中很难找出向量log2操作的基本部分.

那么有人可以解释如何有效地实现log2()4个double数字向量的操作吗?即就是__m256d _mm256_log2_pd (__m256d a)这样,但可用于其他编译器,并且AMD和Intel处理器的效率相当高.

编辑:在我目前的特定情况下,数字是介于0和1之间的概率,而对数用于熵计算:所有i的和的否定P[i]*log(P[i]).浮点指数的P[i]范围很大,因此数字可以接近0.我不确定准确度,因此会考虑以30位尾数开头的任何解决方案,尤其是可调整的解决方案.

EDIT2:这是我到目前为止的实现,基于https://en.wikipedia.org/wiki/Logarithm#Power_series的 "更有效的系列" .怎么改进?(需要提高性能和精度)

namespace {
  const __m256i gDoubleExpMask = _mm256_set1_epi64x(0x7ffULL << 52);
  const __m256i gDoubleExp0 = _mm256_set1_epi64x(1023ULL << 52);
  const __m256i gTo32bitExp = _mm256_set_epi32(0, 0, 0, 0, 6, 4, 2, 0);
  const __m128i gExpNormalizer = _mm_set1_epi32(1023);
  //TODO: some 128-bit variable or two 64-bit variables …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm floating-point logarithm avx2

7
推荐指数
2
解决办法
1636
查看次数

SIMD使用ARM NEON程序集对atan2进行矢量化

我想用霓虹灯指令SIMD和臂组件计算4点的幅度和角度.在大多数语言中都有一个内置库,在我的例子中是C++,它计算角度(atan2),但只计算一对浮点变量(x和y).我想利用处理q寄存器的SIMD指令来计算atan2的4个值的向量.

要求精度不高,速度更重要.


我已经有一些汇编指令来计算4个浮点寄存器的幅度,我的应用程序的准确度可以接受.q1包含4"x"值(x1,x2,x3,x4).q2包含4个"y"值(y1,y2,y3,y4).q7包含4个结果的大小(x1 ^ 2 + y1 ^ 2,x2 ^ 2 + y2 ^ 2,x3 ^ 2 + y3 ^ 2,x4 ^ 2 + y4 ^ 2).

vmul.f32 q7, q1, q1  
vmla.f32 q7, q2, q2    
vrecpe.f32  q7, q7   
vrsqrte.f32 q7, q7 
Run Code Online (Sandbox Code Playgroud)

使用SIMD指令计算两个向量的近似atan2的最快方法是什么?

assembly arm vectorization atan2 neon

4
推荐指数
1
解决办法
1944
查看次数

标签 统计

algorithm ×1

arm ×1

assembly ×1

atan2 ×1

avx2 ×1

c++ ×1

floating-point ×1

logarithm ×1

neon ×1

vectorization ×1