タグ付けされた質問 「multi-core」

3
単一のスレッドは複数のコアでどのように実行されますか?
私は、シングルスレッドが複数のコアでどのように実行されるかを高レベルで理解しようとしています。以下は私の理解です。私はそれが正しいとは思わない。 Hyper-threadingの私の読書に基づいて、OSはすべてのスレッドの命令を、それらが互いに待機しないように編成しているようです。次に、CPUのフロントエンドは、各コアに1つのスレッドを配布することにより、これらの命令をさらに整理し、オープンサイクル間で各スレッドから独立した命令を配布します。 そのため、スレッドが1つしかない場合、OSは最適化を行いません。ただし、CPUのフロントエンドは、独立した命令セットを各コアに分配します。 https://stackoverflow.com/a/15936270によると、特定のプログラミング言語が作成するスレッドは多かれ少なかれありますが、それらのスレッドで何をすべきかを判断する際には無関係です。OSとCPUがこれを処理するため、使用されるプログラミング言語に関係なくこれが発生します。 明確にするために、単一のコアで複数のスレッドを実行するのではなく、複数のコアで実行される単一のスレッドについて尋ねています。 要約の何が問題になっていますか?スレッドの命令は複数のコアにどこでどのように分割されますか?プログラミング言語は重要ですか?これは広範なテーマであることを知っています。私はそれについて高レベルの理解を望んでいます。

12
プログラムが特定の最小数のCPUコアを必要とするのはなぜですか?
N個未満のコアを持つCPUで実行すると正常に動作しないコード(またはコードではなく完全なソフトウェア)を作成することはできますか?明示的にチェックせず、意図的に失敗することなく: IF(noOfCores <4)その後、意図的に適切に実行されない 私はゲームの(Dragon Age:Inquisition)最小システム要件を調べていますが、それは最低4コアCPUを示しています。多くのプレイヤーは、2コアCPU および2つの物理コアと2つの論理コアを備えたIntel Core i3では動作しません。そして、それは計算能力の問題ではありません。 私の理解では、スレッドはOSによってCPUから完全に分離されています。 ただ物事をクリアするために: 私はありません「私はコードからCPUコアの数を調べると、意図的に失敗することはできますか?」尋ねます ...そのようなコードは意図的ではありません(計算能力を必要とせずに、プログラムを実行するためにより高価なCPUを購入せざるを得ません)。たとえば、コードが4つのスレッドを持ち、同じ物理コアで2つのスレッドが実行されると(システム情報を明示的に確認して意図的に失敗することなく)失敗するようにしています。 要するに、複数のコアから来る追加の計算能力を必要とせずに、複数のコアを必要とするソフトウェアが存在できるのでしょうか?N個の個別の物理コアが必要です。

7
マルチスレッドおよびマルチプロセッサプログラミングの非推奨のプラクティスはありますか?
FORTRANとBASICの初期には、本質的にすべてのプログラムはGOTOステートメントで記述されていました。結果はスパゲッティコードであり、ソリューションは構造化プログラミングでした。 同様に、ポインターはプログラムの特性を制御するのが難しい場合があります。C ++は多くのポインターで開始しましたが、参照の使用をお勧めします。STLのようなライブラリは、依存関係の一部を軽減できます。より優れた特性を持つスマートポインターを作成するイディオムもあり、C ++の一部のバージョンでは参照とマネージコードを許可しています。 継承やポリモーフィズムなどのプログラミング手法では、舞台裏で多くのポインターを使用します(ただし、構造化プログラミングでは分岐命令で満たされたコードを生成します)。Javaのような言語は、プログラマーに依存せずにポインターを削除し、ガベージコレクションを使用して動的に割り当てられたデータを管理します。 私の読書では、セマフォを使用していないように見えるマルチプロセスおよびマルチスレッドのプログラミングの例を見てきました。異なる名前で同じものを使用していますか、それとも同時使用からリソースの保護を構築する新しい方法がありますか? たとえば、マルチコアプロセッサを使用したマルチスレッドプログラミングシステムの具体例は、OpenMPです。環境に含まれていないように見えるセマフォを使用せずに、次のように重要な領域を表します。 th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; } この例は、http://en.wikipedia.org/wiki/OpenMPからの抜粋です。 あるいは、関数wait()およびsignal()を使用したセマフォを使用したスレッドの相互の保護は、次のようになります。 wait(sem); th_id = get_thread_num(); cout << "Hello World from thread " << th_id << '\n'; signal(sem); この例では、物事は非常に単純であり、wait()およびsignal()呼び出しが一致していることを示すには簡単なレビューで十分であり、多くの並行性がある場合でもスレッドセーフが提供されます。しかし、他のアルゴリズムはより複雑で、複数のセマフォ(バイナリとカウントの両方)を使用し、多くのスレッドが呼び出すことができる複雑な条件を持つ複数の関数に分散しています。デッドロックを作成したり、物事をスレッドセーフにできなかったりすることの結果は、管理が難しい場合があります。 OpenMPのようなこれらのシステムはセマフォの問題を排除しますか? 彼らは問題を他のどこかに移動させますか? セマフォを使用しないようにアルゴリズムを使用してお気に入りのセマフォを変換するにはどうすればよいですか?

2
マルチコアプロセッサでスレッド割り当てをプログラムする方法は?
たとえば、2つの異なるプロセッサコアで実行される2つの異なるスレッドを使用するプログラムを作成するなど、マルチコアプロセッサ上のスレッドを試してみたいと思います。 ただし、スレッドがどのレベルで異なるコアに割り当てられるかは明確ではありません。次のシナリオを想像できます(オペレーティングシステムとプログラミング言語の実装に依存)。 スレッドの割り当ては、オペレーティングシステムによって管理されます。スレッドはOSシステムコールを使用して作成され、プロセスがマルチコアプロセッサで実行されると、OSは異なるコアに異なるスレッドを自動的に割り当て/スケジュールしようとします。 スレッドの割り当ては、プログラミング言語の実装によって管理されます。スレッドを異なるコアに割り当てるには特別なシステムコールが必要ですが、プログラミング言語の標準スレッドライブラリは、その言語の標準スレッド実装を使用するときにこれを自動的に処理します。 スレッドの割り当ては明示的にプログラムする必要があります。私のプログラムでは、使用可能なコアの数を検出し、ライブラリ関数などを使用して異なるスレッドを異なるコアに割り当てるために、明示的なコードを記述する必要があります。 質問をより具体的にするために、WindowsまたはLinux上のJavaまたはC ++でマルチスレッドアプリケーションを作成したと想像してください。マルチコアプロセッサで実行すると、アプリケーションが魔法のように複数のコアを認識して使用しますか(すべてがオペレーティングシステムまたは標準のスレッドライブラリによって管理されるため)、または複数のコアを認識するためにコードを変更する必要がありますか?


2
使用するmakeスレッドはいくつありますか?
デスクトップ/ラップトップコンピューターで大規模なシステムを(再)ビルドするとき、次のようmakeに、複数のスレッドを使用してコンパイル速度を上げるように指示します。 $ make -j$[ $K * $C ] どこ$Cの数を示すことになっているコアながら、マシンが持っている(私たちは一桁と番号であることを仮定することができ)$K、私は異なるものだ2と4、私の気分に応じました。 したがって、たとえば、make -j124つのコアがある場合、make最大12のスレッドを使用するように指示することができます。 私の理論的根拠は、私が$Cスレッドのみを使用する場合、プロセスがドライブからデータをフェッチするのにビジーである間、コアはアイドルになるということです。しかし、スレッドの数を制限しない場合(つまりmake -j)、コンテキストの切り替えに時間を浪費したり、メモリを使い果たしたり、さらに悪いことにリスクを冒したりします。マシンに$Mギグのメモリがあると仮定しましょう($Mは10のオーダーです)。 したがって、実行するスレッドの最も効率的な数を選択するための確立された戦略があるかどうか疑問に思っていました。

6
次の並行性
過去1年間、私はJavaの並行処理に多くの取り組みをしており、多くの並行パッケージを構築して取り組んできました。並行世界の発展という点では、私は非常に自信があります。さらに、並行プログラミングについてもっと学び、理解することに非常に興味があります。 しかし、私は次の自分に答えることができませんか?マルチコアプロセッシングに関連するスキルをさらに引き継ぐために、何を追加で学習または取り組む必要がありますか。次のレベルに進むことができるように、マルチコア処理に関連する素敵な本(「実際の並行性」と「Javaでの並行プログラミング」を読んで楽しんだ)またはリソースがある場合は?

2
C ++でのタスクベースのプログラミングには、新しい言語標準機能が必要ですか?
だから私はGoingNative 2012:誰もが質問できるインタラクティブパネルでこれらすべてのC ++マスターと共にYoutubeでこのビデオを見ました。 これは私が話していたビデオです:GoingNative 2012-1日目-インタラクティブパネル:ネイティブであることの重要性 そして時間0:24:00に誰かが非常に興味深い質問をしました: 私たちはしばらくの間、pthreadを使用したり、Windowsスレッドを使用したりして並行プログラミングを行ってきました。C++とCが並行プログラミングに追いついてうれしいですが、すでに5年または10年遅れているように思えます何年もの間、現在、これらの強力なマルチコアがすべてあり、これらのマルチコアのプログラミングはスレッドに基づくべきではなく、タスクベースである必要があり[...]、MicrosoftにはPPLライブラリなどがあり、これは完全にC ++標準には反映されていません。[...]私が恐れている唯一のことは、標準がスレッドにロックされ、タスクベースのプログラミングに移行するのが非常に困難になることです... 今、私はこれらの概念にかなり慣れていないので、少し混乱しています。実際にタスクベースのプログラミングとは何ですか。この用語は、ロックフリープログラミングと同じ意味ですか?これらの2つの同等の用語ですか、それらの間にリンクはありますか?

4
スケーラビリティ(マルチコア)の理由からPythonではなくClojureを使用するのは良い考えですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 4年前休業。 http://clojure.org/rationaleと、Clojureと多くの言語の間の他のパフォーマンス比較を読んだ後、使いやすさを除けば、Pythonではなく、Clojureでコーディングするべきだと思い始めました。実際、私はClojureを学ばないことに無責任であると感じ始めました。 それは意味がありますか?Lisp方言や他の関数型言語よりも、Pythonなどの命令型言語を使用して、すべてのコアを本当に効率的に使用できないのでしょうか。それのすべての利点は不変データを使用することから来るようですが、Pythonでそれを行うだけですべての利点を得ることができませんか? 私はかつてCo​​mmon Lispを学び始め、大学図書館から借りた本からほとんどすべての演習を読んで実行しました(Amazonでの人気が低いにもかかわらず、かなり良いことがわかりました)。しかし、しばらくして、簡単なことをするのに苦労しすぎた。本質的にもっと不可欠なものがあり、それらを機能的な方法でモデル化することが困難になると思います。 では、この新しいマルチコアの未来を利用するアプリケーションを構築するために、PythonはClojureと同じくらい強力ですか? セマフォ、ロックメカニズム、または他の同様の同時実行メカニズムを使用することは、Clojureの「自動」並列化に代わる優れた方法ではないと私は思います。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.