問題タブ [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.
windows - C++/CX Metro Windows - create_task の実装により、そのスコープで定義されていない変数の使用が防止されます
create_task の実装外で Uri^ を定義しようとしています。Java では、非同期タスクに final 修飾子を追加すると、非同期コード内でその変数 (final 修飾子付き) を使用できるようになります。
非同期コード内で以下のコードから Uri^ ソースを使用するにはどうすればよいですか?
c++ - Concurrency::critical_section ビルド エラー: プライベート メンバーにアクセスできません
以下のコード (vs2013) ブロックをビルドできず、「エラー C2248: 'Concurrency::critical_section::critical_section' : cannot access private member defined in class 'Concurrency::critical_section'」というエラーが表示される
なぜこれが起こっているのか、誰でも説明できますか?ありがとう
c++ - WinRT c++ の BitmapImage SetSourceAsync
WinRT c++ は初めてです。C# から StorageFile 画像を渡してファイルを開き、それを WinRT の BitmapImage のソースとして設定して、画像の高さと幅を抽出しようとしています。次のコードを使用しています。
このコードは機能していないようです。行 BitmapImage^ bmp = ref new BitmapImage(); の後 デバッガーは、ソース コードが見つからないと言って停止します。正しいコードを書くのを手伝ってもらえますか?
c++ - スレッド プールでの C++ スレッドの実行順序
並列スレッド (典型的なスレッド プールのような) の両方を許可するだけでなく、シリアル実行順序を連続して実行できる C++ スレッド プールの実装を知っている人はいますか。次のスレッドプールを変更してこれを機能させるために数日を費やしましたが、機能させることができないようです。私は intel TBB で使用されている手法を調べました。また、Microsoft の PPL (その非同期エージェント ライブラリは有望に見えます) の概念を使用する可能性も調べました。どちらも上記を達成するためのタスク指向の手法を持っています。しかし、残念ながら、これらのソリューションはターゲットの PowerPC Linux 組み込みターゲットが機能しません。
編集私は、スレッドグラフを生成するソースを使用してライブのcoliruデモをまとめました-また、理論的にはスレッドが完了するのを待つことができるscheduler_loopの良い例も示しています。このコードは、同時実行タスクをフィードする 2 つのスレッドを持つ UtlThreadPool も示しています。
実行グラフを作成するために使用するデータ構造を以下に示します。PriorityNode データ構造を使用します。この構造は基本的に PriorityNode のリンクされたリストであり、それぞれにPriorityLevelのベクトルが含まれています。同時に実行できるタスクと、後で順次実行されるスレッドを示す次の PriorityNode へのポインター。これらがすべて完了したら、mNextNode メンバーが nullptr でない場合は、これをスレッド プールで実行するようにスケジュールする必要があります (mNextNode が nullptr になるまで同様に実行されます。この PriorityNode のリンクされたリストを介したシーケンスは、私がスレッドを希望する方法です) PriorityNode には通常、次のような出力を生成する挿入演算子があります (これは、1A1 を 1A2 と同時に実行でき、これらのスレッドの両方が完了すると、次の PriorityNode が 1B1、1B2、1B3 を許可し、同時に実行するには 1B4 - プールが使用できるスレッドの数に関係なく。
私が持っている最も近いものは、この問題の解決策のようです-これはインテル固有のものであり、私はパワーPCを使用していることに注意してください-インテルTBBです-シリアル実行順序に使用する例を次に示します。
gcc - gcc を使用する場合の ClooG の ISL と PPL の特徴的な機能は何ですか?
の任意のバージョンをビルドまたは使用する場合gcc
、ClooG 用にこの 2 つのバックエンドのうち 1 つを優先する必要があるのはなぜですか?
ウェブサイトでそれに関する適切なドキュメントを見つけることができませんgcc
。
c++ - Concurrency::parallel_for (PPL) が作成するスレッドが多すぎます
Visual Studio 2010 の Parallel Patterns Library (PPL) を使用Concurrency::parallel_for()
して、インデックス付きの一連のタスクを処理しています (通常、インデックス セットは、同時に実行できるスレッドの数よりもはるかに大きくなります)。各タスクは、長い計算を行う前に、共有リソース マネージャーからプライベート作業ストレージ リソースを要求することから始めます (例: タスク固有のメモリ マップ ファイルのビューですが、各タスクが共有ヒープからのプライベート メモリ割り当てを要求しました)。
共有リソース マネージャーの使用は と同期され、Concurrency::critical_section
ここから問題が始まります。最初のスレッド/タスクがクリティカル セクションにあり、2 番目のタスクが要求を行う場合、最初のタスクの要求が処理されるまで待機する必要があります。PPL はどうやら次のように考えます: このスレッドは待機中であり、実行するタスクが他にもあるため、別のスレッドが作成され、ほとんどが同じリソース マネージャーで最大 870 のスレッドを待機させます。
リソース要求の処理はタスク全体のほんの一部にすぎないので、その部分で PPL に馬を保持するように伝えたいと思います。 working-thread とここでの私の質問は、特定のスレッドセクションが協調的にブロックされていても、特定のスレッドセクションが新しいスレッドを作成するのを防ぐことができるかどうか、およびその方法です。スレッドの処理パスのさらに下にある他のブロックで新しいスレッドが作成されることは気にしませんが、(ハイパー) コアの数の 2 倍にすぎません。
これまでに検討した代替案:
タスクをキューに入れ、限られた数のスレッドからキューを処理します。問題: 私は、PPL の parallel_for が単独でそれを行うことを望んでいました。
を定義し
Concurrency::combinable<Resource> resourceSet
ます。(リソースを再利用することにより) リソース要求の数をスレッドの数 (タスクの数より少なくする必要があります) に減らすために、一度Concurrency::parallel_for
初期化します。resourceSet.local()
問題: この最適化では、余分なスレッドの作成が妨げられません。parallel_for
ループ外の各タスクに必要なリソースを事前に割り当てます。問題: これはあまりにも多くのシステム リソースを要求しますが、リソースの量をスレッド/コアの数に制限しても問題ありません (それが爆発しない場合)。
http://msdn.microsoft.com/en-us/library/ff601930.aspxのセクション「並列ループで繰り返しブロックしない」を読みましたが、ここのアドバイスに従うと、並列スレッドがまったく発生しません。
visual-studio-2013 - PPL は、スレッドを作成するときにシステムの負荷を考慮しますか?
次のように、PPL を使用してタスクを作成し、[おそらく] 他のスレッドにディスパッチし始めています。
毎秒タスクを作成する小さなアプリケーションを試してみました。タスクは 5 秒間重い計算を実行し、その後停止します。
PPL が自分のマシンで作成するスレッドの数と、マシンの負荷がスレッドの数またはスレッドに割り当てられるタスクに影響するかどうかを知りたいと思っていました。12 コア マシンでアプリケーションの 1 つ以上のインスタンスを実行すると、次のことに気付きます。
- 1 つのアプリケーションを実行すると、6 つのスレッドが作成されます。合計 CPU 使用率は 50% です。
- 2 つのアプリケーションを実行すると、どちらも 6 つのスレッドを作成します。合計 CPU 使用率は 100% ですが、マシンの応答性は良好です。
- 3 つのアプリケーションを実行すると、すべてのアプリケーションで 6 つのスレッドが作成されます (合計で既に 18 スレッド)。合計 CPU 使用率は 100% です。
- 4 つのアプリケーションを実行すると、合計 24 のスレッドが既に存在します。
Process Explorer を使用して実行中のアプリケーションを調査したところ、4 つのアプリケーションですべて 6 つ (場合によっては 12) のスレッドがあり、すべてができるだけ多くの CPU を消費しようとしていることが明確にわかりました。
PPL では、次のようにデフォルトのスケジューラを構成することで、スレッドの数を制限できます。
これにより、スレッドの数を静的に制限します (この場合は 2)。24 コアのサーバーに 10 人の同時ユーザーがいることが事前にわかっていれば便利ですが (したがって、すべてのアプリケーションを 2 スレッドに制限できます)、10 人のユーザーのうちの 1 人が遅くまで作業している場合でも、彼は 2 つのスレッドしか使用しません。マシンの残りの部分がアイドリングしている間。
私の質問: PPL を構成して、マシンの負荷に基づいて作成する (または維持するかアクティブにする) スレッドの数を動的に決定する方法はありますか? または、PPL は既にデフォルトでこれを行っており、私の観察は正しくありません。
編集:テストアプリケーションのインスタンスをさらに開始しようとしましたが、マシンは非常に応答性が高いままですが(元の質問では間違っていました)、アプリケーションが同時アクションの数を減らしているのを確認できません。
visual-c++ - PPLを使ってwhileループを並列化する方法
PPL を使用して "while" ループを並列化する必要があります。MS VS 2013 の Visual C++ に次のコードがあります。
このコードは、外側のループで std::vector を介して並列反復を行います。並列処理は、concurrency::parallel_for() アルゴリズムによって提供されます。ただし、このコードには、ファイルからの読み取りを実行する「while」ループもネストされています。このネストされた「while」ループを並列化する必要があります。この入れ子になった "while" ループを PPL で並列化するにはどうすればよいでしょうか。助けてください。