问题中代码的无分支版本是可能的(几乎没有任何冗余工作,只有一些比较/混合来为FMA创建常量),但IDK如果编译器将自动矢量化它.

如果所有元素都有 – | a |,则主要的额外工作是无用的sqrt / fma > -0.5625f,不幸的是在关键路径上.

asinf_core的arg是(r> -0.5625f)? r:sqrtf(fmaf(0.5f,r,0.5f)).

与此同时,您(或编译器)可以在输出上混合FMA的系数.

如果你通过将pi / 2常量放入一个浮点而不是用2个常数被乘数来创建它来牺牲pi / 2常量的精度,你可以

fmaf( condition?-1:2, asinf_core_result, condition ? pi/2 : 0)

因此,您可以在两个常量之间进行选择,或者使用SIMD比较结果和一个常量来有条件地将其归零(例如x86 SSE).

最终修正基于原始输入的范围检查,因此FP混合和asinf_core的FMA工作之间再次存在指令级并行性.

事实上,我们可以通过在第二个条件下将常量输入混合到asinf_core的输出来优化它到之前的FMA.我们希望asinf_core作为它的被乘数之一,所以我们可以通过否定常数来否定. (SIMD实现可能执行a_cmp = andnot(a>> 0.0f,a> = – 1.0f),然后乘数^( – 0.0f& a_cmp),其中乘数在之前有条件地完成.

输出上该FMA的附加常数为0,pi / 2,pi或pi pi / 2.给定两个比较结果(对于非NaN情况,在a和on r = – | a |上),我们可以将其组合成2位整数并将其用作随机控制以从向量中选择FP常量所有4个常数,例如使用AVX vpermilps(带有可变控制的快速通道内洗牌).即不是混合4种不同的方式,而是使用shuffle作为2位LUT!

如果我们这样做,我们也应该为乘法常数做,因为创建常数是主要成本.可变混合比x86上的shuffle更昂贵(通常为2 uops对1).在Skylake上,可变混合(如vblendvps)可以使用任何端口(而shuffle只能在端口5上运行).有足够的ILP,这可能会影响整体uop吞吐量或整体ALU端口,而不是端口5.(Haswell上的可变混合对于端口5是2 uops,所以它严格比vpermilps ymm,ymm,ymm更差).

我们将从-1,1,-2和2中进行选择.

带有三元运算符的标量,使用gcc7.3 -O3 -march = skylake -ffast-math自动矢量化(使用8个vblendvps).自动向量化所需的快速数学:/不幸的是,gcc仍然使用rsqrtps进行牛顿迭代(没有FMA?!?),即使是-mrecip=none, which I thought was supposed to disable this也是如此.

使用clang5.0(具有相同选项)仅使用5个vblendvps进行自动向量化.请参见on the Godbolt compiler explorer.这会编译,看起来可能是正确数量的指令,但在其他方面未经测试.

// I think this is far more than enough digits for float precision, but wouldn't hurt to use a standard constant instead of what I typed from memory.

static const float pi_2 = 3.1415926535897932384626433 / 2;

static const float pi = 3.1415926535897932384626433;

//static const float pi_plus_pi_2 = 3.1415926535897932384626433 * 3.0 / 2;

/* maximum error UNKNOWN, completely UNTESTED */

float my_acosf_branchless (float a)

{

float r = (a > 0.0f) ? (-a) : a; // avoid modifying the "sign" of NaNs

bool a_in_range = !(a > 0.0f) && (a >= -1.0f);

bool rsmall = (r > -0.5625f);

float asinf_arg = rsmall ? r : sqrtf (fmaf (0.5f, r, 0.5f));

float asinf_res = asinf_core(asinf_arg);

#if 0

r = fmaf( rsmall?-1.0f:2.0f, asinf_res, rsmall ? pi_2 : 0);

if (!(a > 0.0f) && (a >= -1.0f)) { // avoid modifying the "sign" of NaNs

/* arccos (-x) = pi - arccos(x) */

r = fmaf (0x1.ddcb02p+0f, 0x1.aee9d6p+0f, -r);

}

#else

float fma_mul = rsmall? -1.0f:2.0f;

fma_mul = a_in_range ? -fma_mul : fma_mul;

float fma_add = rsmall ? pi_2 : 0;

fma_add = a_in_range ? fma_add + pi : fma_add;

// to vectorize, turn the 2 conditions into a 2-bit integer.

// Use vpermilps as a 2-bit LUT of float constants

// clang doesn't see the LUT trick, but otherwise appears non-terrible at this blending.

r = fmaf(asinf_res, fma_mul, fma_add);

#endif

return r;

}

使用循环测试自动矢量化,该循环在1024个对齐的浮点元素的数组上运行它;看看Godbolt的链接.

TODO:内在版本.

GPS数据矢量化JAVA_算法 – acosf()的精确矢量化实现相关推荐

  1. GPS数据矢量化JAVA_SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器

    SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器 SVGX矢量化图形编辑器是面向工程应用的矢量图形制作软件,基于著名的Eclipse GEF图形编辑框架实现了W3C SVG 1.1规范 ...

  2. 甘肃皇城唐代数据矢量化

    甘肃皇城唐代数据矢量化,数据如下

  3. ArcGIS学习07:图片数据矢量化

    标题 文章目录 标题 前言 一.获取建筑底面图片数据并做初步处理 二.对数据进行地理配准 三.图片数据矢量化 总结 前言 本文基于立方数据院学习平台的学习,介绍图片矢量化的相关操作.图片数据矢量化能解 ...

  4. 【opencv 450 core】使用统一向量指令(Universal Intrinsics)对代码进行矢量化

    Vectorizing your code using Universal Intrinsics 使用 Universal Intrinsics 对代码进行矢量化 Goal 本教程的目标是提供使用通用 ...

  5. 基于激光点云数据自动化实现道路标线分类、提取及矢量化

    Automatic Road Markings Extraction Classification And Vectorization Mobile From Laser Scanning Data ...

  6. 解放双手!用这个“神器“结合ArcGIS让建筑数据自动矢量化

    解放双手!用这个"神器"结合ArcGIS让建筑数据自动矢量化 简单来说,建筑数据的获取无外乎是矢量化和去网站下载 (osm下载点击跳转→全球矢量任意下载!全国路网水系.精确到乡镇的 ...

  7. Simulink示波器出图数据对比及其Visio矢量化

    当仿真模型需要更改参数进行对比分析时,可以采用在此窗口在搭建一个模型接同一个示波器,但是当模型很大很复杂时,这种方法就不使用.为此,提供一种数据导出到工作区绘图的方法. 第一步: 点击示波器设置选项& ...

  8. Python调用Geopandas包矢量化txt点数据为shp数据

    Python提取ICESat-2/ATL08并可视化 01 引言: Python Geopandas轻松读取txt点数据进行矢量化并保存为shp格式,相较于gdal ogr相对更加便捷.现记录在此分享 ...

  9. matlab 矢量化,matlab矢量化编程简要

    一.基本技术 1)MATLAB索引或引用(MATLAB Indexing or Referencing) 在MATLAB中有三种基本方法可以选取一个矩阵的子阵.它们分别是下标法,线性法和逻辑法(sub ...

最新文章

  1. JAVA程序禁用Hbase中的表_HBase禁用表
  2. [FY20 创新人才班 ASE] 第 1 次作业成绩
  3. 2021垂直类电商私域化洞察报告
  4. ubuntu14.04+gtsam安装(亲测)
  5. python3设置编码背景颜色_在pythongtk3中设置条目背景颜色并设置回defau的最佳方法...
  6. 再提手机上网应该包月计费
  7. linux镜像文件_深度UI + Ubuntu系统,堪称最强最美Linux发行版!你敢升级吗?
  8. 十种可以成为知己的异性
  9. JavaSE| 面向对象-类的五大成员
  10. UNIX系统命令大全
  11. APP开发策划方案怎么写?
  12. My Thirty-eighth - 验证二叉树搜索树 - By Nicolas
  13. 【liunxptp协议栈详解第一部分】
  14. 王道计算机组成原理课代表 - 考研计算机 第七章 输入输出系统 究极精华总结笔记
  15. 【自动驾驶】高精地图在无人驾驶中的应用
  16. 我的世界java村民繁殖条件,我的世界村民无限繁殖教程 教你村民怎么生孩子
  17. Lattice系列FPGA入门相关0(Lattice与Altera、Xilinx对比及入门)
  18. 嵩天python测验4_嵩天Python学习笔记-04
  19. JPEG图像压缩算法流程详解
  20. 勒索病毒尝试解决方法

热门文章

  1. django建立个人网站(5图文识别以及聊天机器人)
  2. 阿里p7 p8的要求看看你会了多少
  3. Termux – Android运行aarch64 – Linux – 安卓设备建站 – 让旧安卓设备老树新花
  4. HYSBZ 1588 营业额统计 伸展树
  5. 国瀚实业|春节投资,这些理财的坑要注意
  6. 看《大话西游》,你哭了么
  7. 传统营销与网络营销的整合
  8. Affine-Transformation Parameters Regression for Face Alignment
  9. 开放开源开先河(上)
  10. Corg.quartz.JobPersistenceException: Couldn‘t retrieve trigger