マルチコアCPUで実行しなければならないことはありますか?


45

プログラムがどのようにマルチスレッドに対応する必要があるかを考えると、私のチームは、シングルコアCPUでは絶対にできないことはないかと困惑しました。グラフィック処理には大規模な並列処理が必要であると仮定しましたが、DOOMなどの処理はGPUのないシングルコアCPUで行われたと主張しています。

マルチコアプロセッサで実行する必要があるものはありますか?

開発と実行の両方に無限の時間があると仮定します。


8
以下の答えは主に「いいえ」のように見えますが、歴史的には、一部のタスクを処理するコプロセッサーがなければ機能しなかったシステムがあります。私が知っている強力な例の1つは、67MHz ARM9 CPUと33MHz ARM7 CPUを含むニンテンドーDSです(GBAゲームをプレイするときの後方互換性にも使用されます)。DSゲームの場合、ARM9は音声とWi-Fi通信の再生を処理します。これは、ARM9が音声チップに直接音声を送り続けながら、画面に何も処理したり描画したりできないためです。したがって、@ jmiteが「どのような制約の下で」と述べているように、速度の不足は複数のCPUを必要とする可能性があります。
スリップD.トンプソン

10
私の仕事では、マルチコアXeonとXenomaiリアルタイムLinux拡張機能を使用して、低遅延オーディオ処理を行います。3ステージのオーディオ処理パイプラインがあり、各ステージには専用のコアがあり、サイクルの〜70%を使用します。非リアルタイムタスクは4番目のコアを使用するようになり、最初の3つの残りのサイクルはすべて残ります。これは、シングルコアCPUが現在の4コアCPUのコアよりも3倍以上高速である場合にのみ可能です。現在のCPUが2GHzで実行されている場合、これを達成するのは難しいかもしれません。
ジェレミーフリースナー16年

19
シングルコアCPU上のソフトウェアは、マルチコアCPUをエミュレートできます。違いはほぼ完全に速度です。
user253751

24
マルチコアシステムで行わなければならないことの 1つは、マルチスレッドソフトウェアのテストです。なぜなら、いくつかの欠陥はシングルコアシステムでは(ほとんど)決して起こらないからです。しかし、それが答えとして
ふさわしい

13
@nikieシングルコアシステムはメモリの順序付けと古いキャッシュもエミュレートできますが、これは非常に非効率的であると思います(10倍の速度低下など)
Nayuki

回答:


47

実行時間を気にしない場合、マルチコアマシンで実行できることは何でも、シングルコアマシンで実行できます。マルチコアマシンは、ある種の計算を高速化する方法にすぎません。

TnTn


3
それが絶対に正しいかどうかは完全にはわかりません。単一のコアでメモリの一貫性のバグが発生する可能性はないと思います(はい、ユニコアでマルチキャッシュシステムをエミュレートできますが、そのような間接性は不正行為です)。(おそらく、VLIWでの移動opによる正規スワップの実装と同等の、保証された|| ismを活用しますか?)シングルスレッドコア上でも、マルチスレッドのタイミング変動からエントロピーを抽出することは可能だと思いますが、エントロピーは単位時間あたりより小さくなります(これは実際には他の違いと同様にパフォーマンスの問題です)。
ポールA.クレイトン

6
@ PaulA.Claytonメモリの一貫性のバグは通常、望ましくないものであり、適切に作成されたソフトウェアでは表示されません。ただし、本当に必要な場合は、単一のCPUでそれらをエミュレートできます。(遅いかもしれませんが)
-user253751

4
nn

11
「シングルコアマシンは、タイムスライシング/タイムシェアリングを使用してマルチコアマシンをエミュレートできます。」そして、実際には、「近代的な」オペレーティングシステムのd明期からそうしています。
ライトネスレース、モニカと

1
@ PaulA.Clayton同じ共有メモリを変更する2つの異なるプロセスがある場合、メモリの一貫性の問題(アトミックでない増分など)が発生する可能性があると思います。あなただけの先制マルチタスクが必要です。もちろん、これが一般的に、最近のOSが明示的に要求しない限り、同じ書き込み可能なメモリを共有するプロセスを持たない理由です。
パトリックM

58

問題は、どのような制約の下ですか?

「一定の時間内にハードウェアXでこの問題を解決できるか」という質問をすると、答えはノーになります。

しかし、これは「将来性のある」答えではありません。これまでは単一のコアで十分に高速に実行できなかったことが今ではあり得、将来のハードウェアがどのような能力を持つかを予測できません。

計算可能性の観点から、シングルテープチューリングマシンはシングルまたはマルチコアコンピューターと同じ機能をすべて計算できるため、ランタイムは別にして、マルチコアコンピューターがそれを解決できるという問題はありません。シングルコアではできません。

グラフィックのようなものに関しては、GPU上にあるすべてのものをCPU上で実行できます。


3
@JanDvorak実際には、これはGPUによってまったく行われていないと言うでしょう;)
TomTom

15
時間に制約がない場合は、すべての計算を手、ペン、紙で実行できます。
mathreadler

2
@mathreadlerはい、脳はチューリング完了です。なって何か長い議論物理Stackexchangeに。
-JBentley

4
実際、@JanDvorakは、VGAを生成することは非常に簡単であり、このプロジェクトが示すように、下級16 MHzのマイクロコントローラ上のソフトウェアで行うことができる。pyroelectro.com/tutorials/arduino_basic_vga
axello

3
@mathreadlerそれは実際には最初に現れるよりも複雑な質問です。簡単な答えは「はい」かもしれません。なぜなら、専用のマシンは、チューリング用の完全なツールを必要とせずにコンピューターを構築できるからです。チューリングマシンを構築する能力は、状態マシンの残りを構築する「初期化」状態にあるより大きなチューリングマシンを持っていることを意味するため、より長い答えは「いいえ」です。完全な答えは、Turing Completeデバイスを構築したことがないため、さらに複雑です。マシンの抽象的なアイデアを開発しました...
Cort Ammon

17

他の回答が指摘しているように、時間をスライスして各仮想CPUの役割を果たすことにより、単一のCPUが常に複数のCPUをエミュレートできます。このエミュレーションは確かに正しい答えを計算します。

現実の世界では、実行時間が重要になる場合があります。それは、平凡なフレームレートと恒星の視覚体験の違いを意味する可能性があります。または取引の利益と損失の違い。

マルチプロセッサがユニプロセッサよりも非常に高速である病理学的状況の1つは、処理がデータパイプラインであり、コンテキストスイッチングが高価であり、各パイプラインステージのマシンコードがCPUのキャッシュにほとんど収まらない場合です。

いくつかの数字で説明しましょう。4つの処理ステージを持つデータパイプライン(3Dレンダリングなど)があり、各ステージに256 KiBのプログラムコードがあり、256 KiBのL2キャッシュを備えた4つのCPUがあると仮定します。単一のCPUでこの処理を実行しようとすると、4つのタスク間の切り替えに費用がかかり、キャッシュミスが大きくなります。一方、4コアシステムで実行すると、計算が非常にスムーズになり、キャッシュミスが最小限に抑えられ、コンテキストスイッチが存在しなくなります。(補足として、これは特定のアプリケーションを特定のコアに固定するという概念に関連しています-たとえば、1つのコアでOSカーネル操作のみを行う、TCP / IP処理など)


7

単一のCPUで非常に悪質なデータ競合を開発するのははるかに困難です。確かに、単一のCPUに割り込みをかけると、単語間の裂け目をなくすことができますが、必要なことを行うスレッドの単一インターリーブが存在しないエキゾチックなシナリオを構築できますか?

さて、たぶん陰湿なバグを作成することは、マルチコードの進歩の有効な使用としてカウントされません。結局のところ、マルチコアがシングルコアで時間を与えられないということはあまりありません。その理由は簡単です。これらの悪のデータ競合を回避しようとすると、コードに同期ポイントが必要になります。コードを計算のラティスとしてモデル化すると、出力を計算および生成する前に1つの入力を完了して同期する必要がある場合、単一のCPUがラティスに沿って単純に機能し、次の利用可能な作業ブロックを計算できることが容易にわかります。

実際、チューリングマシン(私たちが気にしているほぼすべてのアルゴリズム)によってアルゴリズムを解決できることを実証できれば、アルゴリズムはシングルコアCPUだけでなく、実際にはメモリ用の非常に長いテープを備えたステートマシン!

CHESSのレース検出器は、実際のレースの例を見つけるために、これを利用しています。すべてのシングルスレッドを実行し、スレッド間のすべての可能なインターリーブを体系的に調査し、レースケースのためにテストが失敗するケースを見つけようとします。CHESS 、シングルコアでマルチスレッドアプリケーションを実行できるという事実に依存しています。

マルチコアが必要な場合は、ハードウェアの限界を広げ始めるときに現れます。明らかなのは、時間の制約がある場合です。リアルタイムの制約に関する問題の中には、シングルコアのクロックを十分に高速に駆動できないために、シングルコアを実行できないものがあります。CPUが4Ghzに達してから少し落ち着き、低速でより多くのコアを好む理由があります。

このタイミング制約のよりエキゾチックなバージョンは、ハードリアルタイムシステムにあります。一部のハードリアルタイムシステムでは、割り込みのサービスが非常に要求されるため、実際には、コア間で割り込みを分割できるマルチコアCPUを選択するか、タイミングの制限に直面する必要があります。

データバスには別の制限があります。例としてBlue Gene / Pを検討してください。特定のBlue Gene / PスーパーコンピューターであるJUGENEには、144 テラバイトのメモリがあります。彼らは単純に、そのすべてのメモリにアクセスできるシングルCPUコンピューターを作成しません。


1
繰り返しますが、彼らはメモリにアクセスできるシングルCPUコンピューターを作成しません。 「しない」は「できない」と同じではありません。あなたは可能性があり、メインメモリの144テラバイト以上とユニプロセッサを設計し、構築します。人々がそうしない唯一の理由は、収益が減少することです:ユニプロセッサデザインにメモリを追加することの増分的で実用的な価値は、ある時点でピークに達し、メモリサイズが大きくなるにつれて低下しますが、増分コストは一定のままです。
ソロモンスロー

@jameslargeそれが、実際の実用的なハードウェアを議論する私の答えの一部にその文が入った理由であり、理論的な能力を議論した答えの最初の2/3に現れなかった理由です。
コートアンモン

「しない」と「できない」は、地下室の2つのシステムで示されています。その量のメモリをハードウェア構成に物理的に追加できれば、CPUは各バイトに「アクセス」できました。しかし、私はできないので、彼らは「できません」。CPUの機能は実用性を超えています。
user2338816

私はこの答えのようなものを考えていました。シングルコア環境では、競合状態は不可能(または100%の確率で発生)であると思われます。実際のアプリケーションに関しては、ソフトウェア開発者は、特定のターゲットハードウェアを常にパスするが、シングルコアで実行されるエミュレートされたハードウェアでは失敗する奇妙な競合状態テストをコーディングすることにより、ユニークな形式のコピー保護を設計できると考えています。この場合、マルチコアシステムによるエミュレーションは、おそらくパスしますが、信頼できません。
ダンヘンダーソン

6

ベンチマークやアクティビティログのように、リアルタイムの動作を乱すことなく(またはできるだけ小さく)、単一の処理要素で実行されているプロセスを観察する必要がある場合は、おそらく別の処理リソースが必要になります。


複数のプロセッサではない場合、正確なエミュレーションを必要とするものの素敵で簡潔な例
ベンレジェロ

ちょっとですこれは、あなたのアカウント?Maybyをマージしますか?

4

他の答えは、並列性を「分散並行性」としての限られた見方に従っています。これにより、いくつかの答えが得られます。チューリングのような計算のクリーンモデルでは、複数のコアには利点がありません。あなたが得る唯一の利点は効率です。

ある動作を実行する:一つ複数の処理ユニット(PUの)が単一のものが、しかしすることができないことを行うことができ平行であること、同時に

これは、複数のプログラムを同時に実行する場合に非常に便利です。確かに、同時実行以上のものを絶対に必要とすることはまれであり、ほとんどの使用法は効率の向上につながります。しかし、そこにあるこの差は。

複数のソースからのデータセンサーデータをリアルタイムで処理する必要があるとします。それがアプリケーションで正確に何を意味するにせよ、1つのPUは、応答時間の制限に違反することなく、非常に多くの入力ストリームのみを同時に処理できます。したがって、現在のPU世代に対してセンサーが多すぎる場合は、複数のPU が必要です。

k

kkk


0

CS povから、「マルチコア」は「分散コンピューティング」と理論的にそれほど違いはありません。基本的な概念は「独立した計算要素(並列計算)です。したがって、質問を少し言い換えると(「マルチコア」は実際にはCSの理論的概念ではありません)、他の可能性につながります。 CS povからの並列プログラミングに相当します。これは、コンピューティングの理論的システム、つまりチューリングマシンの定義に戻ります。CSパフォーマンスの理論的分析は、最終的に並列と順次の区別が実際に適用されないTMただし、マルチテープTMには多少の大まかな類似性があります)。

しかし、この質問を抽象的ではないことを考慮すると、フォールトトレランスに関連するいくつかの問題には、分散コンピューティングが実際に優れているか、場合によってはほぼ必要です。この領域には、独立したコンピューティング要素がある程度の信頼性を持たない場合/どこに適用されるかという概念があります (これは実際にすべてのコンテキストに普遍的に適用可能な仮定ではありません)。ここでは、独立したコンピューティング要素を使用してフォールトトレランスが向上する、または必要になる場合もあります。

  • 各プロセッサは、計算中に失敗する独立した「[x]%」チャンスがあると考えてください。通信を介してシステム全体の耐障害性が個々のコンポーネントよりも優れているシステムを考案できます。これは何十年も前に、たとえばスペースシャトルシステムで適用されました。最近では、いわゆるコンセンサス問題を解決するPaxosなど、それを利用するために設計された基本的なプロトコルがあります。より現実的な例としては、Googleが独自のアルゴリズムを多数備えており、個々の信頼性の低い要素とフォールトトレラントアルゴリズムを組み合わせてスーパーコンピューターを構築します。

  • ビットコインには、台帳を計算するための分散トランザクションが含まれますが、これは単なる処理負荷の問題によるものではありません。アルゴリズムは、破損したノードを阻止するように慎重に設計されています。要するに、単に並列パフォーマンスを最大化するだけではなく、ビザンチン将軍の問題を「解決」/実装します。独立したエンティティが互いに「チェック」し、「アルゴリズム/暗号化/安全」が無効な計算別名「不正行為」または「不正行為」を拒否します破損」。

  • 並列処理の古典的な分析では、特定の並列実行の内訳に分解される約7つの「基本的な」問題パターンタイプがあると結論付けられています。The Parallel Landscape of Berkeleyからの展望をご覧ください

  • ここには、他のほとんどの回答で取り上げられているパフォーマンスの考慮事項について、未解決の理論的質問の要素がいくつかあります。逐次よりも「本質的に高速」な並列問題があるかどうかの問題は、NCが「効率的に並列化可能な」アルゴリズムのクラスと見なされ、Pが「効率的な[順次]アルゴリズム」


1
私はこの答えが大好きです!あなたの例から多くのことを学びました:D
ベンレジェロ

放射線を伴うミッションクリティカルな環境でのフォールトトレランスの場合は+1、上限と冗長性がない場合は-1。
シーズティマーマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.