タグ付けされた質問 「parallel-processing」

並列処理は、単なる並行処理とは対照的に、並列に実行されるすべてのスレッドレベルおよび/または命令レベルのタスクを開始/実行/終了することが保証され、同時に実行されるコードパスの完了を保証します。

13
非同期プログラミングと並列プログラミングの違いを明確にする方法は?
多くのプラットフォームは、応答性を向上させる手段として非同期性と並列性を促進しています。私はその違いを大まかに理解していますが、自分自身や他の人の心の中で明確に表現するのは難しいと感じることがよくあります。 私は平凡なプログラマーであり、非同期とコールバックをかなり頻繁に使用しています。並列処理はエキゾチックです。 しかし、特に言語設計レベルでは、それらは簡単に融合しているように感じます。それらがどのように関連しているか(または関連していないか)の明確な説明と、それぞれが最もよく適用されるプログラムのクラスが気に入っています。

5
複数の待機よりも単一の「待機Task.WhenAll」を優先する必要があるのはなぜですか?
タスク完了の順序を気にせず、すべて完了する必要がある場合でもawait Task.WhenAll、複数の代わりに使用する必要がありますawaitか?たとえば、DoWork2以下の方法が推奨されますDoWork1(そしてその理由は?): using System; using System.Threading.Tasks; namespace ConsoleApp { class Program { static async Task<string> DoTaskAsync(string name, int timeout) { var start = DateTime.Now; Console.WriteLine("Enter {0}, {1}", name, timeout); await Task.Delay(timeout); Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds); return name; } static async Task DoWork1() { var t1 = DoTaskAsync("t1.1", …

8
Powershellはコマンドを並行して実行できますか?
大量の画像に対していくつかのバッチ処理を実行するPowerShellスクリプトがあり、並列処理を実行したいと考えています。Powershellには、start-job、wait-jobなどのバックグラウンド処理オプションがあるようですが、並列処理を行うために見つけた唯一の優れたリソースは、スクリプトのテキストを書き、それらを実行することでした(PowerShellマルチスレッド) 理想的には、.net 4のforeachに類似したものを希望します。 かなりのように見えないもの: foreach-parallel -threads 4 ($file in (Get-ChildItem $dir)) { .. Do Work } 多分私はc#にドロップダウンするほうがいいでしょう...

4
マルチプロセッシングの共有メモリオブジェクト
私はメモリに大きなnumpy配列があるfuncとします。この巨大な配列を(他のいくつかのパラメーターと共に)入力として受け取る関数があります。func異なるパラメータを使用して、並行して実行できます。例えば: def func(arr, param): # do stuff to arr, param # build array arr pool = Pool(processes = 6) results = [pool.apply_async(func, [arr, param]) for param in all_params] output = [res.get() for res in results] マルチプロセッシングライブラリを使用すると、その巨大な配列が複数のプロセスにコピーされます。 異なるプロセスに同じ配列を共有させる方法はありますか?この配列オブジェクトは読み取り専用であり、変更されることはありません。 arrが配列ではなく任意のpythonオブジェクトである場合、もっと複雑なことは何ですか?それを共有する方法はありますか? [編集済み] 私は答えを読みましたが、私はまだ少し混乱しています。fork()はコピーオンライトであるため、Pythonマルチプロセッシングライブラリで新しいプロセスを生成するときに追加のコストを呼び出さないでください。しかし、次のコードは大きなオーバーヘッドがあることを示唆しています: from multiprocessing import Pool, Manager import numpy as np; import …

1
合計メモリ使用量が22Mbだけであるにもかかわらず、Haskellスレッドのヒープオーバーフロー?
レイトレーサーを並列化しようとしています。これは、小さな計算の非常に長いリストがあることを意味します。バニラプログラムは67.98秒で特定のシーンで実行され、合計メモリ使用量は13 MBで、生産性は99.2%です。 最初の試みparBufferでは、バッファサイズ50 の並列方式を使用しました。parBufferスパークが消費されるのと同じ速さでリストをウォークスルーしparList、大量のメモリを使用するようなリストのスパインを強制しないため、私はそれを選択しましたリストが非常に長いため。では-N2、100.46秒で実行され、合計メモリ使用量は14 MBで、生産性は97.8%でした。スパーク情報は次のとおりです。SPARKS: 480000 (476469 converted, 0 overflowed, 0 dud, 161 GC'd, 3370 fizzled) 霧状の火花の割合が高いことは、火花の粒度が小さすぎることを示しているため、次にparListChunk、リストをチャンクに分割し、チャンクごとに火花を作成する方法を試しました。チャンクサイズで最高の結果が得られました0.25 * imageWidth。プログラムは93.43秒で実行され、総メモリ使用量は236 MB、生産性は97.3%でした。スパーク情報は次のとおりSPARKS: 2400 (2400 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)です。メモリ使用量がはるかに多いのparListChunkは、リストのスパインを強制するためです。 次に、リストをチャンクに遅延して分割し、チャンクを渡しparBufferて結果を連結する独自の戦略を記述しようとしました。 concat $ withStrategy (parBuffer 40 rdeepseq) (chunksOf 100 (map colorPixel pixels)) これは、95.99秒で実行され、合計メモリ使用量は22MBで、生産性は98.8%でした。これは、すべてのスパークが変換され、メモリ使用量ははるかに少ないという意味で成功しましたが、速度は向上しません。これは、イベントログプロファイルの一部の画像です。 ご覧のとおり、ヒープオーバーフローが原因でスレッドが停止しています。+RTS -M1Gデフォルトのヒープサイズを最大1Gbまで増やす追加を試みました。結果は変わりませんでした。Haskellのメインスレッドはスタックがオーバーフローするとヒープのメモリを使用することを読んだので、デフォルトのスタックサイズも増やしてみました+RTS -M1G -K1Gが、これも影響はありませんでした。 他に試すことができるものはありますか?必要に応じて、メモリ使用量やイベントログの詳細なプロファイリング情報を投稿できます。多くの情報であり、すべてを含める必要があるとは思わなかったため、すべてを含めませんでした。 編集:私はHaskell …

5
parallel.foreachを解除しますか?
parallel.forループから抜け出すにはどうすればよいですか? 次のようなかなり複雑なステートメントがあります。 Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((ColorIndexHolder Element) => { if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { Found = true; break; } })); 並列クラスを使用すると、このプロセスを大幅に最適化できます。しかしながら; 並列ループを解除する方法がわかりませんか?break;文は、次の構文エラーがスローされます。 中断または継続する囲みループがない

7
ロックステートメントはどれくらい高価ですか?
私はマルチスレッドと並列処理を実験しており、基本的なカウントと処理速度の統計分析を行うためのカウンターが必要でした。クラスの同時使用に関する問題を回避するために、クラスのプライベート変数にロックステートメントを使用しました。 private object mutex = new object(); public void Count(int amount) { lock(mutex) { done += amount; } } しかし、私は不思議に思っていました...変数のロックはどれほど高価ですか パフォーマンスへの悪影響は何ですか?

4
MapReduceソートアルゴリズムはどのように機能しますか?
MapReduceの威力を示すために使用される主な例の1つは、Terasortベンチマークです。MapReduce環境で使用される並べ替えアルゴリズムの基本を理解できません。 私にとって、ソートは単に、他のすべての要素との関係における要素の相対位置を決定することを含みます。したがって、ソートには「すべて」と「すべて」の比較が含まれます。平均的な並べ替えアルゴリズム(クイック、バブルなど)は、これをスマートな方法で単純に実行します。 私の考えでは、データセットを多くの部分に分割するということは、1つの部分を並べ替えることができ、これらの部分を「完全な」完全に並べ替えられたデータセットに統合する必要があることを意味します。テラバイトのデータセットが数千のシステムに分散していることを考えると、これは大きな仕事になると思います。 それで、これは実際にどのように行われますか?このMapReduce並べ替えアルゴリズムはどのように機能しますか? 理解してくれてありがとう。

5
Pythonでサブプロセス、マルチプロセッシング、スレッドを決定しますか?
実行しているマシンで複数のプロセッサを利用できるように、Pythonプログラムを並列化したいと思います。私の並列化は非常に単純です。プログラムのすべての並列「スレッド」は独立しており、それらの出力を別々のファイルに書き込みます。情報を交換するためにスレッドは必要ありませんが、パイプラインの一部のステップは出力に依存しているため、スレッドがいつ終了するかを知ることが不可欠です。 移植性は重要です。Mac、Linux、WindowsのすべてのPythonバージョンで実行したいのです。これらの制約を考えると、これを実装するのに最も適切なPythonモジュールはどれですか。スレッド、サブプロセス、マルチプロセッシングのいずれかを決定しようとしています。これらはすべて、関連する機能を提供しているようです。 これについて何か考えはありますか?ポータブルで最も簡単なソリューションが欲しいです。

13
いくつかのスレッドが完了するのを待つ方法は?
すべてのスレッド化されたプロセスが完了するのを単に待つ方法は何ですか?たとえば、私が持っているとしましょう: public class DoSomethingInAThread implements Runnable{ public static void main(String[] args) { for (int n=0; n<1000; n++) { Thread t = new Thread(new DoSomethingInAThread()); t.start(); } // wait for all threads' run() methods to complete before continuing } public void run() { // do something here } } これを変更して、main()すべてのスレッドのrun()メソッドが終了するまでメソッドがコメントで一時停止するようにするにはどうすればよいですか?ありがとう!


2
SLURMの `srun`と` sbatch`およびそれらのパラメーター
SLURMsrunとsbatchコマンドの違いを理解しようとしています。以下の質問に対する具体的な回答ではなく、一般的な説明に満足しますが、ここでは、出発点となり、私が探しているもののアイデアを与えることができるいくつかの具体的な混乱のポイントを示します。 ドキュメントによると、srunはジョブsbatchを送信するためのものであり、後で実行するためにジョブを送信するためのものですが、実際の違いは私にはわかりません。それらの動作は同じようです。たとえば、それぞれ2つのCPUを備えた2つのノードを持つクラスターがあります。srun testjob.sh &5xを続けて実行すると、CPUが使用可能になるまで、5番目のジョブがうまくキューに入れられますsbatch testjob.sh。 質問をより具体的にするために、私は始めるのに良い場所かもしれないと思います:私が他ではできないことの1つで私ができることは何ですか、そしてなぜですか? 両方のコマンドの引数の多くは同じです。最も関連性の高いように見えるものがあります--ntasks、--nodes、--cpus-per-task、--ntasks-per-node。これらは互いにどのように関連しており、srunvsではどのように異なりますsbatchか? 1つの特定の違いは、実行可能権限がないsrun場合、testjob.shつまりchmod +x testjob.sh、実行可能ファイルsbatchを正常に実行するとエラーが発生することです。これを引き起こす「内部」で何が起こっているのでしょうか。 ドキュメントにsrunは、sbatchスクリプト内で一般的に使用されるものについても記載されています。これは、次の質問につながります。それらはどのように相互作用し、それぞれの「標準的な」ユースケースは何ですか?具体的にはsrun、単独で使用することはありますか?

2
複数のプロセス間で結果キューを共有する
multiprocessingモジュールのドキュメントには、で始まるプロセスにキューを渡す方法が示されていますmultiprocessing.Process。しかし、どのようにして非同期ワーカープロセスでキューを共有できapply_asyncますか?動的な結合などは必要ありません。ワーカーが(繰り返し)結果をベースに報告する方法にすぎません。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) これは失敗します: RuntimeError: Queue objects should only be shared between processes through inheritance。私はこれが何を意味するのかを理解し、酸洗い/酸洗いを必要とするのではなく継承するためのアドバイス(およびWindowsのすべての特別な制限)を理解しています。しかし、機能するようにキューを渡すにはどうすればよいですか?私は例を見つけることができず、さまざまな方法で失敗した代替案をいくつか試しました。助けてください?


2
Repaアレイの並列mapM
との最近の作業ではGibbs sampling、RVar乱数生成にほぼ理想的なインターフェースを提供するものを活用しています。残念ながら、マップでモナディックアクションを使用できないため、Repaを使用できませんでした。 明らかにモナディックマップは一般的に並列化できませんがRVar、効果を安全に並列化できるモナドの少なくとも1つの例である可能性があります(少なくとも原則として、私はの内部動作にあまり精通していませんRVar)。 。つまり、次のようなものを書きたいのですが、 drawClass :: Sample -> RVar Class drawClass = ... drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples どこにA.mapM似ているでしょう、 mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.