6

C++ コード上の C# 相互運用レイヤーで構成されるマルチスレッド プログラムがあります。スレッド アフィニティを設定しています (この投稿のように)。コードの一部では機能しますが、2 番目の部分では機能しません。インテル® コンパイラー / IPP / MKL ライブラリー / インライン・アセンブリーは、外部アフィニティー設定に干渉できますか?

更新: 多くの dll を含む環境全体であるため、コードを投稿できません。環境値を設定しました: OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 IPP_NUM_THREADS=1. シングルスレッドで実行すると問題なく実行されますが、C#スレッドの数を使用し、スレッドごとにアフィニティを設定すると(クアッドコアマシンで)、初期化は別々のコアでうまくいきますが、処理中にすべてのスレッドが同じものを使用し始めます芯。私が十分に明確であることを願っています。

ありがとう。

4

1 に答える 1

11

これとまったく同じ問題がありました。スレッド アフィニティを希望どおりに設定すると、IPP/MKL 関数がそれを吹き飛ばしてしまいます。あなたの質問に対する答えは「はい」です。

自動並列処理

問題は、デフォルトでは、Intel ライブラリがルーチンのマルチスレッド バージョンを自動的に実行することです。そのため、単一の FFT は、特にこの目的のためにライブラリによって設定された多数のスレッドによって計算されます。

インテルの意図は、プログラマーがシングルスレッド アプリケーションを作成する作業を進めることができるようにすることであり、ライブラリーは、数学作業用に多数のスレッドを作成することで、そのシングル スレッドがマルチコア プロセッサの恩恵を受けられるようにすることです。高貴な意図 (達成可能な最高のパフォーマンスを引き出すために、ソース コードは実行時ハードウェアについて何も知る必要はありません。便利な場合もあります) ですが、自分自身の理由で独自のスレッドを実行している場合は、まさに血まみれの迷惑です。

ライブラリの動作の制御

これらのIntel docsのサポート関数/スレッド化サポート関数のセクションをご覧ください。ライブラリのスレッド化の傾向をプログラムで制御するか、プログラムを実行する前に設定できる環境変数 (MKL_NUM_THREADS など) を使用できます。スレッドの数を設定するだけで (私が思い出す限り)、ライブラリが独自の処理を行うのを停止するのに十分でした。

あなたの質問に答えることに触発された哲学的エッセイ(無視するのが最善)

Intel が CPU 設計とソフトウェア (IPP/MKL など) で行っていることは多かれ少なかれすべて、プログラマーがスレッドについて心配する必要がないようにすることを目的としています。あなたは良い数学のパフォーマンスをしたいですか?MKL を使用します。for ループを速くしたいですか?ICC で自動並列化をオンにします。キャッシュを最大限に活用したいですか? それがハイパースレッディングの目的です。

それは悪いアプローチではなく、個人的に言えば、彼らはかなり良い仕事をしたと思います. AMDも。彼らのアーキテクチャは、学習、書き直し、およびコード開発への最小限の投資で、「平均的なプログラマー」に優れた現実世界のパフォーマンスの改善を提供するのに非常に優れています.

刺激

しかし、私を少しいらいらさせているのは (恩知らずに見えたくないのですが!)、このアプローチは大多数のプログラマー (収益性の高い市場がある場所) には有効ですが、より多くの障害を投げかけることです。独自の並列処理を実行したいプログラマーの邪魔になります。もちろん、Intel を責めることはできません。Intel はまさに正しいことをしたのです。彼らは市場主導の会社であり、売れる物を作る必要があります。

これらの簡単な機能を提供することで、熟練したプログラマーや訓練を受けていないプログラマーが多すぎるという状況がより定着します。すべてのプログラマーが、自動並列処理が実際に何を行っているかを学ぶ必要なく、優れたパフォーマンスを得ることができるのであれば、先に進むことはありません。そのことを実際に知っている本当に優秀なプログラマーのプールは、非常に小さいままです。

問題

これは問題だと思います(小さな問題ですが、後で説明します)。コンピューティングは、経済と環境の両方の理由から、より効率的になる必要があります。インテルのアプローチはパフォーマンスの向上を可能にし、より優れたシリコン製造技術により消費電力を削減しますが、私は常に、それが可能な限り効率的ではないと感じています.

PS3 の心臓部にある Cell プロセッサを取り上げます。それは私が際限なくつぶやくのが好きなものです! しかし、IBM は Intel とはまったく異なる哲学でそれを開発しました。彼らはキャッシュを提供しませんでした (代わりに、適切と思われるように使用する代わりにいくつかの高速な静的 RAM を提供しました)。アーキテクチャはほぼ純粋な NUMA であり、すべて独自の並列化を行う必要がありました。 2005 年には 80 ワットで、約 250GFLOPS を得ることができました (PS3 以外のバージョンは 320GLOPS になったと思います)。

単一のデバイスがそのレベルのパフォーマンスに到達するには、Intel チップがさらに 6 年から 7 年かかります。それはムーアの法則の成長の多くです。Cell が Intel の最新のシリコン ファブで製造され、Intel が大きな Xeon に搭載したのと同じ数のトランジスタが与えられたとしても、他のすべてを吹き飛ばしてしまうでしょう。

ノーマーケット

ただし、PS3 を除けば、Cell は初心者向けの市場提案ではありませんでした。IBM は、時間をかけるだけの価値があるほど大きな売り手にはならないだろうと判断しました。それを実際に使用できるプログラマーが十分ではなく、商業的な意味を持たず、株主を喜ばせない少数の私たちを甘やかすことができませんでした。

小さな問題、大きな問題

先ほど、これは小さな問題だと言いました。まあ、世界のコンピューティングのほとんどは、高い数学パフォーマンスではなく、Facebook や Twitter などになっています。そのようなものはすべて I/O パフォーマンスに関するものであり、そのために高い数学パフォーマンスは必要ありません。その意味で、平均的なプログラマーが優れた数学のパフォーマンスを得るための Intel Doing Everything For You への依存は、ほとんど問題になりません。設計哲学の変更を正当化するのに十分な数の計算が行われていません。

実際、大規模なチップはまったく必要なく、ARM で十分に機能するはずであると最終的に世界が判断するのではないかと私は強く思っています。それが実現すれば、非常に優れた汎用数学計算性能を備えた Intel の超大型チップの市場は消滅するでしょう。事実上、優れた数学のパフォーマンスを求める使用者は、膨大な量のデータ センターを Intel ベースのハードウェアで満たし、すべてのデスクトップに Intel PC を配置したいと考えている人々から多額の補助を受けています。

幸いなことに、Intel は、ほとんどのユーザーが実際に数学のパフォーマンスを使用しているかどうかに関係なく、構築するすべての大型 CPU が数学に優れていることを確認したいと考えているようです。欲望の根底にあるのは、マーケティングの腕前と自慢したい権利ですが、それらは株主価値をもたらす商業的に具体的な成果物ではありません。

では、これらのデータセンター担当者が、実際には電力を節約し、データセンターを ARM で満たすことを決定した場合、Intel はどこに行くのでしょうか? ARM は、意図された目的には適したデバイスですが、私のスーパーコンピューター チップ リストの上位にはありません。それで、それは私たちをどこに置きますか?

傾向

現在の市場動向に対する私の見解は、1980 年代 / 90 年代初期と同じように、「ワークステーション」(現在は PC と呼んでいます) のコストが非常に高くなり始めるということです。

次の大きなチップを作るために必要な 100 億ドルを惜しむ人は誰もいないので、より優れたスーパーコンピューターは手頃な価格ではなくなると思います。人々が PC を所有しなくなると、大規模なオールアウト GPU のマス マーケットがなくなるため、代わりにそれらを使用することさえできなくなります。それらは排他的なものですが、スーパーコンピューターは私たちの世界で重要な役割を果たしており、より良くするためにそれらが必要です. では、誰がその費用を負担するのでしょうか? 私ではありません、それは確かです。

おっと、それはかなり長く続きました...

于 2013-10-11T05:16:12.323 に答える