问题标签 [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 投票
1 回答
317 浏览

visual-c++ - 延续链中是否需要共享指针?

我有一个使用 lambda 表达式的延续链,其中一个任务分配给一个变量,下一个任务从该变量中读取。Microsoft 建议使用 ashared_ptr来包装变量,即使变量是引用计数句柄 (^) 也是如此当 lambda 表达式按值捕获时,引用计数句柄不会增加其引用计数吗?那么为什么有必要用 包装一个引用计数句柄shared_ptr

0 投票
1 回答
267 浏览

visual-c++ - 并行模式库 (PPL) 中的 COM STA 模型?

我有 MFC 应用程序,它使用并行模式库来执行一些异步任务。其中一些使用 COM 对象,因此我需要在此类任务中初始化 COM 库。在所有这些情况下,我都使用 COM STA 模型初始化,因为主线程是 MFC 应用程序(MFC 应用程序线程只能是 STA)并且我不知道我的任务将在哪个线程上下文中被调用。

一些例子:

此代码在 Windows 7/XP 上运行正常。但是在带有 C++ 2012 Platform Toolset 任务 1 和 2 的 Windows 8.1 上无法正常工作,因为 CoInitializeEx() 返回 RPC_E_CHANGED_MODE 错误!任务 3 通常由 PPL 核心在主 MFC 线程上下文中调用,该线程上下文是 OLE,并且他的 COM 已经初始化为 COINIT_APARTMENTTHREADED,因此 CoInitializeEx() 返回成功 S_FALSE 代码(双重初始化)。

对于任务 2 和 3,PPL 核心创建单独的线程,这些线程在 Windows 7/XP 上未预初始化为 COM,因此任务第一行成功初始化 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 使用错误?

0 投票
1 回答
2902 浏览

c++ - Rxcpp 中的调度程序

我试图找出Rx的 C++版本中的调度模型。

了解 C# 版本,其中有一个带有一个 Schedule 方法的简单接口;C++ 版本似乎相当复杂,包含调度程序、工作程序和协调等内容。

对我来说,一个主要的缺失部分是线程池调度程序的实现,它是否存在其他名称?我将如何实现它自己?我应该把它写在PPL (Windows) 之上吗?如果我需要在它上面有一个序列化的(Actor like)观察者,我应该使用什么?在这里这里偷看可以表明这不是一项微不足道的任务。

这确实有助于获得有关该主题的某种概述,因为官方文档是自动生成的并且仍然非常稀疏。

0 投票
1 回答
454 浏览

multithreading - 设置 PPL 线程组的优先级

我有一个场景,其中一些功能需要尽快完成,并以牺牲其他任务为代价获得计算资源(即它们是高优先级的)。具体来说,图形渲染以及为渲染而生成的任何任务都应尽可能快地运行,但不要消耗全部 CPU 容量。同时,我想用其他对时间要求不高的工作来填充 CPU 的空周期,并确保不要从渲染任务中窃取周期。

基本思想相当简单,但我无法弄清楚如何通过 PPL 做我想做的事。我已经找到了如何将默认调度程序设置为不同的优先级,但我不想全局更改优先级。相反,我希望有两个不同的调度策略,我可以随时添加任务。

理想的情况是,如果我可以创建两个具有不同优先级的 task_group 实例,并根据需要将任务添加到相关组,但我不知道该怎么做。我链接了我找到的最相关的文档,它可以满足我的需求,但使用代理的方式让我不确定如何执行仅添加任务的简单操作。如果我可以使用 PPL 中的基本设施,我也宁愿不增加代理和消息传递的复杂性。

https://msdn.microsoft.com/en-us/library/dd984038.aspx

同样重要的是,我可以确保从线程产生的任何子任务都继承父线程的优先级。具体来说,我从高优先级和低优先级任务中调用 parallel_for,并且 parallel_for 块应该保持相同的优先级。

0 投票
0 回答
399 浏览

c++ - 使用 PPL 即弃即用?

我希望开始在我的应用程序中使用 PPL。(我目前正在使用 std::async)

然而,我有两个(丑陋的)案例,我必须调用不返回任何结果的长时间运行的函数。(存储到数据库和网络调用)。我不会等待它们在我的主循环结束时完成(因为它们非常慢),而只是继续下一次迭代。我通过为这些函数调用生成线程并分离线程来做到这一点。我相信这被称为“即发即弃”。

有没有办法用 PPL 做到一劳永逸?我想避免创建自己的线程,并使用 void PPL 任务。PPL 任务是否在析构函数中阻塞?

0 投票
1 回答
816 浏览

c++ - PPL when_all with tasks of different types?

I'd like to use PPL "when_all" on tasks with different types. And add a "then" call to that task.

But when_all returns task that takes a vector, so all elements have to be the same type. So how do I do this?

This is what I have come up with but it feels like a bit of a hack:

Anyone got a better idea?

(parallel_invoke blocks so I dont want to use that)

0 投票
2 回答
188 浏览

c++ - PPL Combinable 的 SIMD 对齐问题

我正在尝试将数组的元素与 SIMD 并行求和。为了避免锁定,我使用了可组合线程本地,它并不总是在 16 个字节上对齐,因为 _mm_add_epi32 正在抛出异常

这是 ppl.h 中可组合的定义

有时对齐没问题,代码工作正常,但大多数时候它不起作用

我尝试使用以下内容,但这无法编译

任何纠正对齐问题的建议,仍然使用可组合。

在 x64 上,由于默认的 16 字节对齐,它可以正常工作。在 x86 上,有时存在对齐问题。

0 投票
1 回答
183 浏览

c++ - 中断parallel_for_each 的子任务

我有一个很大的项目向量,这些项目是根据它们的一个字段排序的,例如成本属性,我想对这些项目中的每一个进行一些处理,以找到不同属性的最大值......约束如果该物品的成本超过某个任意价格,我们不能使用该物品来计算最大值。

单线程 for 循环如下所示:

我已经能够在某种程度上将其转换为parallel_for_each。(免责声明:我是 PPL 的新手。)

parallel_for 中的 return 语句感觉效率低下,因为它仍然在每个项目上执行,在这种情况下,parallel_for 很可能最终会迭代成本太高的向量的多个部分。

如何利用向量已经按成本排序的事实?

我研究过使用取消令牌,但这种方法似乎不正确,因为它会导致 parallel_for 的所有子任务被取消,这意味着我可能会得到错误的最大值。

是否有类似取消令牌的东西可以取消parallel_for 的特定子任务,或者在这种情况下是否有比parallel_for 更好的工具?

0 投票
1 回答
470 浏览

c++ - 在parallel_for/parallel_for_each 内部还是外部的类对象?

我一直在研究并行循环(C++11)并使用 MS Visual Studio 2013 对其进行测试。我很清楚它们(尤其是 lambdas)非常酷。

但我担心的是我必须调用一个执行简单欧几里得距离测量的函数。函数本身很清楚,但我必须将函数移动到一个名为EuclideanDistance的类,并在函数Match(vectorA,vectorB)内对两个向量进行欧几里德数学运算 ,这只是一些 norm(...) 计算。并返回一个浮点值。

现在我该如何在 parallel_for/parallel_foreach 循环中处理这个问题?我是在循环内创建类对象还是将类对象保留在循环外会导致不一致?如果我对并行循环的理解正确,那么它工作的函数基本上是每个启动线程的干净副本。在类函数的情况下会发生这种情况吗?我的预感是没有!除非我在类中创建一个对象,如第二个代码片段所示。

例如,为了便于阅读,我将代码保持缩写。

或者这将是正确的做法?

整个类只不过是一个函数。

任何陷阱将不胜感激!

0 投票
2 回答
1635 浏览

c++ - 将参数传递给 ppl 中的任务

我刚刚开始在 Visual Studio 中学习 ppl,并开始学习任务。到目前为止一切顺利,例如我确实了解基础知识。但是如何创建接收参数的任务?也就是说,创建不带参数的任务相当简单,但带任何参数的任务对我来说根本不明显。
任务不带任何参数的任务创建很容易:

不能真正传递任何参数给它。我该怎么办。如果我尝试将参数传递给 lambda,则会出现编译错误。