問題タブ [hyperthreading]
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.
rendering - ハイパースレッディング...レンダラーが10倍遅くなりました
エグゼクティブサマリー:OpenMPがREALコアのスレッドのみを使用する、つまりハイパースレッディングコアをカウントしないようにコードで指定するにはどうすればよいですか?
詳細な分析:何年にもわたって、私は空き時間にSWのみのオープンソースレンダラー(ラスタライザー/レイトレーサー)をコーディングしてきました。GPLコードとWindowsバイナリは、次の場所から入手できます 。https ://www.thanassis.space/renderer.html Windows、Linux、OS / X、およびBSDでコンパイルおよび実行されます。
私は先月レイトレーシングモードを導入しました-そして生成された写真の品質は急上昇しました。残念ながら、レイトレーシングはラスター化よりも桁違いに遅くなります。速度を上げるために、ラスターライザーの場合と同じように、レイトレーサーにOpenMP(およびTBB)のサポートを追加して、追加のCPUコアを簡単に利用できるようにしました。ラスター化とレイトレーシングはどちらも、スレッド化に簡単に対応できます(三角形ごとの作業-ピクセルごとの作業)。
自宅では、私のCore2Duoを使用して、2番目のコアがすべてのモードを支援しました。ラスター化モードとレイトレーシングモードの両方で、1.85倍から1.9倍のスピードアップが得られました。
問題:当然、最高のCPUパフォーマンス(GPU、予備のCUDAポートでも「遊ぶ」)を知りたいと思ったので、比較のための強固な基盤が必要でした。私は、16コア、1500ドルのIntelスーパープロセッサを搭載した「ビースト」マシンにアクセスできる私の親友にコードを渡しました。
彼はそれを「最も重い」モードであるレイトレーサーモードで実行します。
...そして彼は私のCore2Duoの5分の1の速度を手に入れました(!)
ガスプ-ホラー。今何があったの?
私たちはさまざまな修正やパッチを試し始めました...そして最終的にそれを理解しました。
OMP_NUM_THREADS環境変数を使用することにより、生成されるOpenMPスレッドの数を制御できます。スレッドの数が1から8に増加するにつれて、速度は増加していました(直線的な増加に近い)。8を超えた瞬間、速度が低下し始め、16コアすべてが使用されたときに、Core2Duoの速度の5分の1に急降下しました。
なぜ8?
8が実際のコアの数だったからです。他の8つは...ハイパースレッディングのものでした!
理論:さて、これは私にとってニュースでした-ハイパースレッディングが他のアルゴリズムで大いに役立つ(最大25%)のを見たので、これは予想外でした。どうやら、各ハイパースレッディングコアには独自のレジスタ(およびSSEユニット?)が付属していますが、レイトレーサーは追加の処理能力を利用できませんでした。それは私に考えさせました...
不足しているのはおそらく処理能力ではなく、メモリ帯域幅です。
レイトレーサーは、バウンディングボリューム階層データ構造を使用して、レイトライアングルの交差を加速します。ハイパースレッドコアが使用されている場合、ペアの各「論理コア」は、そのデータ構造内のさまざまな場所(つまりメモリ内)から読み取ろうとします。CPUキャッシュ(ペアごとにローカル)は完全に破棄されます。少なくとも、それは私の理論です-どんな提案も大歓迎です。
したがって、質問: OpenMPは「コア」の数を検出し、それに一致するスレッドを生成します。つまり、計算にハイパースレッドの「コア」が含まれます。私の場合、これは明らかに悲惨な結果につながります。OpenMP APIを使用して(可能であれば移植可能に)REALコアのスレッドのみを生成し、ハイパースレッドのスレッドは生成しない方法を知っている人はいますか?
PSコードはオープン(GPL)であり、上記のリンクから入手できます。ご使用のマシンで自由に再現してください。これは、すべてのハイパースレッドCPUで発生すると思います。
PPS投稿の長さすみません、それは教育的な経験だと思い、共有したいと思いました。
hyperthreading - ハイパースレッディングを備えたプロセッサでは、そうでないプロセッサよりも遅く実行される短い C プログラムが必要です
HyperTreading のコンパイラ最適化に関する論文を書きたいと思っています。最初のステップは、HyperThreading (Simultaneous Multithreading) を使用するプロセッサが、このテクノロジを使用しないプロセッサよりもパフォーマンスが低下する理由を調査することです。最初のステップは、HyperThreading を使用しない方が優れているアプリケーションを見つけることです。これにより、ハードウェア パフォーマンス カウンターを実行できます。どのように、またはどこで見つけることができるかについての提案はありますか?
ということで、まとめます。ハイパースレッディングのメリットが -10% から +30% の間であることはわかっています。パフォーマンスが 10% 低下する C アプリケーションが必要です。
ありがとう。
multithreading - ハイパー スレッド マシンで Indy Sockets が徐々に遅くなる
これはロングショットですが、誰かがアイデアを持っているかもしれません。マルチスレッド (20 ~ 25 スレッド) の Web クロール アプリケーションで .Net ソケット クラスを拡張するライブラリである IndySockets を使用しています。アプリは多数の異なるサーバーで実行されており、その中にはハイパースレッディングが有効になっているものもあります。
ハイパースレッディングを使用すると、最初はアプリケーションの効率が大幅に向上しますが (速度が 30 ~ 50% 向上)、これらのマシンでの IndySockets 呼び出しは数日かけて徐々に遅くなります。これは、ハイパースレッディングを使用しないマシンでは発生しません。
さらにややこしいことに、ハイパースレッディング マシンを再起動すると問題が解決するようです。つまり、アプリは再起動後、最初の非常に高速な速度で再び実行されます。アプリケーションを再起動しても効果はありません。
誰か提案があれば、私はそれを感謝します。ありがとう。
c# - ハイパースレッディングは機能していますか?
PC でかなりプロセッサを集中的に使用するものを実行していて、CPU 使用率がかなりおかしいことに気付きました。私の PC はクアッドコア i7-870 で、おそらく 8 つの仮想コアがあります。
私は .NET 4 で Task Parallel ライブラリを使用しているため、すべてのコアが適切に活用されると期待していますが、Process Monitor から次のような情報を取得しています。
コア 6 と 8 はほとんど影響を受けておらず、短いバーストを除けば、4 も影響を受けていません。
これは私が期待すべきことですか?
c++ - Visual Studio 2010, Maximum Concurrent C++ Compilations for Hyper-Threaded Processors
I am trying to optimise the compilation time of a large VC++ project. My processor is a Core i7 950 (4 Cores, 8 Threads since it supports Intel Hyper-Threading Technology).
In Microsoft Visual Studio 2010, if you go to Tools>Options>Projects and Solutions>VC++ Project Settings>Maximum Concurrent C++ complilations
you can select the maximum of CPU cores to use for parallel C++ compilation. I select 0 there (so that all my cores are used), which produces exactly the same results as when using 4 or 8.
Now, if I open the Task Manager whilst compiling the project, I can see that 4 parallel compilation threads are running (Under processes they have the description: Microsoft C/C++ Compiler Driver), and that the total CPU usage is a bit less than 50% all the time.
So my question is:
Is it possible to have 8 parallel compilation threads in a quad core, hyper-threaded processor? If this is not possible, then is it possible somehow to use near 100% the processor power whilst compiling?
This is will save me a huge amount of time.
Thank you very much in advance,
Nicholas
hyperthreading - ハイパースレッディングのパフォーマンスとゲーム サーバー
私はそれについていくつかの確固たる事実を見つけるのに苦労しており、実際に自分でベンチマークを実行することはできないので、ここで質問することにしました:
ハイパースレッディングは、複数のシングルスレッド CPU 負荷の高いアプリケーションを実行するマシンでパフォーマンスを低下させる可能性がありますか? 私の場合、約 6 つのゲーム サーバーを実行する Xeon クアッド コアであり、そのうちの 5 つはソース エンジン上にあります。
私の仲間のコミュニティ リーダーは、サーバーで HT を無効にするとパフォーマンスが向上すると主張し続けています。彼の主張を確認または否定する事実を持っている人はいますか?
linux - LinuxはハイパースレッディングコアIDを見つけます
私は今朝、どのプロセッサIDがハイパースレッドコアであるかを判断する方法を見つけようとして過ごしましたが、運がありませんでした。
set_affinity()
この情報を見つけて、プロセスをハイパースレッドスレッドまたは非ハイパースレッドスレッドにバインドして、そのパフォーマンスのプロファイルを作成するために使用したいと思います。
linux-kernel - カーネルモジュールで物理および論理コア番号を見つける方法は?
カーネルモジュールが実行されている物理コアと論理コア (ハイパースレッディングの場合) の数を返す Linux のカーネル関数はありますか?
c++ - C++ プログラムでトポロジーを考慮してマルチコア HT にアフィニティを実装する方法は?
スレッド数が可変の C++ マルチコア プログラムを開発していますが、適切な (実際には「最高の」) アフィニティを設定する方法を知りたいです。私は Boost-threads を使用しているので、get_hardware_concurrency() を呼び出して論理コアの数を知ることができます。今まで、「n_th スレッドから n 番目の論理コア」へのマッピングを書きましたが、マルチソケット プロセッサと HyperThreading のせいで、これはあまり賢明なことではありません。私のプログラムは常に SIMD に似ているため、スレッド間で共有するものは何もありません。HT コンピューターの場合、想像できる最もスマートな方法でスレッドを論理コアにバインドしたいと考えています。最初の物理上の最初の論理コア、 2 番目の物理上の 1 番目の論理、...、n 番目の物理上の 1 番目の論理、1 番目の物理上の 2 番目の論理など。
HT が有効かどうか (CPUID) を検出する方法と、パッケージごとに論理コアと物理コアを決定する方法について議論されている多くの資料を見つけました。いくつかのアセンブリ コードを処理する必要があることはわかっており、怖くはありませんが、論理コア、物理コア、およびパッケージに関する完全な情報と、OS がそれらすべてを処理する方法を知る方法を本当に見つけることができませんでした。
私ができる最も簡潔であること:OS(WindowsおよびLinux)によって N-th として参照されるスレッドの正確な場所(物理コアとパッケージ)をどのように知ることができますか?
linux-kernel - スレッドのステータスが running になっているのに、CPU をまったく使用していないのはなぜですか?
今日、私は非常に奇妙な問題を見つけました。Redhat Enterprise Linux 6 を実行し、CPU は Intel E31275 (4 コア、8 スレッド) でした。1 つのカーネル スレッド (my_thread と呼んでいます) が正しく動作しないことがわかりました。「ps」コマンドを使用すると、my_thread のステータスが常に実行中であることがわかりました。
しかし、その実行時間は常に 3:14 でした。実行中だったのに、合計時間が増えなかったのはなぜですか? proc ファイル /proc/5545/sched から、このスレッドのウェイクアップ数 (se.nr_wakeups) を含むすべての統計も常に同じであることがわかりました。
/proc/5545/stack から、このスレッドがこの関数を呼び出し、返されないことがわかりました。
理論的には、この関数は、他のスレッドがスレッドを起こしていない場合、3 秒ごとに戻ります。関数が戻るたびに、/proc/5545/sched の se.nr_wakeups が 1 ずつ増加します。しかし、スレッドに問題があることがわかった後は、これは発生しませんでした。
誰にもいくつかのアイデアがありますか?interruptible_sleep_on_timeout() が戻らない可能性はありますか?
更新: このスレッドに CPU アフィニティを設定すると、問題は発生しないことがわかりました。専用のコアに固定すれば、すべて問題ありません。SMP スケジューリングに問題はありますか?
再更新: BIOS でハイパースレッドを無効にしてから、今までそのような問題は見られませんでした。