问题标签 [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.

0 投票
2 回答
1937 浏览

c++ - PPL critical_section/parallel_for 在 Visual Studio 2010 下崩溃?

我制作了这个简单的测试程序,它有时会触发 Debug Break 或者它只是崩溃(在 Debug/Win32/VS2010SP1 下)——当然,有时它甚至可以工作。我做错了什么还是PPL(VS2010)中的某个地方有错误?

Debug Break 调用堆栈如下所示:

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 * szFormat=0x0argflist =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=0x0f45dx709 格式=7 * charlist) 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=0x0f45d401d, ...) 第 258 行字节 C++ msvcr100d.dll!Concurrency::details::LockQueueNode::Copy(Concurrency::details::LockQueueNode * pCopyFromNode=0x7d92f908) 第 728 行 + 0x27 字节 C++ msvcr100d.dll!Concurrency::critical_section::_Acquire_lock(void * _PLockingNode=0x7d92f908, bool _FHasExternalNode=true) 第 1019 行 C++ msvcr100d.dll!Concurrency::critical_section::scoped_lock:: :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) 第 1478 行 C++ msvcr100d.dll!Concurrency::details::FreeThreadProxy::Dispatch() 第 157 行 C++ msvcr100d.dll!Concurrency::details::ThreadProxy::ThreadProxyMain(void * lpParameter=0x2ed5b4f0) 第 162 行 C++ kernel32.dll!763c33aa()
[下面的帧可能不正确和/或丢失,没有为 kernel32.dll 加载符号]
ntdll.dll!771a9ef2()
ntdll.dll!771a9ec5()

我刚刚遇到的一次崩溃看起来好像没有锁住(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++

可锁定的.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) 第 1478 行 C++ msvcr100d.dll!Concurrency::details::FreeThreadProxy::Dispatch() 第 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 在生产环境中使用有问题吗?

感谢您的任何投入!

0 投票
1 回答
1096 浏览

c++ - 为什么类成员变量在 PPL 中不允许为 [ &A, &B ]

在编译VS之前说

错误成员“test::A”不是变量

错误成员“test::B”不是变量

代码:

错误:

'test::A': lambda 捕获变量必须来自封闭函数范围

'test::B': lambda 捕获变量必须来自封闭函数范围

我该怎么办?

0 投票
2 回答
707 浏览

windows-8 - when_any 是如何工作的?

我有一个std::vector< concurrency::task<void> >可能会或可能不会按顺序加载的任务列表。我接到了concurrency::when_any电话,但不知道如何使用它的足够信息。

我遇到了这个使用调用 (ScenarioInput1.xaml.cpp:100) 的 microsoft 示例,但我不了解 pair 参数,以及如何使其适应我的返回值。

编辑:我正在尝试做的事情:

如果我想做的事情没有经过深思熟虑或效率不高,请告诉我。

0 投票
1 回答
1640 浏览

c++ - 使用 PPL 不锁定关键部分的 C++ 并行循环

在下面的代码中,有使用 PPL 实现的 parallel_for 循环。主要问题在这里;当我被注释 cs.lock() 和 cs.unlock() 时,abc 向量值不正确。我正在使用 concurrency_vector 类型来随机访问数组值,但它似乎不起作用。锁定关键部分,它工作但很慢。此外,为了加快速度,我使用索引来存储值,而不是使用 2D-concurrency_vector。有什么问题,没有锁定关键部分,我错过了什么?

0 投票
3 回答
306 浏览

c# - 为什么这个 C++ 代码比 C# 变体慢

最近,我们有一个需求,其中有超过 100,000 个 xml 文件,并且所有这些文件都需要修改 xml 中的特定数据。简单的 perl 命令可以完成这项工作,但 perl 没有安装在文件所在的机器上。因此,我编写了一个小的 C# 代码来完成这项工作。

我决定实现 C++ 版本。事实证明,C++ 版本并没有明显快于 C# 版本。在两个版本中运行了几次。事实上,在某些运行期间它与 C# 版本一样快。

对于 C#,我使用 .NET 4.0,对于 C++,它是 VC10。

0 投票
2 回答
1080 浏览

c++ - concurrent_vector 在 parallel_for ( PPL ) 中不起作用

下面有一个示例工作代码(parallel_for 使用并行模式库( ppl ))。这里的主要问题是sqr < concurrent_vector > 存储的值在每次执行中都会发生变化,但它不应该如此!

我使用 < concurrent_vector > 进行随机访问,为什么它不起作用?

0 投票
2 回答
10503 浏览

c++ - 并行任务使用 boost::thread 比使用 ppl 或 OpenMP 获得更好的性能

我有一个可以并行化的 C++ 程序。我正在使用 Visual Studio 2010,32 位编译。

简而言之,程序的结构如下

由于每个some_computations()都是独立的(读取了一些全局变量,但没有修改全局变量),我并行化了内部for循环。

我的第一次尝试是boost::thread

结果很好,但我决定尝试更多。

我尝试了OpenMP

结果比boost::thread's'差。

然后我尝试了ppl库并使用了parallel_for()

结果是最糟糕的。

我发现这种行为非常令人惊讶。由于 OpenMP 和 ppl 是为并行化而设计的,因此我预计会得到比boost::thread. 我错了吗?

为什么boost::thread给我更好的结果?

0 投票
2 回答
281 浏览

c++ - C ++中parallel_invoke的意外输出

我已经并行执行了 3 个任务:打印两个数字的最小值、最大值和平均值。第一个任务两次打印最小值,我希望它的输出是连续的。

我多次运行这个程序。所有输出,例如 5、3、1、1 或 3、1、1、5 都是可以理解的。但是,一些输出,例如 1, 5, 3, 1 并不明显。这意味着必须在连续块中打印两次“1”(最小值)的第一个任务被拆分。为什么?

0 投票
2 回答
2166 浏览

c++ - 在 VC++ PPL 中,如何创建一个同步返回的任务返回方法?

考虑以下 C# 代码:

编译器将其转换为一个任务返回调用,如果 m_f 为真,则任务立即完成,否则,它将异步操作“委托”给 DoSomethingInternalAsync()。

现在,我如何在 C++ 中做到这一点?代码应如下所示:

Edit1:在 C# 中,我可以使用 TaskCompletionSource<> 来做同样的事情,但不使用 async 关键字 - 本质上是创建一个已完成的任务。

0 投票
3 回答
1737 浏览

c++ - Microsoft VC++ PPL 和睡眠

以下程序根据使用的睡眠机制运行不同。

不同之处在于,sleep_for从我所看到的任务安排中,1 睡眠不会阻止其他人运行。

Sleep我看到的情况来看,他们阻止了进一步的任务运行。

我的问题是:
a)PPL 线程池如何巧妙地解决问题sleep_for(我认为这是一个告诉操作系统的系统调用(将此线程放在非活动线程列表中 x 秒)

b)我在这里看到的行为是否有sleep_for保证(也就是它是否定义了我不会得到与 with 相同的行为Sleep