問題タブ [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.

0 投票する
2 に答える
2246 参照

opencl - CPU/Intel OpenCL のパフォーマンスの問題、実装に関する質問

ここ数日間、答えのない質問が宙に浮いています。同じ問題の OpenMP と OpenCL の実装があるため、質問が発生しました。OpenCL は GPU 上で完全に実行されますが、CPU 上で実行するとパフォーマンスが 50% 低下します (OpenMP 実装と比較して)。OpenMP と OpenCLのパフォーマンスの違いについては既に投稿されていますが、私の質問には答えていません。現時点では、次の質問に直面しています。

1) 「ベクトル化されたカーネル」(Intel Offline Compiler に関して)を持つことは本当に重要ですか?

同様の投稿がありますが、私の質問はより一般的だと思います。

私が理解しているように、ベクトル化されたカーネルは、コンパイルされたバイナリにベクトル/SIMD 命令がないことを必ずしも意味しません。カーネルのアセンブリ コードを確認したところ、SIMD 命令がたくさんありました。ベクトル化されたカーネルとは、SIMD 命令を使用することで、1 つの CPU スレッドで 4 つ (SSE) または 8 つ (AVX) の OpenCL "論理" スレッドを実行できることを意味します。これは、すべてのデータがメモリに連続して保存されている場合にのみ実現できます。しかし、誰がそのように完全にソートされたデータを持っているでしょうか?

私の質問は次のとおりです。この意味で、カーネルを「ベクトル化」することは本当に重要ですか?

もちろん、パフォーマンスは向上しますが、カーネル内の計算集約的な部分のほとんどがベクトル命令によって実行される場合、「最適な」パフォーマンスに近づく可能性があります。私の質問に対する答えは、メモリ帯域幅にあると思います。おそらく、効率的なメモリアクセスにはベクトルレジスタの方が適しています。その場合、カーネル引数 (ポインター) をベクトル化する必要があります。

2) CPUのローカル メモリにデータを割り当てると、どこに割り当てられますか? OpenCL は L1 キャッシュをローカル メモリとして表示しますが、明らかに GPU のローカル メモリと同じタイプのメモリではありません。RAM /グローバルメモリに保存されている場合、データをそこにコピーしても意味がありません。それがキャッシュにある場合、他のプロセスがそれをフラッシュする可能性があります...したがって、それも意味がありません。

3) 「論理的な」OpenCL スレッドは、実際の CPU ソフトウェア/ハードウェア (Intel HTT) スレッドにどのようにマップされますか? 実行時間が短いカーネルがあり、カーネルが TBB (スレッド ビルディング ブロック) や OpenMP のようにフォークされている場合、フォークのオーバーヘッドが支配的になります。

4) スレッドフォークのオーバーヘッドは? 「論理的な」OpenCL スレッドごとにフォークされた新しい CPU スレッドがありますか、それとも CPU スレッドが一度フォークされ、より多くの「論理的な」OpenCL スレッドに再利用されますか?

これらの小さなことに興味を持っているのは私だけではないと思います. 前もって感謝します!


アップデート

3) 現時点では、OpenCL のオーバーヘッドは OpenMP よりも大きいため、ランタイムを効率的に実行するには重いカーネルが必要です。Intel OpenCL では、ワークグループが TBB スレッドにマップされるため、1 つの仮想 CPU コアがワークグループ全体 (またはスレッドブロック) を実行します。ワークグループは 3 つのネストされた for ループで実装され、可能であれば最も内側のループがベクトル化されます。したがって、次のように想像できます。

最も内側のループをベクトル化できる場合、SIMD ステップで進みます。

4) すべての TBB スレッドは、OpenCL の実行中に 1 回フォークされ、再利用されます。すべての TBB スレッドは、仮想コアに関連付けられています。計算中にスレッドの移行はありません。

@natchouf-s の回答も受け付けます。

0 投票する
1 に答える
743 参照

linux - ATLAS を構築するための独立した CPU (アフィニティ ID で指定) の決定

ハイパースレッディング(ubuntu 12.04)を備えた4つのIntel CPUを搭載したLinuxマシンでATLASを構築するための独立したCPU(アフィニティIDで指定)を決定しようとしています。

私がこれを行っている理由は、ハイパースレッディングを備えたマシンでは物理コアのみを使用するように ATLAS マニュアルに記載されているためです。これを達成する方法については、次のように述べています 。残念ながら、ATLAS は現在これらの機能を自動検出することはできませんが、実験すれば、どのアフィニティ ID が個別のコアであるかを見つけることができます..."

さらに、この実験を実際に行う方法についてのヒントが示されています。

私のマシンでは、ファイル /proc/cpuinfo に 8 つの仮想プロセッサに関する次の情報が含まれています。

    • プロセッサ: 0
    • vendor_id : 純正インテル
    • CPUファミリー: 6
    • モデル : 42
    • モデル名 : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
    • ステッピング: 7
    • マイクロコード: 0x1b
    • CPUMHz : 3392.333
    • キャッシュサイズ:8192KB
    • 物理 ID : 0
    • 兄弟 : 8
    • コア ID: 0

...

プロセッサ 0 と 4 は同じコア ID を共有します (プロセッサ 1 と 5、2 と 6、3 と 7 も同様です)。ただし、ATLAS 構成スクリプトに --force-tids="4 0 1 2 3" を指定すると、ビルドが失敗します (make pcheck の失敗によって最初に気づきました)。このフラグを使用しない場合、 http ://sourceforge.net/tracker/?func=detail&aid=3577908&group_id=23725&atid=379483 に示されているように、pcheck が正常に動作します。

実験によって自分のマシンについて少し学ぶ方法を知っている人はいますか?

0 投票する
1 に答える
892 参照

cpu - ハイパースレッディングをオンラインで無効にする

次の属性を持つUbuntuサーバーがあります(スナップショット)

processor : 23 vendor_id : GenuineIntel cpu family : 6 model : 44 model name : Intel(R) Xeon(R) CPU X5690 @ 3.47GHz stepping : 2 cpu MHz : 1600.000 cache size : 12288 KB physical id : 1 兄弟 : 12 core id : 10 CPU コア: 6

テスト対象のシステムでは、ハイパー スレッディングが有効になっています。このシステムのハイパー スレッディングを無効にしたいと考えています。起動してBIOSに移動したくはありませんが、オンラインで実行したいと考えています。私が遭遇したいくつかの提案は、以下のようなことをすることでした:

「エコー 0 >/sys/devices/system/node/node0/cpu2/online」

システム内の CPU コア、兄弟の数に基づいて、どの CPU またはノードに移動して次の操作を実行すればよいかわかりません。

何か案が?

0 投票する
2 に答える
16535 参照

multithreading - ハイパースレッディングとマルチスレッディングの違いは?

誰かが私にこれら2つのb / wの違いを説明できるかどうか疑問に思っていましたか?Intel ハードウェア アーキテクチャ (HT) と何か関係がありますか?

0 投票する
1 に答える
3128 参照

c# - .Netでハイパースレッディングを最大限に活用する方法

それがマネージド言語でも可能かどうかはわかりませんが、ハイパースレッディングが存在する場合にアプリケーションのパフォーマンスを実際に向上させることは可能ですか?

コードで実行できる特定の何かがありますか?、おそらくいくつかの関数はHT環境で他の関数よりもうまく実行されますか?

マルチスレッドの恩恵を受けるために必要なのは、新しいスレッドを生成して重いCPUタスクを実行することだけですが、HTに何が必要かわかりません。

0 投票する
2 に答える
640 参照

openmp - CPU 時間はハイパースレッディングに関連していますか?

CPU 時間の増加 ( timeCLI コマンドによって報告される) は、ハイパースレッディングが使用されているときの非効率性を示していますか (スピンロックやキャッシュ ミスに費やされた時間など)、または HT の奇妙な性質によって CPU 時間が膨張している可能性はありますか? (例: 実際のコアがビジー状態で、HT が開始できない)

私はクアッドコア i7 を使用しており、OpenMP プログラムの単純に並列化可能な部分 (イメージからパレットへの再マッピング) をテストしています— ロックもクリティカル セクションもありません。すべてのスレッドは、読み取り専用の共有メモリ (ルックアップ テーブル) に少しアクセスしますが、独自のメモリにのみ書き込みます。

コア数が 1 ~ 2 を超えると、使用する CPU 時間が急激に増加することが懸念されます。

理想的なシナリオでは、CPU 時間はそれほど増加しないと思います (同じ量の作業が複数のコアに分散されるだけです)。

これは、プログラムの並列化にオーバーヘッドの 40% が費やされているということですか?

0 投票する
2 に答える
114 参照

c# - ハイパースレッディングを備えたプロセッサでの浮動小数点計算に適したタスク スケジューラはありますか?

TPL を使用して、インテル® IPP または MKL ライブラリーへの呼び出しを管理したいと考えています。当然、これらは浮動小数点計算集約型命令です。ハイパー スレッディングではコアごとに 1 つの浮動小数点スレッドしか割り当てられないため、タスクをインテリジェントにスケジュールする方法が必要です。

0 投票する
2 に答える
448 参照

android - プロセッサー数の信頼性

私は Android ゲームを作成していますが、Galaxy S などのシングル コアの携帯電話とデュアル コアの Galaxy S2 のパフォーマンスの違いは、昼夜に匹敵します。したがって、シングル コアとデュアル/クアッド コアで異なるバージョンを作成する代わりに、デバイスのプロセッサ カウントを使用して、特定のグラフィック機能をオフまたはオンにすることを考えました。

しかし、プロセッサ カウントを取得することの信頼性はどの程度なのでしょうか? 1 つのコアを 2 つとして表示するインテル ハイパースレッディングのようなスレッドを備えたシングル コアの携帯電話はありますか? それとも、Galaxy S2 よりも遅いデュアルコアの電話もありますか?

0 投票する
3 に答える
1586 参照

performance - 行列乗算でのハイパースレッディングとターボ ブースト - ハイパー スレッディングを使用するとパフォーマンスが低下する

GEMM コードをチューニングして、Eigen および MKL と比較しています。4 つの物理コアを持つシステムがあります。これまで、OpenMP のデフォルトのスレッド数 (私のシステムでは 8 つ) を使用してきました。これは少なくとも 4 つのスレッドと同じくらい良いと思いました。しかし、今日、Eigen と独自の GEMM コードを大規模な密行列 (1000x1000) で実行すると、8 スレッドではなく 4 スレッドを使用した方がパフォーマンスが向上することがわかりました。効率は 45% から 65% に跳ね上がりました。これはこのプロットにも見られると思います https://plafrim.bordeaux.inria.fr/doku.php?id=people:guenneba

違いはかなり大きいです。ただし、パフォーマンスははるかに不安定です。Eigen と私自身の GEMM コードの両方で、反復ごとにパフォーマンスが少し跳ね上がります。ハイパースレッディングによってパフォーマンスが大幅に低下することに驚いています。これは質問ではないと思います。これは予想外の観察であり、フィードバックを期待しています。

ハイパースレッディングを使用しないこともここで提案されていることがわかります。
Eigen ライブラリの行列積を高速化するには?

最大パフォーマンスの測定に関して質問があります。私が今行っていることは、CPUz を実行し、GEMM コードを実行しているときに周波数を確認し、その数値をコードで使用することです (私が使用しているオーバークロック システムでは 4.3 GHz)。すべてのスレッドでこの番号を信頼できますか? 最大値を決定するためにスレッドごとの頻度を知るにはどうすればよいですか? ターボブーストを適切に説明するにはどうすればよいですか?

0 投票する
0 に答える
529 参照

cpu - CPUID なしでハイパースレッディングを検出しますか?

私は数を処理するアプリケーションに取り組んでおり、可能な限りすべてのパフォーマンスを絞り出そうとしています。Windows と *nix の両方、さらにはマルチ CPU マシンでも動作するように設計しています。

私が現在セットアップしている方法では、OS にいくつのコアがあるかを尋ね、各コアのアフィニティを CPUID ASM コマンドを実行する関数に設定します (はい、同じ CPU で複数回実行されます。大したことはありません)。 、これは単なる初期化コードです)、CPUID の Features 要求で HyperThreading をチェックします。CPUID コマンドへの応答から、実行すべきスレッド数を計算します。もちろん、コア/CPU が HyperThreading をサポートしている場合、1 つのコアで 2 つ生成されます。

しかし、自作マシンで分岐案件に遭遇。Core 2 Duoを搭載したHPラップトップを実行しています。しばらく前に工場出荷時のプロセッサを、HyperThreading をサポートするより優れた Core 2 Duo に交換しました。ただし、工場出荷時のプロセッサがサポートしていなかったため、BIOS はサポートしていません。そのため、CPU がハイパースレッディングを持っていると報告しても、それを利用することはできません。

Windows では、論理コアを数えるだけでハイパースレッディングを検出できることを認識しています (物理的なハイパースレッディング対応コアは 2 つの論理コアに分割されているため)。ただし、そのようなものが *nix (特に Linux; 私のテストベッド) で利用できるかどうかはわかりません。

デュアルコア プロセッサで HyperTreading が有効になっている場合、Linux 関数 sysconf(_SC_NPROCESSORS_CONF) は、プロセッサが 4 つあることを示しますか、それとも 2 つしかないことを示しますか?

両方のシステムで信頼できるカウントを取得できれば、CPUID ベースのハイパースレッディング チェックをスキップして (結局のところ、BIOS で無効になっている/利用できない可能性があります)、OS が報告するものを使用できますが、残念ながら私のせいで分岐ケースこれを判断できません。

PS: コードの Windows セクションでは、GetLogicalProcessorInformation() の戻り値を解析しています。

おまけ: CPU を実際にハイパースレッド化できるように BIOS を変更する方法を知っている人はいますか ;)? マザーボードは、AMD M96 チップセットを搭載した HP 578129-001 です (yuck)。