6

我有一个多线程程序,它由 C++ 代码上的 C# 互操作层组成。我正在设置线程亲和力(就像在这篇文章中一样),它适用于我的部分代码,但在第二部分它不起作用。英特尔编译器/IPP/MKL 库/内联汇编会干扰外部关联设置吗?

更新:我无法发布代码,因为它是包含许多 dll 的整个环境。我设置环境值:OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 IPP_NUM_THREADS=1. 当它在单线程中运行时,它运行正常,但是当我使用 C# 线程数并设置每个线程的亲和性(在四核机器上)时,初始化在单独的内核上运行良好,但在处理期间所有线程都开始使用相同的核。希望我足够清楚。

谢谢。

4

1 回答 1

11

我们遇到了这个确切的问题;我们将我们的线程关联设置为我们想要的,而 IPP/MKL 函数将把它吹走!您的问题的答案是“是”。

自动并行

问题是,默认情况下,英特尔库喜欢自动执行例程的多线程版本。因此,单个 FFT 由库专门为此目的设置的多个线程计算。

英特尔的意图是程序员可以继续编写单线程应用程序,并且该库将允许该单线程通过为数学工作创建多个线程来从多核处理器中受益。一个崇高的意图(您的源代码然后不需要对运行时硬件一无所知以提取可实现的最佳性能 - 有时很方便),但是当一个人出于自己的原因做自己的线程时,这是一个正确的血腥滋扰。

控制库的行为

查看这些英特尔文档,支持功能/线程支持功能部分。您可以以编程方式控制库的线程趋势,也可以在程序运行之前设置一些环境变量(如 MKL_NUM_THREADS)。设置线程数(据我所知)足以阻止库做自己的事情。

受回答问题启发的哲学论文(最好忽略)

英特尔在 CPU 设计和软件(例如 IPP/MKL)方面所做的一切或多或少都是为了让程序员不必担心线程。你想要好的数学成绩吗?使用 MKL。你想让那个 for 循环快点吗?在 ICC 中打开自动并行化。您想充分利用缓存吗?这就是超线程的用途。

这不是一个坏方法,而且我个人认为他们做得很好。AMD也是。他们的架构非常擅长为“普通程序员”提供良好的现实世界性能改进,以最少的学习、重写和代码开发投资。

刺激

然而,让我有点恼火的事情(虽然我不想显得忘恩负义!)是虽然这种方法适用于大多数程序员(这是有利可图的市场),但它只会带来更多障碍以那些想要旋转自己的并行性的程序员的方式。这当然不能怪英特尔,他们做的完全正确。他们是一家以市场为导向的公司,他们需要制造能够销售的东西。

通过提供这些简单的功能,有太多缺乏技能和训练有素的程序员的情况变得更加根深蒂固。如果所有程序员都可以在不必了解自动并行实际在做什么的情况下获得良好的性能,那么我们将永远不会继续前进。真正了解这些东西的真正优秀程序员的数量仍然很少。

问题

我认为这是一个问题(虽然只是一个小问题,我稍后会解释)。出于经济和环境的原因,计算需要变得更加高效。英特尔的方法可以提高性能,更好的硅制造技术可以降低功耗,但我总觉得它的效率不如预期的那么高。

例子

以 PS3 核心的 Cell 处理器为例。这是我喜欢无休止地喋喋不休的事情!然而,IBM 以与英特尔完全不同的理念开发了它。他们没有给你缓存(只是一些快速的静态 RAM,而不是你认为合适的使用),架构几乎是纯 NUMA,你必须自己做所有的并行化等等。结果是,如果你真的知道什么你正在做的事情可以得到大约 250GFLOPS(我认为非 PS3 变体达到 320GLOPS),80Watts,一直到 2005 年。

英特尔芯片需要大约 6 或 7 年左右的时间才能让单个设备达到这种性能水平。这是摩尔定律的很多增长。如果 Cell 是在英特尔最新的硅晶圆厂制造的,并且提供的晶体管数量与英特尔在其大型 Xeon 中投入的晶体管数量一样多,那么它仍然会摧毁其他一切。

没有市场

然而,除了 PS3,Cell 是一个非首发的市场主张。IBM 决定,它永远不会是一个足够大的卖家,值得他们花时间。只是没有足够的程序员可以真正使用它,并且放纵我们这些没有商业意义的少数人,这不会取悦股东。

小问题,大问题

我之前说过,这只是一个小问题。嗯,世界上大多数计算都不是关于高数学性能的,它已经变成了 Facebook、Twitter 等。那种都是关于 I/O 性能的,为此你不需要高数学性能。所以从这个意义上说,依赖英特尔为你做所有事情,这样普通程序员获得良好的数学性能就无关紧要了。只是没有足够的数学来保证设计理念的改变。

事实上,我强烈怀疑世界最终会决定你根本不需要大芯片,ARM 应该就可以了。如果这种情况真的发生了,那么具有非常好的通用数学计算性能的英特尔超大型芯片的市场将会消失。实际上,那些希望获得良好数学性能的用户正在得到那些希望用基于英特尔的硬件填充大量数据中心并将英特尔 PC 安装在每个台式机上的人的大量补贴。

我们很幸运,英特尔显然希望确保他们构建的每一个大型 CPU 都擅长数学,无论他们的大多数用户是否真的使用这种数学性能。我敢肯定,这种欲望的基础在于营销能力和想要吹嘘的权利,但这些并不是为股东带来价值的硬的、有商业价值的人工制品。

因此,如果那些数据中心的人决定,实际上,他们宁愿节省电力并用 ARM 填充他们的数据中心,那英特尔将何去何从?ARM 是其预期用途的优秀设备,但它们不在我的超级计算机芯片列表的顶部。那么,我们将何去何从?

趋势

我对当前市场趋势的看法是,“工作站”(我们现在称之为 PC)将开始花费大量资金,就像 1980 年代 / 90 年代初那样。

我认为更好的超级计算机将变得无法负担,因为没有人能省下 100 亿美元来制造下一个大芯片。如果人们不再拥有 PC,那么大型全功能 GPU 将不会有大众市场,因此我们甚至无法使用这些 GPU。它们是独一无二的东西,但超级计算机确实在我们的世界中发挥着至关重要的作用,我们确实需要它们来变得更好。那么谁来为此买单呢?不是我,这是肯定的。

哎呀,持续了好久……

于 2013-10-11T05:16:12.323 回答