問題タブ [barrier]
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.
performance - 1 つのカーネルを使用した OpenCL ガウス畳み込みが遅い
2 つの 1D ガウス フィルター (ガウス分離可能性) を使用して、OpenCL に 2D ガウス フィルターを実装しました。
私は畳み込みの2つのバージョンを実装しました:
- 2 つ目は 2 つのカーネルを使用します。1 つは畳み込みを適用し、もう 1 つは画像を転置します (画像の転置には約 7ms - 畳み込みと約 1ms - かかります)。
両方の実装の計算時間を評価したところ、2 つのカーネルを使用した実装は、1 つのカーネルを使用した実装よりも高速であることがわかりました (転置カーネルは畳み込みカーネルを待たなければならないことに注意してください)。
たった 1 つのカーネルのセットアップ時間が 2 つのカーネルのセットアップ時間よりも速くなければならない場合でも、1 つのカーネルを使用した実装が遅い理由を理解するのを手伝ってくれませんか。
両方の実装の OpenCL ソース コードを以下に示します。
1 つのカーネルの実装
/li>2 つのカーネルの実装
畳み込み:
転置:
/li>
c# - スレッド バリアの問題 - PulseAll がすべてのスレッドに到達しない
私はいくつかの障壁の問題がある並列アルゴリズムを持っています。「検索」と叫ぶ前に、利用可能な投稿とリンクを確認し、Monitor.Wait と Monitor.PulseAll を使用してバリアの指示に従っていると言えますが、私の問題は、最後に作成されたものを除くすべてのスレッドです。 (そして開始された)は、メインスレッドからの PulseAll によって到達されます。コードの基本的なレイアウトは次のとおりです。
これはメイン スレッドによって実行され (いくつかの不要な部分を削除)、メイン スレッドは常にリストの最後のスレッドの Join() でスタックすることは前に述べたとおりです。スレッドのメソッドは次のようになります。
このタイプのシグナリングに使用できる他のバリアはありますか? 私が望むのは、メインスレッドがすべてのスレッドに同時に信号を送って、同時に開始するようにすることだけです。可能な限り並行して実行するために、それらを同時に開始する必要があります(アルゴリズムの実行時間と他のいくつかのことを測定します)。バリアまたはコードに欠陥のある部分はありますか (バリアとは)? より少ないスレッドでインスタンスを実行しようとしましたが、それでも最後のスレッドでスタックします。なぜなのかわかりません。VS デバッグを介して、最後のスレッドがスリープしていることを確認しました (他のすべてのスレッドは !isAlive ですが、最後のスレッドは isAlive = true です)。どんな助けでも大歓迎です!
multithreading - C++11 での boost::barrier の実装
プロジェクトからすべてのブースト参照を取り除き、純粋な C++ 11 に切り替えようとしています。
ある時点で、バリアが「go」コマンドを発行するのを待って作業を行い (N 個のスレッドに分散)、すべての作業が終了したときに同期するスレッド ワーカーが作成されます。基本的な考え方は、メインループが go order (boost::barrier .wait()) を与え、同じ関数で結果を待つというものです。
別のプロジェクトで、Boost バージョンに基づいてカスタム メイドの Barrier を実装しましたが、すべてが完全に機能しました。実装は次のとおりです。
Barrier.h:
バリア.cpp
このコードは iOS と Android の NDK で問題なく使用されていますが、Visual Studio 2013 プロジェクトで試してみると、ミューテックスをロックしたスレッドのみがロックを解除できるようです (アサーション: 所有されていないミューテックスのロック解除)。
C ++ 11で機能する、回転しない(このようなブロッキング)バージョンのバリアを使用できますか? ビジー待機を使用するバリアを見つけることができましたが、これは防止したいものです (本当に理由がない場合を除きます)。