問題タブ [ppl]
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.
visual-c++ - 継続チェーンに共有ポインタは必要ですか?
あるタスクが変数に割り当てられ、次のタスクがその変数から読み取るラムダ式を使用した継続チェーンがあります。Microsoft は、変数が参照カウント ハンドル (^) であってもshared_ptr
、 を使用して変数をラップすることをお勧めします。参照カウント ハンドルは、ラムダ式によって値によってキャプチャされると、その参照カウントをインクリメントしませんか? では、参照カウントされたハンドルを でラップする必要があるのはなぜshared_ptr
ですか?
visual-c++ - Parallel Patterns Library (PPL) の COM STA モデル?
いくつかの非同期タスクに並列パターン ライブラリを使用する MFC アプリケーションがあります。それらのいくつかは COM オブジェクトを使用するため、そのようなタスクでは COM ライブラリを初期化する必要があります。メイン スレッドは MFC アプリ (MFC アプリ スレッドは STA のみ) であり、タスクがどのトレッド コンテキストで呼び出されるかわからないため、このような場合はすべて COM STA モデルの初期化を使用します。
いくつかの例:
このコードは Windows 7/XP で正常に動作します。しかし、C++ 2012 Platform Toolset を使用する Windows 8.1 では、CoInitializeEx() が RPC_E_CHANGED_MODE エラーを返すため、タスク 1 と 2 が機能しません! タスク 3 は通常、OLE であるメイン MFC スレッド コンテキストで PPL コアによって呼び出され、その COM は既に COINIT_APARTMENTTHREADED として初期化されているため、CoInitializeEx() は成功の S_FALSE コード (二重初期化) を返します。
タスク 2 および 3 の場合、PPL コアは、Windows 7/XP で COM として PRE 初期化されていない個別のスレッドを作成するため、タスクの最初の行で COM を正常に初期化します。 しかし、Windows 8.1 では、すべてのスレッドが COINIT_MULTITHREADED フラグを持つ COM として事前に初期化されているように見え、その後の CoInitializeEx(..., COINIT_APARTMENTTHREADED) 呼び出しはエラーを返します!
なんてこったい!Window 8.1 で正しい COM 初期化ルールを定義するにはどうすればよいですか? 私の間違いはどこですか?PPL は、タスクのスレッド コンテキストに対して保証されておらず、MFC では STA でなければならないメイン スレッドである可能性があります。また、いつ MTA または STA COM 初期化を使用する必要があるかを定義できません。
私を助けてください。これは、2012 C++ プラットフォーム ツールセットの PPL コア コードのエラーか、Windows 8.1 での PPL 使用のエラーでしょうか?
c++ - Rxcpp のスケジューラ
Rxの C++バージョンでスケジューリング モデルを理解しようとしています。
1 つの Schedule メソッドを備えた単純なインターフェイスがある C# バージョンを知っている。C++ バージョンは、スケジューラ、ワーカー、調整など、かなり複雑に見えます。
私にとって欠けている主要な部分の 1 つは、スレッド プール スケジューラの実装です。他の名前で存在するのでしょうか? どうすれば自分で実装できますか?PPL(Windows)の上に書くべきですか?その上にシリアライズされた (アクターのような) オブザーバーが必要な場合、何を使用すればよいですか? こことここを覗いてみると、これが簡単な作業ではないことがわかります。
公式ドキュメントは自動生成され、まだ非常にまばらな ので、主題に関するある種の概要を得るのに本当に役立ちます.
multithreading - PPL スレッド グループの優先度を設定する
一部の関数をできるだけ早く完了し、他のタスクを犠牲にして計算リソースを与える必要があるシナリオがあります (つまり、優先度が高い)。具体的には、グラフィック レンダリング、およびレンダリング用に生成されたタスクは、できるだけ速く実行する必要がありますが、CPU 容量をすべて消費しないようにする必要があります。同時に、CPU の空きサイクルをタイム クリティカルではない他の作業で埋め、レンダリング タスクからサイクルを盗まないようにしたいと考えています。
基本的な考え方はかなり単純ですが、PPL でやりたいことを行う方法がわかりません。デフォルトのスケジューラを異なる優先度に設定する方法を見つけましたが、優先度をグローバルに変更したくありません。むしろ、いつでもタスクを追加できる 2 つの個別のスケジューリング ポリシーが必要です。
理想的な状況は、優先度の異なる 2 つの task_group インスタンスを作成し、必要に応じて関連するグループにタスクを追加できる場合ですが、その方法がわかりません。私が見つけた最も関連性の高いドキュメントをリンクしました. また、PPL の基本的な機能を使用できるのであれば、エージェントとメッセージ パッシングの複雑さを追加したくありません。
https://msdn.microsoft.com/en-us/library/dd984038.aspx
また、スレッドから生成されたサブタスクが親の優先度を確実に継承できるようにすることも重要です。具体的には、優先度の高いタスクと低いタスクの両方から parallel_for を呼び出し、parallel_for ブロックは同じ優先度を維持する必要があります。
c++ - 異なるタイプのタスクを含むPPL when_all?
さまざまなタイプのタスクで PPL "when_all" を使用したいと思います。そして、そのタスクに「then」呼び出しを追加します。
ただし、 when_all はベクトルを取るタスクを返すため、すべての要素が同じ型である必要があります。では、これを行うにはどうすればよいですか?
これは私が思いついたものですが、ちょっとしたハックのように感じます:
誰かがより良いアイデアを得ましたか?
(parallel_invokeブロックなので使いたくない)
c++ - PPL Combinable での SIMD アライメントの問題
SIMDと並行して配列の要素を合計しようとしています。ロックを回避するために、_mm_add_epi32 が例外をスローしているため、常に 16 バイトに整列されているとは限らない、結合可能なスレッド ローカルを使用しています。
ここにppl.hからのcombinableの定義があります
位置合わせに問題がなく、コードが正常に機能することもありますが、ほとんどの場合は機能しません
以下を使用しようとしましたが、これはコンパイルされません
アライメントの問題を修正するための提案はありますが、まだ組み合わせ可能なものを使用しています。
x64 では、デフォルトの 16 バイト アラインメントにより問題なく動作します。x86 では、アライメントの問題が存在することがあります。
c++ - parallel_for_each のサブタスクを中断する
フィールドの 1 つ (コスト属性など) に基づいて並べ替えられたアイテムの大きなベクトルがあり、これらの各アイテムに対して少し処理を行って、異なる属性の最大値を見つけたいと考えています... 制約ここで、アイテムのコストが任意の価格を超える場合、そのアイテムを使用して最大値を計算することはできません。
シングル スレッドの for ループは次のようになります。
これをparallel_for_eachにいくらか変換することができました。(免責事項: 私は PPL を初めて使用します。)
parallel_for 内の return ステートメントは、まだすべてのアイテムに対して実行されているため、効率が悪いように感じられます。この場合、parallel_for が、コストが高すぎるベクターの複数の部分を繰り返し処理することになる可能性は十分にあります。
ベクトルが既にコストでソートされているという事実をどのように利用できますか?
キャンセル トークンの使用を検討しましたが、parallel_for のすべてのサブタスクがキャンセルされ、間違った最大値を取得する可能性があるため、そのアプローチは正しくないようです。
parallel_for の特定のサブタスクをキャンセルできるキャンセル トークンのようなものはありますか、またはこの場合、parallel_for よりも優れたツールはありますか?
c++ - parallel_for / parallel_for_each の内部または外部のクラス オブジェクト?
私は並列ループ (C++11) について勉強し、MS Visual Studio 2013 でそれらをテストしてきました。
しかし、私の懸念は、単純なユークリッド距離測定を実行する関数を呼び出さなければならないことです。関数自体は明らかですが、関数を EuclideanDistance というクラスに移動し、関数Match(vectorA,vectorB)内で 2 つのベクトルに対してユークリッド数学を実行する必要があります 。これは単にノルム (...) 計算です。浮動小数点値。
では、parallel_for/parallel_foreach ループ内でこれを行うにはどうすればよいでしょうか。ループ内でクラス オブジェクトを作成しますか?それとも、クラス オブジェクトをループ外に保持すると矛盾が生じますか? 並列ループについて正しく理解していれば、それが機能する関数は基本的に、起動されたすべてのスレッドのクリーン コピーです。これはクラス関数の場合に起こりますか? 私の予感はノーです!2 番目のコード スニペットに示すように、クラス内にオブジェクトを作成しない限り。
例: 読みやすくするために、コードを省略しています。
それとも、これが正しい方法でしょうか?
クラス全体は、単一の関数にすぎません。
どんな落とし穴でも大歓迎です!
c++ - ppl でタスクにパラメーターを渡す
Visual Studio で ppl を学び始めたばかりで、タスクについて学び始めました。ここまでは順調です。たとえば、基本的なことは理解できています。しかし、引数を受け取るタスクを作成するにはどうすればよいですか? つまり、引数を取らないタスクを作成するのはかなり簡単ですが、引数を取るタスクは私にはまったくわかりません。
タスクが引数を取らないタスクの作成は簡単です:
実際に引数を渡すことはできません。どうすればいいでしょうか。引数をラムダに渡そうとすると、コンパイル エラーが発生します。