- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找高效的 AVX (AVX512) 实现
// Given
float u[8];
float v[8];
// Compute
float a[8];
float b[8];
// Such that
for ( int i = 0; i < 8; ++i )
{
a[i] = fabs(u[i]) >= fabs(v[i]) ? u[i] : v[i];
b[i] = fabs(u[i]) < fabs(v[i]) ? u[i] : v[i];
}
也就是说,我需要按元素选择 a
来自u
和v
基于mask
,并进入b
基于!mask
,其中mask = (fabs(u) >= fabs(v))
逐元素。
最佳答案
前几天我也遇到了同样的问题。我想出的解决方案(仅使用 AVX)是:
// take the absolute value of u and v
__m256 sign_bit = _mm256_set1_ps(-0.0f);
__m256 u_abs = _mm256_andnot_ps(sign_bit, u);
__m256 v_abs = _mm256_andnot_ps(sign_bit, v);
// get a mask indicating the indices for which abs(u[i]) >= abs(v[i])
__m256 u_ge_v = _mm256_cmp_ps(u_abs, v_abs, _CMP_GE_OS);
// use the mask to select the appropriate elements into a and b, flipping the argument
// order for b to invert the sense of the mask
__m256 a = _mm256_blendv_ps(u, v, u_ge_v);
__m256 b = _mm256_blendv_ps(v, u, u_ge_v);
AVX512 等效项是:
// take the absolute value of u and v
__m512 sign_bit = _mm512_set1_ps(-0.0f);
__m512 u_abs = _mm512_andnot_ps(sign_bit, u);
__m512 v_abs = _mm512_andnot_ps(sign_bit, v);
// get a mask indicating the indices for which abs(u[i]) >= abs(v[i])
__mmask16 u_ge_v = _mm512_cmp_ps_mask(u_abs, v_abs, _CMP_GE_OS);
// use the mask to select the appropriate elements into a and b, flipping the argument
// order for b to invert the sense of the mask
__m512 a = _mm512_mask_blend_ps(u_ge_v, u, v);
__m512 b = _mm512_mask_blend_ps(u_ge_v, v, u);
正如 Peter Cordes 在上面的评论中所建议的那样,还有其他方法,例如取绝对值,后跟最小值/最大值,然后重新插入符号位,但我找不到比这更短/更低延迟的方法这一系列指令。
<小时/>实际上,还有另一种通过 _mm512_range_ps()
内部函数使用 AVX512DQ 的 VRANGEPS
的方法。 Intel's intrinsic guide描述如下:
Calculate the max, min, absolute max, or absolute min (depending on control in imm8) for packed single-precision (32-bit) floating-point elements in a and b, and store the results in dst. imm8[1:0] specifies the operation control: 00 = min, 01 = max, 10 = absolute max, 11 = absolute min. imm8[3:2] specifies the sign control: 00 = sign from a, 01 = sign from compare result, 10 = clear sign bit, 11 = set sign bit.
请注意,上面似乎有一个拼写错误;实际上,如果您查看详细信息,则 imm8[3:2] == 10
是“绝对最小值”,而 imm8[3:2] == 11
是“绝对最大值”每个元素的操作:
CASE opCtl[1:0] OF
0: tmp[31:0] := (src1[31:0] <= src2[31:0]) ? src1[31:0] : src2[31:0]
1: tmp[31:0] := (src1[31:0] <= src2[31:0]) ? src2[31:0] : src1[31:0]
2: tmp[31:0] := (ABS(src1[31:0]) <= ABS(src2[31:0])) ? src1[31:0] : src2[31:0]
3: tmp[31:0] := (ABS(src1[31:0]) <= ABS(src2[31:0])) ? src2[31:0] : src1[31:0]
ESAC
CASE signSelCtl[1:0] OF
0: dst[31:0] := (src1[31] << 31) OR (tmp[30:0])
1: dst[31:0] := tmp[63:0]
2: dst[31:0] := (0 << 31) OR (tmp[30:0])
3: dst[31:0] := (1 << 31) OR (tmp[30:0])
ESAC
RETURN dst
因此,只需两条指令即可获得相同的结果:
auto a = _mm512_range_ps(v, u, 0x7); // 0b0111 = sign from compare result, absolute max
auto b = _mm512_range_ps(v, u, 0x6); // 0b0110 = sign from compare result, absolute min
参数顺序 (v, u
) 有点不直观,但为了在元素具有相等绝对值的情况下获得与您在 OP 中描述的相同行为,这是必需的(即,u
中的值传递到 a
,v
传递到 b
)。
在 Skylake 和 Ice Lake Xeon 平台上(可能是任何具有双 FMA 单元的 Xeon 平台?),VRANGEPS
的吞吐量为 2,因此两个检查可以同时发出和执行,但有延迟4 个周期。这只是对原始方法的适度延迟改进,但吞吐量更好,并且需要更少的指令/微指令/指令缓存空间。
关于上交所/AVX : Choose from two __m256 float vectors based on per-element min and max absolute value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52415188/
我正在尝试模拟 Max-Min 和 Min-Min 调度算法,并在模拟中自己编写代码。但是不太了解如何在代码中实现它们的工作方式。 例如,在 FCFS 算法中我使用了 3 个服务器 (vms),每个服
有人可以帮我实现这个功能吗?此功能位于相机应用程序内部,该应用程序使用过滤算法来检测颜色变化等方面的差异。语法对我来说非常困难。我不知道如何处理参数中的指针、最小和最大变量语法、什么是增量等?有人可以
我遇到如图所示的表数据情况,我想从每个唯一成员中选择 min(code) 和 secondary_min(code) 。 即期望的输出看起来像 member | min(code) | s
我有一个查询,选择每小时的最小值: SELECT MIN(price), HOUR(timestamp), DATE(timestamp) FROM `scan` GROUP BY DATE(time
#include int min(int pArray[], int nrOfArrayElements) { min = pArray[0]; for (int i = 1; i
generate(vec.begin(), vec.end(), [=](){return static_cast(static_cast(ran()) /RAND_MAX*(max-min)+min
当 min 已经被定义为宏时,如何调用 std::min? 最佳答案 (std::min)(x,y) min 周围的括号防止宏扩展。这适用于所有函数宏。 关于c++ - 当 min 被定义为宏时如何调
我正在尝试对(几个)SQL 数据库中的现有数据负载进行一些转换分析。 数据结构本身非常简单。它只是一个 Actor 列表(比如 user_id)和他们所做的事情的名称。它看起来像这样(还有其他数据,但
我正在尝试根据浏览器的最小高度和最小宽度更改我页面上的 CSS,所以我正在使用它: @media (min-height: 500px), (min-width: 580px) { /* CSS
我有两张 table 。第一个表显示 id_product 和 Product_price_value。下面我将向您展示一个示例(在我的数据库中有很多行) 表:主产品 ID_product: prod
我有两个表:商品和价格(一对多) 每个项目都有一个默认价格,但是这个价格可以在第二个表中被覆盖(在某些情况下)。 首先,我在获取所有项目并预先计算最低价格 - 默认价格与其覆盖当前价格(如果有的话?)
我使用以下命令用 pandas 读取了此 Excel 工作表(仅“DATEHEUREMAX”列): xdata = read_excel('Data.xlsx', 'Data', usecols=['
我想了解min-max堆删除的过程是如何工作的,我已经搜索了它的伪代码但一无所获,而且我似乎不能在这里询问伪代码。所以这是我的问题 谁能展示“删除最小元素 7”的逻辑,至少让我知道伪代码“感觉如何”?
将 std::min 传递给函数不会编译。我将 std::min 的 libcpp 声明复制到我的源文件中并且它有效。 std 版本有什么问题? clang 和 gcc 也是如此。在 Godbolt
请看这个例子:http://jsfiddle.net/vrgT3/5/ 我用 overflow: auto; 创建了一个 250x250px 父 div,因此当内容溢出框时会出现滚动条。我设置了蓝色背
假设我有 4 个变量 a、b、x、y和一个约束 min(a,b) > min(x,y)。 我如何在 pulp python 中表示这个程序? 最佳答案 好的。所以,我发布(删除)的第一个答案有点仓促,
我刚刚经历了 THIS fiddle 和代码如下所示: 现在,当我使用 View 框并将值更改为 viewbox="100 100 225 225" 时它具有执行以下操作的效果
我有 minSdkVersion 16,我想搜索正确的支持库以便使用方法 setActionBar()(在 api 级别 21 中引入)。 我应该使用哪个 appcompat 版本?当然,我不想使用旧
bootstrap.min.css 和 bootstrap.min.js 有什么区别?为什么需要包含 bootstrap.min.js? 和 最佳答案 它们都是完整 Bootstrap 样式 (C
我是一名优秀的程序员,十分优秀!