GPS数据矢量化JAVA_算法 – acosf()的精确矢量化实现
问题中代码的无分支版本是可能的(几乎没有任何冗余工作,只有一些比较/混合来为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()的精确矢量化实现相关推荐
- GPS数据矢量化JAVA_SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器
SVGX矢量化图形编辑器,100%JAVA实现的矢量化图形编辑器 SVGX矢量化图形编辑器是面向工程应用的矢量图形制作软件,基于著名的Eclipse GEF图形编辑框架实现了W3C SVG 1.1规范 ...
- 甘肃皇城唐代数据矢量化
甘肃皇城唐代数据矢量化,数据如下
- ArcGIS学习07:图片数据矢量化
标题 文章目录 标题 前言 一.获取建筑底面图片数据并做初步处理 二.对数据进行地理配准 三.图片数据矢量化 总结 前言 本文基于立方数据院学习平台的学习,介绍图片矢量化的相关操作.图片数据矢量化能解 ...
- 【opencv 450 core】使用统一向量指令(Universal Intrinsics)对代码进行矢量化
Vectorizing your code using Universal Intrinsics 使用 Universal Intrinsics 对代码进行矢量化 Goal 本教程的目标是提供使用通用 ...
- 基于激光点云数据自动化实现道路标线分类、提取及矢量化
Automatic Road Markings Extraction Classification And Vectorization Mobile From Laser Scanning Data ...
- 解放双手!用这个“神器“结合ArcGIS让建筑数据自动矢量化
解放双手!用这个"神器"结合ArcGIS让建筑数据自动矢量化 简单来说,建筑数据的获取无外乎是矢量化和去网站下载 (osm下载点击跳转→全球矢量任意下载!全国路网水系.精确到乡镇的 ...
- Simulink示波器出图数据对比及其Visio矢量化
当仿真模型需要更改参数进行对比分析时,可以采用在此窗口在搭建一个模型接同一个示波器,但是当模型很大很复杂时,这种方法就不使用.为此,提供一种数据导出到工作区绘图的方法. 第一步: 点击示波器设置选项& ...
- Python调用Geopandas包矢量化txt点数据为shp数据
Python提取ICESat-2/ATL08并可视化 01 引言: Python Geopandas轻松读取txt点数据进行矢量化并保存为shp格式,相较于gdal ogr相对更加便捷.现记录在此分享 ...
- matlab 矢量化,matlab矢量化编程简要
一.基本技术 1)MATLAB索引或引用(MATLAB Indexing or Referencing) 在MATLAB中有三种基本方法可以选取一个矩阵的子阵.它们分别是下标法,线性法和逻辑法(sub ...
最新文章
- JAVA程序禁用Hbase中的表_HBase禁用表
- [FY20 创新人才班 ASE] 第 1 次作业成绩
- 2021垂直类电商私域化洞察报告
- ubuntu14.04+gtsam安装(亲测)
- python3设置编码背景颜色_在pythongtk3中设置条目背景颜色并设置回defau的最佳方法...
- 再提手机上网应该包月计费
- linux镜像文件_深度UI + Ubuntu系统,堪称最强最美Linux发行版!你敢升级吗?
- 十种可以成为知己的异性
- JavaSE| 面向对象-类的五大成员
- UNIX系统命令大全
- APP开发策划方案怎么写?
- My Thirty-eighth - 验证二叉树搜索树 - By Nicolas
- 【liunxptp协议栈详解第一部分】
- 王道计算机组成原理课代表 - 考研计算机 第七章 输入输出系统 究极精华总结笔记
- 【自动驾驶】高精地图在无人驾驶中的应用
- 我的世界java村民繁殖条件,我的世界村民无限繁殖教程 教你村民怎么生孩子
- Lattice系列FPGA入门相关0(Lattice与Altera、Xilinx对比及入门)
- 嵩天python测验4_嵩天Python学习笔记-04
- JPEG图像压缩算法流程详解
- 勒索病毒尝试解决方法
热门文章
- django建立个人网站(5图文识别以及聊天机器人)
- 阿里p7 p8的要求看看你会了多少
- Termux – Android运行aarch64 – Linux – 安卓设备建站 – 让旧安卓设备老树新花
- HYSBZ 1588 营业额统计 伸展树
- 国瀚实业|春节投资,这些理财的坑要注意
- 看《大话西游》,你哭了么
- 传统营销与网络营销的整合
- Affine-Transformation Parameters Regression for Face Alignment
- 开放开源开先河(上)
- Corg.quartz.JobPersistenceException: Couldn‘t retrieve trigger