- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我受到这个链接的启发
https://www.sigarch.org/simd-instructions-considered-harmful/查看 AVX512 的性能。我的想法是可以使用 AVX512 掩码操作删除循环后的清理循环。
这是我正在使用的代码
void daxpy2(int n, double a, const double x[], double y[]) {
__m512d av = _mm512_set1_pd(a);
int r = n&7, n2 = n - r;
for(int i=-n2; i<0; i+=8) {
__m512d yv = _mm512_loadu_pd(&y[i+n2]);
__m512d xv = _mm512_loadu_pd(&x[i+n2]);
yv = _mm512_fmadd_pd(av, xv, yv);
_mm512_storeu_pd(&y[i+n2], yv);
}
__m512d yv = _mm512_loadu_pd(&y[n2]);
__m512d xv = _mm512_loadu_pd(&x[n2]);
yv = _mm512_fmadd_pd(av, xv, yv);
__mmask8 mask = (1 << r) -1;
//__mmask8 mask = _bextr_u32(-1, 0, r);
_mm512_mask_storeu_pd(&y[n2], mask, yv);
}
__mmask8 mask = _bextr_u32(-1, 0, r)
__mmask8 mask = (1 << r) -1;
ISA | MIPS-32 | AVX2 | RV32V | AVX512 |
******************************|*********|****** |*******|******* |
Instructions(static) | 22 | 29 | 13 | 28 |
Instructions per Main Loop | 7 | 6* | 10 | 5*|
Bookkeeping Instructions | 15 | 23 | 3 | 23 |
Results per Main Loop | 2 | 4 | 64 | 8 |
Instructions (dynamic n=1000) | 3511 | 1517**| 163 | 645 |
*macro-op fusion will reduce the number of uops in the main loop by 1
** without the unnecessary cmp instructions it would only be 1250+ instructions.
-n
算起高达
0
而不是来自
0
至
n
他们本可以跳过
cmp
我在主循环中拥有的指令(请参阅下面的程序集),因此对于 AVX,主循环中应该有 5 条指令。
-O3 -xCOMMON-AVX512
的组件
daxpy2(int, double, double const*, double*):
mov eax, edi #6.13
and eax, 7 #6.13
movsxd r9, edi #6.25
sub r9, rax #6.21
mov ecx, r9d #7.14
neg ecx #7.14
movsxd rcx, ecx #7.14
vbroadcastsd zmm16, xmm0 #5.16
lea rdi, QWORD PTR [rsi+r9*8] #9.35
lea r8, QWORD PTR [rdx+r9*8] #8.35
test rcx, rcx #7.20
jge ..B1.5 # Prob 36% #7.20
..B1.3: # Preds ..B1.1 ..B1.3
vmovups zmm17, ZMMWORD PTR [rdi+rcx*8] #10.10
vfmadd213pd zmm17, zmm16, ZMMWORD PTR [r8+rcx*8] #10.10
vmovups ZMMWORD PTR [r8+rcx*8], zmm17 #11.23
add rcx, 8 #7.23
js ..B1.3 # Prob 82% #7.20
..B1.5: # Preds ..B1.3 ..B1.1
vmovups zmm17, ZMMWORD PTR [rsi+r9*8] #15.8
vfmadd213pd zmm16, zmm17, ZMMWORD PTR [rdx+r9*8] #15.8
mov edx, -1 #17.19
shl eax, 8 #17.19
bextr eax, edx, eax #17.19
kmovw k1, eax #18.3
vmovupd ZMMWORD PTR [r8]{k1}, zmm16 #18.3
vzeroupper #19.1
ret #19.1
add r8, 8
js ..B1.3
jl
相反,它会融合。
v1 = for(int64_t i=0; i<n; i+=vec_size) // generates cmp instruction
v2 = for(int64_t i=-n2; i<0; i+=vec_size) // no cmp but uses js
v3 = for(int64_t i=-n2; i!=0; i+=vec_size) // no cmp and uses jne
vec_size = 2 for SSE, 4 for AVX2, and 8 for AVX512
vec_size version core cycle instructions uops
2 v1 895 3014 3524
2 v2 900 2518 3535
2 v3 870 2518 3035
4 v1 527 1513 1777
4 v2 520 1270 1777
4 v3 517 1270 1541
8 v1 285 765 910
8 v2 285 645 910
8 v3 285 645 790
2*n/vec_size
成正比.
SSE 2*1000/2=1000
AVX2 2*1000/4=500
AVX512 2*1000/8=250
6*n/vec_size
成正比对于 v2 和 v3
5*n/vec_size
7*n/vec_size
成正比对于 v3
6*n/vec_size
.
Throughput Analysis Report
--------------------------
Block Throughput: 1.49 Cycles Throughput Bottleneck: FrontEnd
Loop Count: 50
Port Binding In Cycles Per Iteration:
--------------------------------------------------------------------------------------------------
| Port | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | 6 | 7 |
--------------------------------------------------------------------------------------------------
| Cycles | 0.5 0.0 | 0.5 | 1.5 1.0 | 1.5 1.0 | 1.0 | 0.0 | 0.0 | 0.0 |
--------------------------------------------------------------------------------------------------
DV - Divider pipe (on port 0)
D - Data fetch pipe (on ports 2 and 3)
F - Macro Fusion with the previous instruction occurred
* - instruction micro-ops not bound to a port
^ - Micro Fusion occurred
# - ESP Tracking sync uop was issued
@ - SSE instruction followed an AVX256/AVX512 instruction, dozens of cycles penalty is expected
X - instruction not supported, was not accounted in Analysis
| Num Of | Ports pressure in cycles | |
| Uops | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | 6 | 7 |
-----------------------------------------------------------------------------------------
| 1 | | | 0.5 0.5 | 0.5 0.5 | | | | | vmovupd xmm1, xmmword ptr [r8+rax*8]
| 2 | 0.5 | 0.5 | 0.5 0.5 | 0.5 0.5 | | | | | vfmadd213pd xmm1, xmm2, xmmword ptr [rcx+rax*8]
| 2 | | | 0.5 | 0.5 | 1.0 | | | | vmovups xmmword ptr [rcx+rax*8], xmm1
| 1* | | | | | | | | | add rax, 0x2
| 0*F | | | | | | | | | js 0xffffffffffffffe3
Total Num Of Uops: 6
js
带
add
的宏 fuse 这不同意阿格纳和来自
testp
的性能计数器公用事业。见上,v2 正比于
7*n/vec_size
和 v3 与
6*n/vec_size
成正比我推断这意味着
js
没有宏熔断器。
最佳答案
如果您使用以下 BMI2 内在函数,则可以保存一条指令:
__mmask8 mask = _bzhi_u32(-1, r);
__mmask8 mask = (1 << r) -1;
.见
Godbolt link .
bzhi
instruction从指定位置开始将高位清零。使用寄存器操作数,
bzhi
具有 1 个周期的延迟和每个周期 2 个的吞吐量。
关于x86 - 使用 AVX512 生成蒙版的 BMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54809132/
大家好, 我目前正在为我的元素编写 BMI 计算器。计算器已设置为以磅/英尺为单位,但我想添加一个选项,可以在公斤/米或磅/英尺之间进行选择。 我已经为其创建了 html 代码,只需要其中的 Java
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我想问一下,当循环开始并再次循环时,字符串变量名称会增加1,我该怎么做。这个程序应该问你要写多少个病人。如果你为前任写信。 10,那么循环将进行10次,它会询问我想要的所有信息,然后将它们添加到我已经
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我刚刚完成了一个计算体重指数表的程序。但是,我无法按预期打印表格。我尝试更改 for 循环位置,但它给了我相同的结果。如果你执行代码你就会明白我的意思。 实际输出: 预期输出: 我的代码: #incl
对于这个实验,我不允许编辑 main 函数,所有事情都必须在 main 下面的函数中完成。我在这里似乎找不到我的问题。我认为这与调用calculateBMI函数有关。 #include F
我想计算BMI值。我有一个添加 Controller ,其中有两个用于体重和高度的文本字段。然后我有一个结果标签和一个计算 BMI 值的按钮。 我的代码是: @IBOutlet var fieldAl
我的 JS 代码 有问题。我制作了两个具有相同值的对象。我想决定哪个人的 BMI 更高。我做了 if 语句,但我认为控制台应该记录“The same BMI”。这表明 Mike 的 BMI 更高。 v
在没有让 BMR 计算器按预期工作后,我决定使用一些更简单的东西,并尝试制作一个 BMI 计算器(因为它不需要不同的性别方法),或多或少从 BMR 计算器重写。问题是我对我应该如何使用数学并没有真正的
在我最近的项目中,简而言之,我正在计算 BMI。 我正在为体重和高度( double 类型)使用一维数组 为了计算 BMI,我使用了一个以方程作为返回值的函数。 问题是结果远远超出了 BMI 值(例如
第一个问题在这里。我必须使用之前计算 BMI 的作业,并将其重新格式化以接受命令行参数作为高度和体重的输入。 “您的程序应通过 main(String[] args) 获取体重和高度,即,当您运行程序
# This program calculates a person's BMI after # user inputs their height and weight, it then conver
我正在尝试计算表中学生的 BMI,四舍五入到三位数: +-------+--------+--------+ | fname | weight | height | +-------+--------
所以我有以下表格来计算用户的 BMI 并根据结果将用户重定向到特定页面: HTML Your Weight(kg): Your Height(cm): Your BMI
澄清 在研究了您的答案并阅读了您对此问题的解释后,我要补充以下内容。 我需要生成整个 BMI 历史记录,而不是单个值。 两个表中的每个值都需要与另一个表中的相关值配对(如果可能)。 简单问题 给定 P
我正在开发一个简单的 BMI 应用程序,但我不知道当我启动应用程序时发生了什么,它崩溃了。 文件名:MainActivity.java package com.achkars.myownbmi; im
我正在尝试制作一个BMI计算器,它调用一个单独类的方法来计算bmi,然后在主方法中继续。下面是我的源代码。 import java.util.Scanner; public class testBMI
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
#include #include int main(void) { int userAgeYears = 0; int userAgeDays = 0; int userWe
我在该程序中使用指针和引用时遇到问题。我完全不明白。我对 C 还很陌生,我们只接触了指针,但还没有讨论太多。任何帮助将不胜感激。 编辑:现在它不允许我输入任何内容... 这是我的新代码: #inclu
我是一名优秀的程序员,十分优秀!