问题标签 [avx512]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - AVX512 舍入模式如何工作(或者 NDISASM 是否被简单地混淆了)?
我正在尝试了解特定的 AVX512F 指令vcvtps2udq。
指令的签名是VCVTPS2UDQ zmm1 {k1}{z}, zmm2/m512/m32bcst{er}
。手册信息如下。
为了理解新的舍入模式,下面的代码片段是用 NASM (2.12.02) 组装的
使用 NDISASM (2.12.02) 对结果进行反汇编会产生很多混乱,并且代码如下:
问题:第二行是用 xmm 寄存器而不是 zmm 寄存器反汇编的(这是我所预料的)。与零舍入模式(rz-sae)有关。或者只是 NDISASM 错误,无法区分操作码 62F17C7879C1 和 62F17C0879C1。
Intel指令集参考手册有如下描述:
将源操作数中的十六个压缩单精度浮点值转换为目标操作数中的十六个无符号双字整数。
当转换不精确时,返回的值根据 MXCSR 寄存器中的舍入控制位或嵌入的舍入控制位进行舍入。如果转换后的结果无法以目标格式表示,则引发浮点无效异常,如果此异常被屏蔽,则返回整数值 2w – 1,其中 w 表示目标格式的位数。
源操作数是一个 ZMM/YMM/XMM 寄存器,一个 512/256/128 位内存位置,或从 32 位内存位置广播的 512/256/128 位向量。目标操作数是一个 ZMM/YMM/XMM 寄存器,使用写掩码 k1 有条件地更新。
sse - 有什么方法可以根据 AVX512 cpu intrinics 将 unsigned char 转换为 short 吗?
我只是在看Xeon Phi处理器中的AVX512的cpu intrinic sets,但是sse中的传统数据类型转换方法似乎在avx512中不起作用,所以请问avx512中是否有类似的cpu集可以转换无符号字符数组到短数据类型数组?提前致谢!
x86 - 冲突检测指令如何使向量化循环变得更容易?
AVX512CD 指令系列是:VPCONFLICT、VPLZCNT 和 VPBROADCASTM。
AVX-512 冲突检测 (AVX-512CD) 中的说明旨在帮助有效计算循环中通常无法安全矢量化的元素的无冲突子集。
有哪些示例表明这些指令在矢量化循环中很有用?如果答案将包括标量循环及其矢量化对应物,那将很有帮助。
谢谢!
c - AVX512 比特测试和操作性能推荐
我遇到了一组带有以下“内核”作为性能阻止程序的代码。由于我可以访问最新的 Intel(R) Xeon Phi(TM) CPU 7210 (KNL),因此我希望使用 AVX512 内在函数加速它。
在分析了代码的行为后,我发现内循环的长度大多小于 16,所以我写了以下内容
这里有几个问题:
- 由于_mm_srli_si128不接受非立即参数,我必须在那里使用循环,请问有什么办法可以消除它?
- _mm_testc_si128(pixel16, mask1)大多对性能没有帮助,这当然是由于data[][]的分布;但是,它“计算 a 的按位非,然后与 b 进行 AND,如果结果为零,则将 CF 设置为 1,否则将 CF 设置为 0”,有什么方法可以得到“ANDNOT”的结果,以便我这样做不需要再计算_mm_andnot_si128?
- 由于内环长度大多小于 16,它可能不太适合 AVX512;但是,通过加载 data[y][x] 和 data[y+1][x],然后将它们组合成一个 __m256i,将 y 间隔展开 2 是否值得?但是,由于 KNL (AVX512BW) 上还没有 8bit int 到 16bit int 的转换,它可能比当前版本更令人沮丧。
- 一般来说,任何提高 KNL 上这一小段代码性能的建议/建议都非常感谢 :) (它已经在 OpenMP 循环区域内,因此现在可能不可用)
上述第 3 点:
xeon-phi - 在 KNL (Xeon Phi 7210) 上将 16 位掩码 (__mmask16) 转换为 __m128i 控制字节掩码
我希望在__mmask16和__m128i之间进行转换。但是,正如发布在https://stackoverflow.com/a/32247779/6889542
_mm_maskz_broadcastb_epi8和任何类似的东西在 KNL 上尚不可用。KNL (Xeon Phi 7210)上缺少AVX512BW真的让我很头疼。
问题的根源是我希望利用
使用时
x86 - 为什么英特尔的 AVX-512 有 32 个(这么多!)512 位寄存器向量,ZMM0 到 ZMM31?
Intel 的 AVX512 技术由于多个子寄存器支持并行化,例如每个 512 位向量寄存器中有 8 个 64 位 FP 子寄存器。什么,多个向量寄存器也可以并行操作?是否发生以下并行化的象征性示例?
开始;
父母;
sse - avx 比 sse 多媒体扩展慢
我正在编写一个完美的程序来与多媒体扩展并行。该程序包括转换图像,因此我遍历一个矩阵并修改其中的每个像素。为了更快地浏览,我使用多媒体扩展:
起初我使用 SSE3 扩展并实现了 2.5 的加速。接下来,我对它进行了编程,扩展了 sse 算法以使用 AVX 扩展(双尺寸向量),但我没有获得相对于 SSE3 的收益。使用 SSE 执行程序的时间或多或少与 AVX 相同。以下是分别针对 SSE 和 AVX 的代码摘要:
}
}
如您所见, sse 和 avx 相同,但最后一个已扩展并使用更长的向量。为什么执行时间相同?
注意:我已经在两台支持 AVX 的不同计算机上进行了尝试(显然),我也遇到了同样的问题。
非常感谢。
x86 - AVX512 log2 或 pow 指令
我需要一个 AVX512double pow(double, int n)
函数(我需要它来进行准确的二项分布计算)。特别是我希望拥有 AVX512ER 的 Knights Landing。一种方法是
Knights Corner 有vlog2ps
指令 ( _mm512_log2_ps
intrinsic) 和vexp223ps
指令 ( _mm512_exp223_ps intrinsic
),所以至少我可以float pow(float, float)
使用这两个指令。
但是,对于 Knights Landing,我找不到log2
说明。我确实在 AVX512ER 中找到了一条vexp2pd
指令(_mm512_exp2a23_pd
内在)。我觉得奇怪的是,Knights Corner 有log2
说明,但更新更好的 Knights Landing 却没有。
现在我已经pow(double, n)
使用重复平方实现了,但我认为如果我有一个log2
指令会更有效。
是否有比重复平方更有效的算法来double pow(double, int n)
使用 AVX512 和 AVX512ER?有没有简单的方法(例如有一些说明)来获得log2
?
这是使用重复平方的 AVX512F 版本
指数是 int32 而不是 int64。理想情况下,我会使用__m256i
八个整数。但是,这需要 AVX512VL 将 512b 操作扩展到 256b 和 128b,但 KNL 没有 AVX512VL。相反,我对 32 位整数使用 512b 操作,并将 16b 掩码转换为 8b。
intel - 关于用 AVX512 编译的困惑
我正在阅读这篇文档,了解如何在 Intel Knights Landing 上使用 Intel C++ 编译器和 AVX512 支持来编译 C/C++ 代码。
但是,我对这部分有点困惑:
-xMIC-AVX512:使用此选项生成 AVX-512F、AVX-512CD、AVX-512ER 和 AVX-512FP。
-xCORE-AVX512:使用此选项生成 AVX-512F、AVX-512CD、AVX-512BW、AVX-512DQ 和 AVX-512VL。
例如,要为 Intel Xeon Phi 处理器 x200 生成 Intel AVX-512 指令,您应该使用选项 –xMIC-AVX512。例如,在 Linux 系统上
$ icc –xMIC-AVX512 application.c 当您要为 Intel Xeon Phi 处理器 x200 构建巨大的二进制文件时,此编译器选项很有用。与其在需要更多时间的协处理器上构建它,不如在基于英特尔至强处理器的机器上构建它
我的 Xeon Phi KNL 没有协处理器(无需 ssh micX 或使用-mmic
标志编译)。但是,我不明白使用-xMIC
or是否更好-xCORE
?
排在第二位的是 about-ax
而不是-x
:
当您尝试构建可以在多个平台上运行的二进制文件时,此编译器选项很有用。
所以-ax
用于跨平台支持,但是有什么性能差异-x
吗?
c++ - 模拟 AVX-512 掩码指令
根据文档,从gcc 4.9
指令AVX-512
集开始支持,但我有gcc 4.8
. 我目前有这样的代码来总结一块内存(保证小于 256 字节,所以不用担心溢出):
现在,查看文档,如果我们有剩余的四个字节,我可以使用:
(注意,__mmask8
我能找到的任何地方似乎都没有记录类型,所以我猜......)
但是,_mm_mask_cvtepu8_epi16
是一条AVX-512
指令,那么有没有办法复制它?我试过了:
但是,存在缓存停顿,因此直接for (int i = 0; i < remaining_bytes; i++) sum += mem[i];
提供更好的性能。