问题标签 [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.

0 投票
1 回答
240 浏览

c++ - 英特尔 MIC - 固有向量元素的总和

我有一个 __m512d 内在向量,我需要他的元素的总和。有什么简单的方法可以做到这一点?我专注于计算性能,所以我需要快速执行此操作。我对内在的了解不足以自己做,所以我需要你的帮助。

谢谢 :)

0 投票
1 回答
2493 浏览

windows - 哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展?(如何检查 SSE 或 AVX 是否完全可用?)

到目前为止,我已经设法发现:

  • SSE 和 SSE2 对于 Windows 8 及更高版本是强制性的(当然对于任何 64 位操作系统)
  • AVX 仅受 Windows 7 SP1 或更高版本支持

在 Windows 上使用 SSE3、SSSE3、SSE4.1、SSE 4.2、AVX2 和 AVX-512 是否有任何注意事项?

一些澄清:如果我使用来自 SSE/AVX 集合之一的指令,我需要它来确定我的程序将在哪些操作系统上运行。

0 投票
2 回答
1177 浏览

c - 在 XeonPhi 上使用 AVX 内联汇编的向量求和

我是使用 XeonPhi 英特尔协处理器的新手。我想使用 AVX 512 位指令为简单的向量和编写代码。我使用 k1om-mpss-linux-gcc 作为编译器并想编写内联汇编。这是我的代码:

但是,当我运行程序时,我的 asm 部分出现了分段错误。有人可以帮我吗???

谢谢

0 投票
1 回答
451 浏览

gcc - 无效的“asm”:嵌套的程序集方言替代方案

k1om-mpss-linux-gcc我正在尝试使用编译器为 Xeon Phi 平台编写一些带有 KNC 指令的内联汇编代码。我想在我的代码中使用掩码寄存器来矢量化我的计算。这是我的代码:

当我编译代码时,我得到了这个错误:

这与这条装配线有关:

关于这个错误的任何想法?

0 投票
1 回答
1052 浏览

c - 具有内在函数和程序集的嵌入式广播

在英特尔架构指令集扩展编程参考的第 2.5.3 节“广播”中,我们了解到 AVX512(和 Knights Corner)有

为某些加载操作指令编码数据广播的位字段,即从内存加载数据并执行某些计算或数据移动操作的指令。

例如,使用 Intel 汇编语法,我们可以在存储的地址广播标量,rax然后乘以 16 个浮点数zmm2并将结果写成zmm1这样

但是,没有内在函数可以做到这一点。因此,使用内在函数,编译器应该能够折叠

单条指令

但我没有观察到 GCC 这样做。我发现了一个关于这个的 GCC 错误报告

我观察到与 GCC 的 FMA 类似的东西。例如,GCC 4.9 不会崩溃_mm256_add_ps(_mm256_mul_ps(areg0,breg0) 为带有-Ofast. 但是,GCC 5.1 现在确实将其折叠为单个 fma。至少有内在函数可以使用 FMA 执行此操作,例如_mm256_fmadd_ps. 但是没有例如_mm512_mulbroad_ps(vector,scalar)内在的。

GCC 可能会在某个时候解决这个问题,但在那之前,汇编是唯一的解决方案。

所以我的问题是如何在 GCC 中使用内联汇编来做到这一点?

对于上面的示例,我想我可能已经为 GCC 内联汇编提出了正确的语法(但我不确定)。

我真的在寻找这样的功能

如果b在内存中指向rax它产生

如果bxmm1其中产生


GCC 已经vbroadcastss使用内部函数执行 -from-register 案例,但如果b在内存中,则将其编译为vbroadcastss来自内存。

如果b在内存中,clang 将使用广播内存操作数。

0 投票
2 回答
4179 浏览

c - 在 GNU C 内联汇编中,单个操作数的 xmm/ymm/zmm 的大小覆盖修饰符是什么?

在尝试用内在函数和汇编回答嵌入式广播时,我试图做这样的事情:

GNU C x86 Operand Modifiers文档仅指定最大为q(DI (DoubleInt) size, 64bits) 的修饰符。在向量寄存器上使用q将始终将其降低到xmm(from ymmor zmm)。例如标量寄存器:

问题:

在向量寄存器大小之间更改的修饰符是什么?

此外,是否有任何特定大小的限制可用于输入或输出操作数?除了泛型之外的其他东西x最终可能是 xmm、ymm 或 zmm,具体取决于您放在括号中的表达式的类型。

题外话:
clang 似乎有一些Yi/Yt约束(不是修饰符),但我也找不到关于它的文档。即使注释掉了向量指令,clang 甚至都不会编译它,因为它不喜欢+x作为__m512向量的约束。


背景/动机

我可以通过将标量作为输入操作数传递来获得我想要的结果,限制为与更广泛的输出操作数在同一个寄存器中,但它更笨拙。(此用例的最大缺点是 AFAIK 匹配约束只能通过操作数编号引用,而不是[symbolic_name],因此在添加/删除输出约束时很容易损坏。)

Godbolt 编译器资源管理器上


另外,我认为解决我试图解决的问题的整个方法将是一条死胡同,因为Multi-Alternative 约束不允许您为不同的约束模式提供不同的 asm。我希望约束最终会从寄存器发出 a ,而x约束最终会发出(折叠的广播负载)。使用内联 asm 执行此操作的目的是 gcc 还不知道如何将内存操作数折叠到广播加载中(但 clang 知道)。rvbroadcastssmvmulps (mem_src){1to16}, %zmm_src2, %zmm_dstset1()

无论如何,这个特定的问题是关于向量寄存器的操作数修饰符和约束。请关注这一点,但欢迎就其他问题发表评论和回答。(或者更好,只是评论/回答 Z Boson 关于嵌入式广播的问题。)

0 投票
2 回答
654 浏览

assembly - AVX512 矢量长度和 SAE 控制

我的问题涉及没有舍入语义的 EVEX 编码打包 reg-reg 指令,它允许 SAE 控制(抑制所有异常),例如 VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE* 等。英特尔仅在完整的情况下声明 SAE 意识512bit向量长度,例如

但我看不出为什么不能将 SAE 应用于使用 xmm 或 ymm 寄存器的指令。

英特尔指令集扩展编程参考表 4-7 的第 4.6.4 章中,在没有舍入语义的指令中,EVEX.b 位指定应用 SAE,而 EVEX.L'L 位指定显式向量长度:

所以他们的组合应该是合法的。

然而,NASM 组装vminpd zmm1,zmm2,zmm3,{sae} 为 62F1ED185DCB,即 EVEX.L'L=00b,EVEX.b=1,由 NDISASM 2.12 反汇编为vminpd xmm1,xmm2,xmm3

NASM 拒绝组装vminpd ymm1,ymm2,ymm3,{sae} ,NDISASM 将 62F1ED385DCB (EVEX.L'L=01b, EVEX.b=1) 分解为vminpd xmm1,xmm2,xmm3

我想知道 Knights Landing CPU 是如何执行VMINPD ymm1, ymm2, ymm3{sae} 的(组装为 62F1ED385DCB,EVEX.L'L=01b,EVEX.b=1)

  1. CPU 抛出异常。英特尔文档表 4-7 具有误导性。
  2. SAE 生效,CPU 仅使用 xmm 操作,与标量操作相同。NASM 和 NDISASM 做得对,英特尔文档是错误的。
  3. SAE 被忽略,CPU 根据 Intel 文档中的 VMINPD 规范以 256 位运行。NASM 和 NDISASM 是错误的。
  4. SAE 生效,CPU 以指令代码中指定的 256 位运行。NASM 和 NDISASM 错误,Intel doc 需要用 {sae} 补充修饰 xmm/ymm 指令。
  5. SAE 生效,CPU 以隐含的全向量大小 512 位运行,无论 EVEX.L'L 为何,就像允许静态舍入 {er} 一样。NDISASM 和 Intel 文档表 4-7 是错误的。
0 投票
1 回答
320 浏览

c - Knights Landing CPU (Xeon Phi) 会加速字节/字整数代码吗?

Intel Xeon Phi "Knights Landing" 处理器将是第一个支持 AVX-512 的处理器,但它只支持 "F"(比如没有 SSE2 的 SSE,或者没有 AVX2 的 AVX),所以主要是浮点数。

我正在编写通过内部函数使用高达 SSE4.1 指令对字节和字(8 位和 16 位)进行操作的软件。

我很困惑在 AVX-512F 中是否会有所有/大多数 SSE4.1 指令的 EVEX 编码版本,这是否意味着我可以期望我的 SSE 代码自动获得 EVEX 扩展指令并映射到所有新寄存器。

维基百科是这样说的:

SIMD寄存器文件的宽度从256位增加到512位,共有32个寄存器ZMM0-ZMM31。这些寄存器可以作为来自 AVX 扩展的 256 位 YMM 寄存器和来自 Streaming SIMD 扩展的 128 位 XMM 寄存器进行寻址,并且在使用 EVEX 时,可以扩展传统的 AVX 和 SSE 指令以对 16 个额外的寄存器 XMM16-XMM31 和 YMM16-YMM31 进行操作编码形式。

不幸的是,这并没有说明在启用 AVX512 的情况下编译 SSE4 代码是否会导致与将其编译为 AVX2 提供的相同(令人敬畏的)加速(遗留指令的 VEX 编码)。

有人知道为 AVX-512F 编译 SSE2/4 代码(C 内在函数)时会发生什么吗?可以期待像 AVX1 的字节和字指令的 VEX 编码那样的减速带吗?

0 投票
0 回答
103 浏览

c - 在 Intel Knights Corner(KNC,Xeon Phi Gen 1)上将 8 位无符号整数转换为浮点数/从浮点数转换

我正在为 Knights Corner (KNC) cpu 执行一个程序。它似乎有一个 AVX512 的原型作为它的指令集,但我在 Intel Intrinsic Guide 上找不到关于各种整数宽度之间转换的指示。

具体来说,我正在尝试将 8 位整数(无符号)转换为 32 位整数,以便可以使用 KNC 对它们进行操作。我怎样才能在 KNC 上做到这一点?是否有一些相当于 AVX512-F_mm512_cvtepu8_epi32()从 8 位到 32 位以及_mm512_cvtu[s]epi32_epi8()从 32 位回到 8 位?

0 投票
1 回答
335 浏览

struct - AVX float4/double4 结构

我正在寻找用于 float4 / double4 结构的 AVX-256/512 代码,该代码重载基本操作 *、+、/、-、标量缩放等,以便在使用 float4/ 编写的代码中从矢量操作中获得快速性能提升双4。OpenCL 将这些数据类型作为内在函数,但在 XeonPhi 上运行的 c++ 代码需要利用 512 位 SIMD 单元的新实现。