問題タブ [parallel-processing]
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.
c++ - C++ でのマルチスレッド画像処理
さまざまなサイズの画像を操作するプログラムに取り組んでいます。これらの操作の多くは、入力からピクセル データを読み取り、別の出力に書き込みます (ぼかしなど)。これはピクセル単位で行われます。
このような画像マッピングは、CPU に非常に負担がかかります。マルチスレッドを使用して高速化したいと考えています。どうすればいいですか?ピクセルの行ごとに 1 つのスレッドを作成することを考えていました。
いくつかの要件があります。
- 実行可能サイズは最小化する必要があります。つまり、大規模なライブラリを使用することはできません。C/C++ 用の最も軽量で移植可能なスレッド化ライブラリは何ですか?
- 実行可能サイズは最小化する必要があります。行ごとにスレッドを実行する forEachRow(fp* ) 関数、または fp が独自のスレッド内の単一のピクセルで動作する forEachPixel(fp* ) を使用することを考えていました。どれが最高ですか?
- 通常の関数、ファンクター、functionoid、またはラムダ関数などを使用する必要がありますか?
- 一部の操作では、前に処理されたピクセルからの情報を必要とする最適化が使用されます。これにより、forEachRow が有利になります。これを考慮しても forEachPixel を使用した方が良いでしょうか?
- 読み取り専用および書き込み専用の配列をロックする必要がありますか?
- 入力は読み取られるだけですが、多くの操作では配列内の複数のピクセルからの入力が必要です。
- 出力はピクセルごとに 1 回だけ書き込まれます。
- もちろん速度も重要ですが、実行可能ファイルのサイズを最適化することが優先されます。
ありがとう。
好奇心旺盛な方向けのこのトピックの詳細: C++ 並列化ライブラリ: OpenMP vs. スレッド ビルディング ブロック
java - 並列化: 同期と I/O 以外で Java スレッドがブロックされる原因は何ですか?
ショートバージョンはタイトルにあります。
長いバージョン: Java を使用して科学的最適化のためのプログラムに取り組んでいます。プログラムのワークロードは、並列フェーズと直列フェーズに分けることができます。並列フェーズとは、高度に並列化可能な作業が実行されていることを意味します。プログラムを高速化するために (数時間または数日間実行されます)、使用しているマシンの CPU コアの数 (通常は 4 または 8) に等しい数のスレッドを作成し、それらの間で作業を分割します。次に、これらのスレッドを開始して join() してから、シリアル フェーズに進みます。
ここまでは順調ですね。私を悩ませているのは、並列フェーズの CPU 使用率とスピードアップが「理論上の最大値」にほど遠いことです。たとえば、4 つのコアがある場合、「使用率」は 350 ~ 400% になると予想されます (top で報告されているように)。代わりに、180 から約 310 の間で跳ね返ります。1 つのスレッドのみを使用すると、100% の CPU 使用率が得られます。
スレッドがフルスピードで実行されない唯一の理由は次のとおりです。 - I/O によるブロッキング - 同期によるブロッキング
並列スレッドでは I/O はまったく行われておらず、同期も行われていません。スレッドによって共有される唯一のデータ構造は読み取り専用であり、基本型または (非同時) コレクションのいずれかです。だから私は他の説明を探しています。1 つの可能性として、複数のスレッドがガベージ コレクションのために繰り返しブロックしている可能性がありますが、それはメモリ プレッシャーのある状況でのみ意味があるように思われ、必要な最大ヒープ領域をはるかに超えて割り当てています。
任意の提案をいただければ幸いです。
更新:誰かが興味を持っている場合に備えて、さらに調査した後、一般的なパフォーマンスのためにコードを微調整し、同期とは何の関係もありませんが、使用率が向上していることを確認しました。ただし、いくつかの変更により、特に新しいヒープ割り当てが少なくなるはずでした。イテレータと一時的なボックス化された数値の使用をいくつか取り除きました (ハイパフォーマンス Java コンピューティング用の CERN "Colt" ライブラリは、ここで役立ちました: IntArrayList のようなコレクションを提供します)。 、基本型の DoubleArrayList など)。したがって、おそらくガベージコレクションが原因だと思います。
multithreading - Octave と並行してループの一部を実行していますか?
20000 行を超えるマトリックスで実行する必要がある次のコードがあります。実行には数分かかり、datenum および str2double 関数がボトルネックになっているようです。計算は前のものに依存しないため、ループを複数の部分に分割して並列に実行する方法はありますか? このコードの最適化に関するアドバイスをいただければ幸いです。
c# - Parallel.For を使用して SQL クエリをテストし、ThreadPool と比較する
高い並列負荷の下で実行するときにパフォーマンスが必要な SQL (ADO.NET を使用し、LINQ や PLINQ を使用することは何もない) の一部を簡単にロード テストしてベンチマークする方法を探しています。
新しい並列拡張機能 CTP を使用して、具体的にはParallel.For
/Parallel.ForEach
単純に SQL を 10,000 回程度繰り返し実行することを考えましたが、これらが最適化された目的に関するデータを見つけることができませんでした。
基本的に、データベース アクセスは本質的に I/O バウンドであるため、十分な負荷が発生しないのではないかと心配しています。パラレルかどうかは誰にもわかりません。実行中のタスクが完全に CPU バウンドでない場合、x 個のスレッド (x = CPU の数) を使用するのに十分なほどインテリジェントですか? つまり、マネージド スレッド プールと同様に動作しますか?
だったらむしろカッコイイ!
編集: @CVertex が親切に以下を参照しているように、スレッドの数を個別に設定できます。ジョブが I/O バウンドの場合、デフォルトで並列ライブラリがスレッドを追加し続けるのに十分なほどインテリジェントかどうかは誰にもわかりませんか?
database - 並列ノンブロッキングデータベースアクセスを備えた Web スクリプト言語?
私の Web アプリケーションは複数のデータベース シャードを使用する必要があり、場合によってはこれらのシャードを並行してクエリする必要があります。並列ノンブロッキング データベース アクセスを成熟して安定してサポートする Web スクリプト言語はありますか? もしそうなら、あなたは私を正しい方向に向けることができますか?無料のオープンソースが好まれますが、私は主に動作するものを望んでいます.
スレッドは私には問題ありませんが、本当のマルチスレッド サポートは必要ありません。私が望むのは、5 つの異なるデータベース サーバーに対する 5 つの 10 秒のデータベース クエリが、50 秒ではなく 10 秒かかることだけです。実際に使用された CPU の数は問題ではありません。
sql - ストアド プロシージャを順次または並列に開始する
毎晩実行されるストアド プロシージャがあり、それによって他の多くのプロシージャが開始されます。これらの手順の一部は、他の手順と並行して論理的に実行できます。
- プロシージャを並列で実行するかシリアルで実行するか (つまり、非同期で開始するかブロックするか) を SQL Server に示すにはどうすればよいですか?
- プロセスがテーブルアクセスやロックをめぐって競合しないことをすでに判断していることを念頭に置いて、それらを並行して実行することの意味は何でしょう-ディスクIOとメモリの合計だけです。ほとんどの場合、同じテーブルを使用することさえありません。
- これらのプロシージャのいくつかが同じプロシージャで、パラメータが異なるだけで問題になるでしょうか?
- ペアまたはプロシージャを非同期で開始する場合、SQL Server に両方が終了するのを待つ適切なシステムがありますか、またはそれぞれにフラグを設定し、フラグを定期的にチェックしてポーリングする必要があり
WAITFOR DELAY
ますか?
現時点では、まだ SQL Server 2000 を使用しています。
補足として、メインフレーム システムからサーバーへのデータ ダンプの完了に応答してメイン プロシージャが開始されるため、これは重要です。メインフレームのダンプには毎晩約 2 時間かかりますが、それを制御することはできません。そのため、Google では処理時間を短縮する方法を常に模索しています。
delphi - Delphiで利用可能なLPT(パラレル)ポートとアドレスを見つける
私はパラレルポートでダイレクト I/O を行っていますが、これは問題なく速度を上げるために必要です。使用可能なポートを列挙して、セットアップ時にユーザーがポートを選択できるようにしたいと考えています。デバイス マネージャーを介してアドレスを手動で読み取るという面倒なトロールは必要ありません。誰かがこれを行う手段を知っていますか? どうもありがとう、ブライアン
.net - Web アプリケーションでの並列拡張機能の使用
並列拡張 ( June CTP など) を使用する可能性を含め、並列コンピューティングのアプローチが Web アプリケーションでどのような役割を果たしているのかについて、いくつかの意見を聞きたいと思います。このアプローチが適している、または適していないシナリオは何ですか?
IIS と Web ブラウザーがどのようにタスクをスレッド化するかについての私の理解はかなり限られています。誰かがよく理解しているなら、それについての洞察をいただければ幸いです。一般的に、IIS と Web ブラウザーの動作が、Web アプリケーションでスレッド化されたタスクや非同期タスクを作成する ROI を制限するかどうかを知りたいと思っています。
前もって感謝します。