問題タブ [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.
c++ - Visual Studio 2010でクラッシュするPPLクリティカルセクション/パラレル?
私はこの単純なテストプログラムを作成しましたが、デバッグブレークがトリガーされたり、クラッシュしたりすることがあります(Debug / Win32 / VS2010SP1の下で)。もちろん、動作することもあります。私が間違っていることはありますか、それともPPL(VS2010)のどこかにバグがありますか?
DebugBreak呼び出しスタックは次のようになります。
msvcr100d.dll!_CrtDbgBreak()行85 C msvcr100d.dll!_VCrtDbgReportW(int nRptType = 2、const wchar_t * szFile = 0x0f45d230、int nLine = 728、const wchar_t * szModule = 0x00000000、const wchar_t * s = 0x7d92f7c4)行502 C msvcr100d.dll!_CrtDbgReportWV(int nRptType = 2、const wchar_t * szFile = 0x0f45d230、int nLine = 728、const wchar_t * szModule = 0x00000000、const wchar_t * szFormat = 0x0f 241+0x1dバイトC++msvcr100d.dll!_CrtDbgReportW(int nRptType = 2、const wchar_t * szFile = 0x0f45d230、int nLine = 728、const wchar_t * szModule = 0x00000000、const wchar_t * szFormat = 0x0f45d400、...バイトC++msvcr100d.dll!Concurrency :: details :: LockQueueNode :: Copy(Concurrency :: details ::LockQueueNode * pCopyFromNode = 0x7d92f908)728行目+0x27バイトC++ msvcr100d.dll! :scoped_lock(Concurrency ::critical_section&_Critical_section = locked)行1083 C ++ Lockable.exe!
anonymous namespace'::<lambda0>::operator()(int i=1418) Line 14 + 0x11 bytes C++ Lockable.exe!Concurrency::_Parallel_chunk_helper_invoke<int,unsigned int,
匿名名前空間'::、0> :: _ Invoke(const int&_First = 0、unsigned int&_Index = 1418、constanonymous-namespace'::<lambda0> & _Func={...}) Line 1445 C++ Lockable.exe!Concurrency::_Parallel_chunk_helper<int,unsigned int,
匿名名前空間'::、0> :: operator()()行1781+0x16バイトC++Lockable.exe!Concurrency :: task_handle、0 >>>(Concurrency :: task_handle、0 >> * _PChore = 0x7c13fba8 {_M_first = 0 _M_step = 1 _M_function = {...} ...})3495行目C ++ msvcr100d.dll!Concurrency :: details :: _ UnrealizedChore :: _ StructuredChoreWrapper(Concurrency :: details :: _ UnrealizedChore * pChore = 0x7c13fba8 {_M_first = 0 _M_step = 1 _M_function = {...} ...})99行目+0xcバイトC++ msvcr100d.dll!Concurrency :: details :: _ UnrealizedChore :: _ Invoke()3454行目+0xcバイトC++ msvcr100d.dll!Concurrency :: details :: WorkItem :: Invoke()75行目C ++ msvcr100d.dll!Concurrency :: details :: InternalContextBase :: ExecuteChoreInline(Concurrency :: details :: WorkItem * pWork = 0x7d92fe7c)1385行目C ++ msvcr100d.dll!Concurrency :: details: :InternalContextBase ::Dispatch(Concurrency :: DispatchState * pDispatchState = 0x7d92fe9c)Line 1478 C ++ msvcr100d.dll!Concurrency :: details :: FreeThreadProxy :: Dispatch()Line 157 C ++ msvcr100d.dll!Concurrency :: details :: ThreadProxy :: ThreadProxyMain(void * lpParameter = 0x2ed5b4f0)行162 C ++ kernel32.dll!763c33aa()
[以下のフレームが正しくないか、欠落している可能性があります。kernel32.dllのシンボルがロードされていません]
ntdll.dll!771a9ef2()
ntdll.dll!771a9ec5()
私がちょうど持っている1つのクラッシュは、ロックが保持されていないように見えます(cs:not_locked)
Lockable.exe!std :: vector> :: _ Orphan_range(int * _First = 0x0000c5db、int * _Last = 0x0000c5db)行1442+0x5バイトC++Lockable.exe!std :: vector> :: push_back(const int&_Val = 4177 )995行目C ++
Lockable.exe!
anonymous namespace'::<lambda0>::operator()(int i=4177) Line 16 C++ Lockable.exe!Concurrency::_Parallel_chunk_helper_invoke<int,unsigned int,
匿名名前空間'::、0> :: _ Invoke(const int&_First = 0、unsigned int&_Index = 4177、constanonymous-namespace'::<lambda0> & _Func={...}) Line 1445 C++ Lockable.exe!Concurrency::_Parallel_chunk_helper<int,unsigned int,
匿名名前空間'::、0> :: operator()()行1833+0x16バイトC++Lockable.exe!Concurrency :: task_handle、0 >>>(Concurrency :: task_handle、0 >> * _PChore = 0x7cbffc24 {_M_first = 0 _M_step = 1 _M_function = {...} ...})3495行目C ++ msvcr100d.dll!Concurrency :: details :: _ UnrealizedChore :: _ StructuredChoreWrapper(Concurrency :: details :: _ UnrealizedChore * pChore = 0x7cbffc24 {_M_first = 0 _M_step = 1 _M_function = {...} ...})99行目+0xcバイトC++ msvcr100d.dll!Concurrency :: details :: _ UnrealizedChore :: _ Invoke()3454行目+0xcバイトC++ msvcr100d.dll!Concurrency :: details :: WorkItem :: Invoke()75行目C ++ msvcr100d.dll!Concurrency :: details :: InternalContextBase :: ExecuteChoreInline(Concurrency :: details :: WorkItem * pWork = 0x7bc0fab4)1385行目C ++ msvcr100d.dll!Concurrency :: details: :InternalContextBase ::Dispatch(Concurrency :: DispatchState * pDispatchState = 0x7bc0fad4)Line 1478 C ++ msvcr100d.dll!Concurrency :: details :: FreeThreadProxy :: Dispatch()Line 157 C ++ msvcr100d.dll!Concurrency :: details :: ThreadProxy :: ThreadProxyMain(void * lpParameter = 0x2dcf6200)行162 C ++ kernel32.dll!763c33aa()
[以下のフレームが正しくないか、欠落している可能性があります。kernel32.dllのシンボルがロードされていません]
ntdll.dll!771a9ef2()
ntdll.dll!771a9ec5()
また、PPLの内部実装内でも、他のランダムアクセス違反が発生する可能性があります。これは再現できると思います。(うまくいけば)
Visual Studio 2012 Express for Desktopで同じプログラムを実行しましたが、多くのテストを実行した後、すべてが正常に機能しているようです。
VS2010でのPPLが実稼働環境で使用するにはバグがあるのではないかと思いますか?
入力ありがとうございます!
c++ - PPL でクラス メンバー変数を [ &A, &B ] にできないのはなぜですか?
VSをコンパイルする前に
エラー メンバ "test::A" は変数ではありません
エラー メンバ "test::B" は変数ではありません
コード:
エラー:
'test::A': ラムダ キャプチャ変数は、囲んでいる関数スコープからのものでなければなりません
'test::B': ラムダ キャプチャ変数は、囲んでいる関数スコープからのものでなければなりません
私は何をすべきか?
windows-8 - when_any はどのように機能しますか?
順番にstd::vector< concurrency::task<void> >
ロードされる場合とロードされない場合があるタスクのリストがあります。電話に出くわしましたconcurrency::when_any
が、その使用方法について十分な情報がありません。
呼び出し (ScenarioInput1.xaml.cpp:100) を使用するこの Microsoft サンプルに遭遇しましたが、pair パラメーターと、それを戻り値に適応させる方法がわかりません。
編集:私がやろうとしていること:
私がやろうとしていることがよく考えられていない、または効率的でない場合は、お知らせください。
c++ - PPL を使用してクリティカル セクションをロックしない C++ 並列ループ
以下のコードでは、PPL で実装された parallel_for ループがあります。主な問題はここにあります。cs.lock() と cs.unlock() にコメントしたとき、abc ベクトル値が正しくありません。ランダムにアクセスする配列値に concurrency_vector タイプを使用していますが、機能していないようです。クリティカル セクションをロックしています。動作はしていますが遅いです。また、速度を上げるために、2D-concurrency_vector を使用せずに、値を格納するためにインデックスを使用しました。重要なセクションをロックせずに、私が見逃した問題は何ですか?
c# - この C++ コードが C# バリアントと比較して遅い理由
最近、100,000 を超える xml ファイルがあり、そのすべてで xml 内の特定のデータを変更する必要があるという要件がありました。単純な perl コマンドでジョブを実行できますが、ファイルが配置されているマシンに perl がインストールされていませんでした。したがって、私は仕事をするために小さな C# コードを書きました。
C++版を実装することにしました。C++ バージョンは C# バージョンよりも大幅に高速ではないことが判明しました。両方のバージョンを数回実行しました。実際、一部の実行では C# バージョンと同じくらい高速です。
C# では .NET 4.0 を使用し、C++ では VC10 を使用しました。
c++ - concurrent_vector が parallel_for 内で機能しない ( PPL )
以下にサンプルの作業コードがあります ( parallel_for using Parallel Pattern Library ( ppl ) )。ここでの主な問題は、sqr < concurrent_vector > 格納された値が実行ごとに変化することですが、そうであってはなりません!
ランダム アクセスに < concurrent_vector > を使用しましたが、なぜ機能しないのですか?
c++ - ppl や OpenMP よりも boost::thread の方が並列タスクのパフォーマンスが向上する
並列化できる C++ プログラムがあります。Visual Studio 2010、32 ビット コンパイルを使用しています。
要するに、プログラムの構造は次のとおりです
それぞれsome_computations()
が独立しているため (一部のグローバル変数は読み取られますが、変更されたグローバル変数はありません)、内側のfor
ループを並列化しました。
私の最初の試みはboost::threadでした、
結果は良好でしたが、もっと試してみることにしました。
OpenMPライブラリを試してみた
boost::thread
結果は's のものより悪かった。
次に、pplライブラリを試して使用しましたparallel_for()
:
結果は最悪でした。
私は、この振る舞いが非常に驚くべきものであることに気付きました。OpenMP と ppl は並列化用に設計されているため、boost::thread
. 私が間違っている?
boost::thread
より良い結果が得られるのはなぜですか?
c++ - C++ での parallel_invoke からの予期しない出力
2 つの数値の最小値、最大値、平均値を出力する 3 つのタスクを並行して配置しました。最初のタスクは最小値を 2 回出力しますが、出力は連続していると思います。
このプログラムを数回実行しました。5、3、1、1 または 3、1、1、5 などのすべての出力は理解できます。ただし、1、5、3、1 などの一部の出力は明らかではありません。これは、連続するブロックで "1" (最小値) を 2 回出力する必要がある最初のタスクが分割されることを意味します。なんで?
c++ - VC++ PPL で、同期的に戻るタスクを返すメソッドを作成するにはどうすればよいですか?
次の C# コードを検討してください。
コンパイラがこれを変換するのは、タスクを返す呼び出しです。m_f が true の場合、タスクはすぐに完了し、そうでない場合は、非同期操作を DoSomethingInternalAsync() に "委譲" します。
では、これを C++ で行うにはどうすればよいでしょうか。コードは次のようになります。
Edit1: C# では、TaskCompletionSource<> を使用して同じことを行うことができますが、async キーワードを使用せずに、基本的に完了したタスクを作成します。
c++ - Microsoft VC++ PPL とスリープ
次のプログラムは、使用するスリープ メカニズムに応じて異なる方法で実行されます。
違いは、sleep_for
私が見るものとは、1つのスリープが他の実行を妨げないようにタスクがスケジュールされることです。
Sleep
私が見たところ、彼らはそれ以上のタスクの実行をブロックしています。
私の質問は次のとおりです:
a)PPLスレッドプールは、回避策を可能にする巧妙なトリックをどのように行うことができますかsleep_for
(OSに通知するシステムコールだと思いました(このスレッドを非アクティブスレッドのリストにx秒間入れます))
b)私がここで見ている動作はsleep_for
保証されていますか(別名、と同じ動作をしないと定義されていますSleep
)