35

CPU アーキテクチャの状況が変わりました。マルチコアは、ソフトウェアの開発方法を変えるトレンドです。私は C、C++、および Java でマルチスレッド開発を行い、さまざまな IPC メカニズムを使用してマルチプロセス開発を行いました。スレッドを使用する従来のアプローチでは、高度な並行性をサポートするハードウェアを開発者が利用することは容易ではないようです。

並行アプリケーションを作成する際の従来の課題を軽減するのに役立つ言語、ライブラリ、および開発手法は何ですか? 私は明らかに、デッドロックや競合状態などの問題を考えています。設計手法、ライブラリ、ツールなども興味深いものであり、利用可能なリソースを実際に活用し、確実に利用できるようにします。安全で堅牢なスレッド化されたアプリケーションを作成するだけでは、利用可能なすべてのコアを確実に使用できるわけではありません。

私がこれまでに見たものは次のとおりです。

  • Erlang : プロセスベース、メッセージパッシング IPC、「アクターの同時実行モデル」
  • Dramatis : Ruby および Python 用の俳優モデル ライブラリ
  • Scala : 同時実行サポートが追加された JVM 用の関数型プログラミング言語
  • Clojure : アクター ライブラリを使用した JVM 用の関数型プログラミング言語
  • Termite : Erlang のプロセス アプローチと Scheme へのメッセージ パッシングのポート

他に何を知っていますか、何が効果的で、何を見るのが面白いと思いますか?

4

15 に答える 15

11

2 つのパラダイム シフトを提案します。

ソフトウェア トランザクショナル メモリ

Software Transactional Memory (STM)の概念を確認することをお勧めします。アイデアは、楽観的同時実行を使用することです。他の操作と並行して実行される操作は、分離されたトランザクションでそのジョブを完了しようとします。ある時点で、このトランザクションが動作しているデータを無効にする別のトランザクションがコミットされた場合、トランザクションの作業は破棄され、トランザクションが再度実行されます。

私は、アイデアの最初の広く知られている実装 (概念実証と最初の実装ではないにしても) は Haskell のものだと思います: Haskell のトランザクションメモリに関する論文とプレゼンテーション他の多くの実装は、ウィキペディアの STM 記事にリストされています。

イベントループとプロミス

[E プログラミング言語]( http://en.wikipedia.org/wiki/E_(programming_language%29) .

言語設計の他の部分と同様に、同時実行を処理する方法は、Actor モデルに大きく基づいていることに注意してください。

于 2008-09-24T15:18:36.820 に答える
9

Javaについて言及しましたが、スレッドについてのみ言及しています。Java の並行ライブラリを見たことがありますか? Java 5 以降にバンドルされています。

ほんの数例を挙げると、ThreadPools、CopyOnWriteCollections を含む非常に優れたライブラリです。Java チュートリアルでドキュメントを確認してください。または、必要に応じて、Java ドキュメント.

于 2008-09-23T15:25:26.890 に答える
6

Python の処理を​​使用しました。threadingモジュールの API を模倣しているため、非常に使いやすいです。

map/imapまたはジェネレーター/リスト内包表記を使用する場合、コードを変換して使用するのはprocessing簡単です。

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

と並列化できます

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

結果を計算するために必要なプロセッサの数はいくらでも使用されます。遅延型 ( Pool.imap) と非同期型 ( Pool.map_async) もあります。

を実装する queue クラスとQueue.Queue、スレッドに似たワーカーがあります。

落とし穴

processingに基づいておりfork()、Windows でエミュレートする必要があります。オブジェクトはpickle/経由で転送さunpickleれるため、これが機能することを確認する必要があります。すでにリソースを取得しているプロセスを fork することは、あなたが望むものではないかもしれません (データベース接続を考えてください) が、一般的には機能します。これは非常にうまく機能するため、Python 2.6 のファスト トラックに追加されました ( PEP-317 を参照)。

于 2008-09-23T15:32:28.637 に答える
4

質問明日のメニーコアプロセッサを活用するために、今日どの並列プログラミングモデルをお勧めしますか?すでに尋ねられています。私もそこで次のように答えました。

Kamaeliaは、多くの通信プロセスを備えたアプリケーションを構築するためのPythonフレームワークです。

Kamaelia-並行性が便利で楽しいものになりました

Kamaeliaでは、相互に通信する単純なコンポーネントからシステムを構築します。これにより、開発がスピードアップし、メンテナンスが大幅に支援され、自然に並行ソフトウェアを構築できるようになります。これは、初心者を含むすべての開発者がアクセスできるようにすることを目的としています。それはまたそれを楽しくします:)

どんなシステム?ネットワークサーバー、クライアント、デスクトップアプリケーション、pygameベースのゲーム、トランスコードシステムとパイプライン、デジタルTVシステム、スパム根絶者、教育ツール、その他かなりの量:)

これがPycon2009のビデオです。これは、KamaeliaをTwisted and Parallel Pythonと比較することから始まり、次にKamaeliaの実演を行います。

カマエリアとの簡単な同時実行-パート1(59:08)カマエリア
との簡単な同時実行-パート2(18:15)

于 2008-09-25T23:38:14.347 に答える
4

私は Ada で並行プログラミングを 20 年近くやっています。

言語自体 (ライブラリに追加されたものではありません) は、スレッド化 (「タスク」)、複数のスケジューリング モデル、および複数の同期パラダイムをサポートしています。組み込みのプリミティブを使用して、独自の同期スキームを構築することもできます。

Ada のランデブーは一種の手続き型同期機能と考えることができますが、保護されたオブジェクトはよりオブジェクト指向です。ランデブーはモニターの古い CS コンセプトに似ていますが、はるかに強力です。保護されたオブジェクトは、OS ロック、セマフォ、イベントなどとまったく同じものを構築できる同期プリミティブを備えた特別なタイプです。ただし、正確なニーズに応じて、独自の種類の同期オブジェクトを発明して作成することもできるほど強力です。 .

于 2009-04-28T16:55:38.340 に答える
4

Intel のC++ 用Threading Building Blocksは、私にとって非常に興味深いものに思えます。生のスレッドよりもはるかに高いレベルの抽象化を提供します。枯れ木のドキュメンテーションが好きなら、O'Reilly にはとてもいい本があります。また、Intel の Threading Building Blocks を使用した経験はありますか?も参照してください。.

于 2008-09-23T15:36:40.233 に答える
4

私はこう言います:

モデル: スレッド + 共有状態、アクター + メッセージ パッシング、トランザクション メモリ、マップ/リデュース? 言語: Erlang、Io、Scala、Clojure、Reia ライブラリ: Retlang、Jetlang、Kilim、Cilk++、fork/join、MPI、Kamaelia、Terracotta

私は、このようなもの (Erlang、Scala、Java スレッディング、アクター モデルなど) に関する同時実行リンク ブログを維持しており、1 日に 2 つのリンクを掲載しています。

http://concurrency.tumblr.com

于 2008-09-23T20:23:13.820 に答える
3

Parallel Extensions for .NETParallel LINQに注目しています。

于 2008-09-23T15:32:02.520 に答える
2

Javaには、ご存知のようにアクターライブラリもありますそして、J avaが関数型言語であることをご存知ですか?;)

于 2008-09-27T05:09:55.093 に答える
2

Reiaは、 Erlangをベースにしていますが、Python/Ruby に似た言語です。

于 2008-09-23T15:27:43.233 に答える
2

この質問は、「将来のメニーコア プロセッサを活用するために、現在どの並列プログラミング モデルを推奨しますか?」との重複ではないにしても、密接に関連しています。

于 2008-09-23T15:37:10.713 に答える
2

OpenMP .

スレッドを処理するので、C++ アプリケーションのどの部分を並行して実行するかだけを気にする必要があります。

例えば。

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

上記のコードは、openmp ランタイムに使用するように指示した数のスレッドで for ループを実行します。したがって、SIZE が 100 で、クアッドコア ボックスを使用している場合、その for ループは各コアで 25 項目を実行します。

さまざまな言語用の並列拡張機能が他にもいくつかありますが、私が最も興味を持っているのは、グラフィック カードで実行される拡張機能です。それが本当の並列処理です:) (例: GPU++libSh )

于 2008-10-20T16:24:39.537 に答える
2

C++0x はstd::lock、複数のミューテックスをまとめてロックするための関数を提供します。これは、順不同のロックによるデッドロックを軽減するのに役立ちます。また、C++0x スレッド ライブラリには、promise、future、およびパッケージ化されたタスクが含まれます。これにより、スレッドは、ユーザー レベルのロックなしで、別のスレッドで実行された操作の結果を待つことができます。

于 2008-10-21T14:07:54.960 に答える
0

multiprocessing別の回答で言及されているように、マルチコアプログラミングを簡素化するpythonライブラリです。

Python で書かれたプログラムmultiprocessingは、ローカル コアではなく、クラウド上で作業を出荷するように簡単に変更できます。 piCloudはそれを利用して、クラウド上で大規模なオンデマンド処理能力を提供します。コードを 2 行変更するだけです。

マルチコア用のライブラリを選択するとき、クラウド アプローチも意味があるかどうかを尋ねたいと思うかもしれません。

于 2012-06-06T14:01:26.150 に答える