问题标签 [knights-landing]
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.
sse - Do the Airmont cores on Knight's Landing Xeon Phi's support SIMD instructions?
According to the source of the Wikipedia page on the Knight's Landing chip, it has Airmont cores. According to this page, those cores support SSE4.2 instructions, that is, SIMD instructions on SIMD registers. Is that really the case? If so, what's the actual maximum width of, say, arithmetic instructions on these Airmont cores? (In terms of total width of the register, or width of a lane or element within the register x number of lanes).
parallel-processing - 什么是_kmp_fork_barrier,如何查看是否存在负载不平衡?
我正在使用英特尔 VTune 放大器来查看我的并行应用程序如何扩展。
注意我没有使用任何显式锁定机制
它在我的 4 核笔记本电脑上可以很好地扩展(考虑到算法的某些部分无法并行化):
但是,当我在 Knights Landing (KNL) 上对其进行测试时,它的扩展非常可怕:
请注意,我故意只使用 64 个内核(说到这一点,如果您对线程亲和力感兴趣,我已经打开了关于该主题的另一个问题)。
为什么有这么多空闲时间?什么是_kmp_fork_barrier
?阅读有关“不平衡或串行旋转 (OpenMP)”的信息,这似乎与负载不平衡有关,但我已经schedule(dynamic,1)
在所有omp
地区使用。
如何查看这是否实际上是负载不平衡?否则,可能的原因是什么?
请注意,我有 3 个并行 omp 并行区域:
这是自下而上的部分:
这可能是因为reduction
? 我知道它非常有效(使用分而治之合并方法)。
在这里查看最昂贵的函数如何很好地并行化(其中大部分):
评论中要求的 OpenMP 直方图:
还原区域:
未知区域简介initInterTab2d
:
更新:
在禁用 TBB 和 OpenMP 的情况下构建 OpenCV 删除了这个奇怪的并行区域iniInterTab2D
。所以这肯定与 OpenCV 相关,但我不知道如何。
c - Sobel 滤波器(OpenMP 实现)
我正在尝试在 C 中实现 Sobel 滤波器的并行化 + 矢量化版本,其中 OpenMP 编译指示用于并行化,#pragma simd 用于矢量化。我的输入是 1024 x 1024 的 .pgm 图像。我使用英特尔编译器在 Xeon Knights Landing 处理器上使用以下命令进行编译:
所以我在一般代码中面临的问题是:
a) 我什么时候并行化,什么时候向量化。我有一个由四个 for 循环组成的嵌套 for 循环 - > 我应该并行化还是矢量化这段代码
b) 我的 'min' 和 'max' 值是错误的。它们都是共享变量,因此容易出现竞争条件,所以我在它们周围添加了一个#pragma omp critical。但是,为这两个变量打印的值仍然是错误的,我不知道为什么。我什至在 print 语句之前添加了一个屏障,以确保所有线程在打印出最小值和最大值之前都通过该关键部分
c) #pragma omp critical 使我的程序非常非常慢。事实上,执行时间甚至比顺序运行时间还要长。有什么办法可以避免吗?
我的pgm.h
至强.c
谢谢
avx - 如何检测 Xeon Phi (Knights Landing)
英特尔工程师写道,我们应该使用 VZEROUPPER/VZEROALL 来避免在所有处理器(包括未来的 Xeon 处理器,但不是 Xeon Phi)上昂贵地转换到非 VEX 状态:https ://software.intel.com/pt-br/node/ 704023
人们还测量并发现VZEROUPPER和VZEROALL在Knights Landing上很昂贵:
64 位模式下两条指令的 36 个时钟周期(32 位模式下 30 个时钟)。
请参阅上面的链接。
因此,如果我刚刚使用了 ymm0 和 ymm1,我的代码将如下所示:
如何检测 Xeon Phi(Knights Landing 和更高版本的 Xeon Phi 处理器)来实现上述代码?
我们现在有以下关于 VZEROUPPER/VZEROALL 的情况:
- 这些指令在 Xeon Phi Knight Landing 36 个时钟周期上对于 64 位模式下的两条指令(32 位模式下的 30 个时钟周期)是不需要的并且非常昂贵。
- 这些指令非常便宜,在 Xeon 和 Core 处理器 (Skylake/Kaby Lake) 上是必需的,在可预见的将来 Xeon 也需要这些指令,以避免昂贵的过渡到非 VEX 状态。
广告材料声称Xeon Phi(Knights Landing)与其他Xeon处理器完全兼容。
是否有可靠的方法来检测 Xeon Phi,以避免 VZEROUPPER/VZEROALL?
James R.有一篇文章“如何检测 Knights Landing AVX-512 支持(英特尔® 至强融核™ 处理器)”,更新于 2016 年 2 月 22 日,但它只关注 Knights Landing 上可用的特定新指令。所以关于 VEX 转换仍然不是很清楚。
很高兴知道英特尔是否计划实施 CPUID 位来显示非 VEX 状态是否成本高昂?例如:
- 位设置为 0 - VEX 状态转换成本高,但 VZEROUPPER/VZEROALL 成本低,应用于清除状态;
- 位设置为 1——没有转换惩罚,不需要 VZEROUPPER/VZEROALL。
上面提到的关于检测 Knights Landing 的文章建议检查 Knights Landing 中介绍的位 AVX-512F+CD+ER+PF。
所以代码建议一次检查所有这些位,如果都设置好了,那么我们就在 Knights Landing:
很高兴知道英特尔是否计划在不久的将来将这些所有位添加到简单的 Xeon(非 Phi)或 Core 处理器中,因此它们还将支持 AVX-512F+CD+ER+PF 中引入的功能骑士登陆?
如果 Xeon 和 Core 处理器将支持 AVX-512F+CD+ER+PF,我们将无法区分 Xeon 和 Xeon Phi。
请指教。
assembly - 在 Knights Landing 上清除单个或几个 ZMM 寄存器的最有效方法是什么?
说,我想清除 4 个zmm
寄存器。
下面的代码会提供最快的速度吗?
在 AVX2 上,如果我想清除ymm
寄存器,vpxor
它是最快的,比 更快vxorps
,因为vpxor
可以在多个单元上运行。
在 AVX512 上,我们没有vpxor
forzmm
寄存器,只有vpxorq
和vpxord
. 这是清除寄存器的有效方法吗?zmm
当我用 清除寄存器时,CPU 是否足够聪明,不会对寄存器的先前值产生错误的依赖关系vpxorq
?
我还没有物理 AVX512 CPU 来测试它——也许有人在 Knights Landing 上测试过?是否有任何延迟发布
multithreading - Knights Landing 中的可用线程
我在一个有 68 个内核和 4 个超线程/内核的 Knights Landing 节点上编程。我正在开发一个混合 MPI/OpenMP 应用程序。我的问题是这 4 个超线程是否打算用作 OpenMP 线程,或者我该如何使用它们?当我使用以下方案运行我的程序时:
它的运行速度比我使用该方案时快得多:
也许问题在于某个 MPI 的线程彼此不接近。但是,我不知道该怎么做。
总之,我可以将 4 个超线程/核心用作 OpenMP 线程吗?
谢谢。
c++ - 在编译行中添加“-march=native”英特尔编译器标志会导致 KNL 上的浮点异常
我有一个代码,我在 Intel Xeon Phi Knights Landing (KNL) 7210(64 核)处理器(它是一台 PC,处于本机模式)上启动并使用 Intel c++ 编译器(icpc)版本 17.0.4。我还在英特尔酷睿 i7 处理器上启动了相同的代码,其中 icpc 的版本是 17.0.1。更正确地说,我在启动它的机器上编译代码(在 i7 上编译并在 i7 上启动,对于 KNL 相同)。我从不在一台机器上制作二进制文件并将其带到另一台机器上。使用 OpenMP 对循环进行并行化和矢量化。为了获得最佳性能,我使用英特尔编译器标志:
在 i7 上一切正常。但是在 KNL 上,代码可以正常工作-march=native
,如果添加此选项,程序会立即抛出浮点异常。如果使用唯一标志“-march=native”进行编译,情况也是一样的。如果使用 gdb,它指向pp+=alpha/rd
代码的行:
Particle p[N];
- 一个粒子数组,Particle 是一个浮点结构。N - 最大粒子数。
如果要删除标志-march=native
或将其替换为-march=knl
或-march=core-avx2
,则一切正常。这个标志对程序做了坏事,但什么 - 我不知道。
我在网上找到(https://software.intel.com/en-us/articles/porting-applications-from-knights-corner-to-knights-landing,https://math-linux.com/linux/ Tip-of-the-day/article/intel-compilation-for-mic-architecture-knl-knights-landing)应该使用以下标志:-xMIC-AVX512
. 我尝试使用此标志和-axMIC-AVX512
,但它们给出了相同的错误。
所以,我想问的是:
为什么
-march=native
,-xMIC-AVX512
不工作和-march=knl
工作;是否-xMIC-AVX512
包含在-march=native
KNL 的标志中?我可以在 KNL 上启动代码时替换标志
-march=native
(-march=knl
在 i7 上一切正常),它们是否等效?如果使用英特尔编译器,为获得最佳性能而编写的标志集是最优的吗?
正如 Peter Cordes 所说,当程序在 GDB 中抛出浮点异常时,我将汇编器输出放在这里:1)(gdb)disas 的输出:
2) p $mxcsr 的输出:
3) p $ymm0.v8_float 的输出:
4) p $zmm0.v16_float 的输出:
我还应该提到,为了检测浮点异常,我使用了标准
我应该强调,当我收到这个错误时,我已经在使用feenableexcept 了。我从程序调试开始就使用它,因为我们在代码中有错误(浮点异常)并且必须更正它们。
x86 - 将 8 个字节的数组转换为 8 个整数
我正在与 Xeon Phi Knights Landing 合作。我需要从一个双打数组中进行收集操作。索引列表来自一个字符数组。收集操作是_mm512_i32gather_pd
或_mm512_i64gather_pd
。据我了解,我要么需要将 8 个字符转换为 8 个 32 位整数,要么将 8 个字符转换为 64 位整数。我已经选择了_mm512_i32gather_pd
.
我创建了两个函数get_index
并将get_index2
八个字符转换为__m256i
. 的组装get_index
比get_index2
查看https://godbolt.org/z/lhg9fX更简单。但是,在我的代码get_index2
中要快得多。为什么是这样?我正在使用 ICC 18。也许有比这两个功能更好的解决方案?
c++ - _mm512_i64gather_pd() 的内存访问错误
我正在尝试使用一个非常简单的 AVX-512 收集指令示例:
不幸的是,我最后一次调用_mm512_i64gather_pd
导致内存访问错误(内存转储)。
德语错误信息:Speicherzugriffsfehler (Speicherabzug geschrieben)
我正在使用英特尔至强融核 (KNL) 7210。
编辑:这里的错误是,我使用 32 位整数和 64 位加载指令,并且缩放必须_mm512_i64gather_pd
是 8 或sizeof(double)
.
go - 我可以在 Xeon Phi(Knight's Landing)处理器上编译 Go 程序吗?
我是一个业余爱好者,喜欢在 Go 中运行我自己的程序,而且随着 Xeon Phi 处理器变得更老,它们也变得非常便宜。如此便宜,我可以从 2015/16 年开始以 <1000 美元的价格建造一台双插槽机器
我试图找出是否可以在这些上运行 Go 程序。从我所见,这个线程说他们不会运行(并尝试 gccgo),但它说它不会运行,因为它部分运行在 x87 ISA 上。令人困惑的是,在 Go 发行说明中,他们说他们将在 1.16 中放弃对 x87 的支持,这意味着过去曾支持它。我在其他线程中看到所有程序都将在兼容层上运行,但这是一个非常慢的层,只能访问 CPU 缓存的一小部分。
我觉得我离我的元素越来越远了;我想知道使用 Xeon Phi 的人是否知道它是否会运行 Go 代码?或者只是一般来说,在启动 Ubuntu(或FreeBSD,我已经看到完成并列在主板规格中的东西)之后,什么样的事情不会起作用,什么会起作用?
我感谢任何和所有的帮助!