问题标签 [xeon-phi]

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 回答
524 浏览

c++ - 如何将单个应用程序的特定线程卸载到特定的 Xeon Phi 内核?

假设我在主机上运行了一个 c/c++ 应用程序。主机 CPU 上运行的线程很少,Xeon Phi 内核上运行的线程有 50 个。

我如何确保这 50 个中的每一个都在其自己的 Xeon Phi 内核上运行,并且永远不会从内核缓存中清除(假设代码足够小)。

有人可以概述一个非常笼统的想法如何做到这一点以及哪个工具/API更适合(对于C/C++代码)?

在主机线程聚合器和 50 个 Phi 线程之间交换数据的最快方法是什么?

鉴于实际的并行性将非常有限——这个应用程序将更像 51 线程平面应用程序,具有一些基本的多线程数据同步。

我可以使用传统的 C/C++ 编译器来创建这样的应用程序吗?

0 投票
2 回答
1627 浏览

c++ - 是否有 Xeon Phi 的模拟器/模拟器?

我打算将一些计算卸载到 Xeon Phi,但想首先测试不同的 API 和不同的并行编程。

是否有 Xeon Phi(Windows 或 Linux)的模拟器/模拟器?

0 投票
3 回答
1319 浏览

opencl - Xeon Phi 上的 OpenCL:2D 卷积体验 - OpenCL 与 OpenMP

在 opnecl 中使用 2D 卷积进行基准测试的 Xeon Phi 的性能似乎比 openmp 实现要好得多,即使使用了支持编译器的向量化也是如此。Openmp 版本在 phi 原生模式下运行,时间仅测量计算部分:For-loop。对于 opencl 实现,计时也仅用于内核计算:不包括数据传输。OpenMp-enbaled 版本使用 2,4,60,120,240 个线程进行了测试。- 240 个线程为平衡线程关联设置提供了最佳性能。但是,即使对于 240 线程的 openmp 基线,Opencl 的性能也提高了大约 17 倍,其中启用了编译指示的矢量化是源代码。输入图像尺寸为 1024x1024 到 16384x16384,过滤器尺寸为 3x3 到 17x17。在调用运行中,opencl 优于 openmp。这是opencl的预期加速吗?似乎好得令人难以置信。

编辑:

编译(openmp)

来源(Convole.cpp):

源 2 (convolve.cl)

OpenMP 的结果(与 OpenCL 相比):

*原始内核执行时间。不包括通过 PCI 总线的数据传输时间。

0 投票
2 回答
937 浏览

parallel-processing - Xeon-Phi 从主机 openMP 并行区域异步卸载

我在主机 openMP 代码中使用英特尔的卸载编译指示。代码如下

将 $x$ 的代码卸载计算到 MIC。代码通过将一些 openMP 分配给 CPU 内核来保持忙碌。上面的代码按预期工作。但是,第一次卸载 pragma 需要花费大量时间,并且已成为瓶颈。尽管如此,总体而言,将 $x$ 的计算卸载到 MIC 是值得的。我正在尝试解决此延迟问题的一种方法如下

所以这个新代码分配了一个线程来进行卸载,而其他 openmp 线程可以用于其他工作共享结构。但是,此代码不起作用。我收到以下错误消息

卸载报告指出,上述代码是罪魁祸首。一种临时解决方法是使用常量作为信号,即信号(0),它可以工作。但是,我需要一个更永久的解决方案。任何人都可以对我的代码中出了什么问题有所了解。

谢谢

0 投票
1 回答
1282 浏览

c++ - 对宽寄存器(尤其是至强融核)具有未对齐数据访问的矢量化/优化循环

这是我第一次向 Stackoverflow 社区提问。很抱歉,如果我的问题不符合论坛的风格/大小 - 会随着经验而改进。

我正在尝试使用 Intel Compiler 14.0.1 对 C++ 中的循环进行矢量化,以更好地利用宽 512 位寄存器在 Intel Xeon Phi 上进行速度优化。(受https://software.intel.com/en-us/articles/data-alignment-to-assist-vectorization启发)和 Google 上的大量参考资料表明,数据对齐在 Xeon Phi 上比在现代 Xeon 处理器上更重要,它仍然很重要(其中一个在很好的概述中https://indico.cern.ch/event/238763/material/slides/6.pdf第 18 页)。

这个问题有点类似于unaligned memory accesses,但涵盖了一个更简单/更广泛的示例,并希望有一个更明确的答案。

一段代码示例:

func() 在主体中被调用 150-2000 次,为 x 和 y 重新使用预先分配的空间(为了避免持续的内存分配,这可能在 Phi 上比在普通 Xeon 上更耗时)。身体在每个核心上重复数百万次。

问题是 x[i] 和 x[i+1] 对于 512 位向量引擎来说本质上是未对齐的,由于 x[i+1] 部分的内存访问未对齐,因此向量化不是最佳的。

在 k++ 循环之前预先分配一个 64 字节对齐的 _x 一次,在 k++ 循环的每次迭代中执行 memcpy 以用 x 的前向值填充预分配的内存,在速度方面会有什么好处吗?(等价于 for (int j=0; j<N; j++) _x[0]=x[i+1]; with memcpy),以便 #pragma 向量对齐可以在 func() 中使用y[i] = fmax(_x[i] * a0 + x[i] * a1, x[i] * a2 + a3);?

是否有一些很好的方法可以有效地处理这个相当普遍的标准问题,以充分利用矢量引擎?

任何关于如何优化宽寄存器处理器矢量化的建议也非常受欢迎(这似乎是一个非常有趣的话题,英特尔最近的趋势是增强数据和任务并行性)

0 投票
2 回答
371 浏览

openmp - 具有英特尔 MIC 卸载的异构 OpenMP 并行循环

我正在编写一个代码,其中包含一个具有许多迭代(~10^6-10^7)的循环,其中一个数组(比如说,'myresult')是通过对大量贡献的求和来计算的。在带有 OpenMP 的 Fortran 90 中,这将类似于:

代码将在带有英特尔至强协处理器的系统上运行,如果可能的话,当然希望从它们的存在中受益。我曾尝试将 MIC 卸载语句 (!dir$ offload target ...) 与 OpenMP 一起使用,以便循环仅在协处理器上运行,但是当它坐在那里等待协处理器完成时,我正在浪费主机 CPU 时间。理想情况下,可以划分主机和设备之间的循环,所以我想知道以下类似的方法是否可行(或者是否有更好的方法);循环只会在主机上的一个核心上运行(尽管可能使用 OMP_NUM_THREADS=2?):

0 投票
2 回答
1060 浏览

c - 英特尔至强融核使用的内在函数是否比自动矢量化获得更好的性能?

Intel Xeon Phi 提供使用“IMCI”指令集,
我用它来做“c = a*b”,像这样:

并测试它的性能,当 N SIZE 为 1048576 时,
它需要花费 0.083317 秒,我想将性能与自动矢量化进行比较,
所以其他版本代码如下:

这个版本花费 0.025475 秒(但有时花费 0.002285 或更少,我不知道为什么?)
如果我将 _Cilk_for 更改为 #pragma omp parallel for,性能会很差。

那么,如果答案是这样的,为什么我们需要使用内在函数?
我在哪里犯错了吗?
有人可以给我一些优化代码的好建议吗?

0 投票
1 回答
404 浏览

linux - 编译时 OpenCL 库链接因 Xeon Phi 失败

我想在 Xeon Phi 协处理器上运行 OpenCL,
所以我尝试在我的服务器上安装 Intel OpenCL SDK,
现在,我可以在主机上正确运行 OpenCL,但我尝试将代码编译为 MIC 使用,如下所示:

“libOpenCL.so”是存在的,它可以在没有标签“-mmic”的情况下运行良好,
我感觉很糟糕,我能做些什么来解决它?

0 投票
1 回答
93 浏览

multithreading - 是否有最小化线程数的搜索算法?

我正在使用 Intel Xeon Phi 协处理器,它有多达 240 个线程,并且我正在努力将用于特定应用程序的线程数最小化(或最大限度地提高性能),同时保持在最佳执行时间的百分比范围内。例如,如果我有以下测量值:

  • 主题 | 执行时间处理时间
  • 240 100 秒
  • 200 105 秒
  • 150 107 秒
  • 120 109 秒
  • 100 120 秒

我想选择 120 到 150 之间的线程数,因为那里的“性能曲线”似乎稳定了,并且执行时间的减少并不那么显着(在这种情况下,大约是最佳测量时间的 15%。我这样做了使用详尽的搜索算法(测量从 1 到 240 个线程),但我的问题是线程数量较少(显然取决于问题的大小)需要很长时间。

为了尽量减少测量次数,我开发了一种“二分搜索”算法。基本上我有一个上限和下限(从 0 和 240 个线程开始),我取中间的值并在 240 处测量它。我得到两个值之间的百分比差异,如果它在 15% 以内(这个值是在分析详尽搜索的结果后选择)我分配了一个新的下限或上限。如果差异大于 15%,那么这是一个新的下限 (120-240),如果它更小,那么它是一个新的上限 (0-120),如果我得到更好的执行时间,我将其存储为最佳执行时间。

该算法的问题在于,首先这不一定是执行时间的排序数组,并且对于某些问题大小,详尽的搜索结果显示了两个不同的最小值,因此例如在一个中,我在 80 个线程和170,我希望能够返回 80,而不是 170 作为搜索结果的线程。然而,对于只有一个最小值的其他情况,该算法找到了一个非常接近预期值的值。

如果有人有更好的想法或知道可以帮助我的现有搜索算法或启发式方法,我将不胜感激。

0 投票
3 回答
736 浏览

debugging - 调试 Intel Xeon Phi Native 应用程序

我想在英特尔至强融核上调试本机应用程序。我安装了提供 gdb-mic 的 MPSS 3.2.3,但它似乎并没有在本地运行。在一些文档中,他们提到了一个文件“/usr/linux-k1om-4.7/linux-k1om/usr/bin/gdb”,但是在那个目录中我只有gdbserver,没有gdb。

任何人都知道如何在英特尔至强融核上调试本机应用程序?