问题标签 [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':无法访问在类 'Concurrency::critical_section' 中声明的私有成员”
任何人都可以帮助解释为什么会这样?谢谢
visual-c++ - 将 PPL 与 operator new 覆盖一起使用
我有一个大型(百万行)VC++ 项目,并想开始在项目中使用 PPL(并行模式库)。该项目实现了自定义全局运算符 new 和 operator delete 功能。问题是 PPL(在调试版本中)使用自己的
void* operator new[](size_t cb, int nBlockUse, const char* szFileName, int nLine)
但是当它取消分配时,我的 operator delete(void*) 被调用,并且由于内存布局完全不同,这不起作用。
我的问题是是否有办法在调试版本中使用 PPL 而不会放弃我的全局 new 和 delete 运算符。拥有这些全局新和删除覆盖是有充分理由的,目前不能将它们从我的项目中删除。
c++ - WinRT c ++中的BitmapImage SetSourceAsync
我是 WinRT c++ 的新手。我正在尝试从 C# 传递 StorageFile 图像并打开文件并将其设置为 WinRT 中 BitmapImage 中的源以提取图像的高度和宽度。我正在使用以下代码。
此代码似乎不起作用。在 BitmapImage^ bmp = ref new BitmapImage(); 之后 调试器停止说没有找到源代码。你能帮我写出正确的代码吗?
c++ - C++线程池中的线程执行顺序
有谁知道 C++ 线程池实现,它既允许并行线程(如典型的线程池),又允许背靠背串行执行顺序。我花了几天时间试图通过修改以下线程池来完成这项工作,但我似乎无法让它工作。我研究了英特尔 TBB 使用的技术,并且我研究了可能使用微软 PPL 中的概念(它的异步代理库看起来很有希望)——两者都有面向任务的技术来实现上述目标——但是不幸的是,这些解决方案将不工作我的目标 PowerPC linux 嵌入式目标。
编辑我将一个 live coliru 演示与生成线程图的源放在一起 - 并且还展示了一个很好的 scheduler_loop 示例,理论上可以等待线程完成。该代码还显示了一个带有 2 个线程的 UtlThreadPool,我在其中将并发任务提供给它 - 但是“提供”并不完全正确,需要一些工作来遍历节点。
我用来制作执行图的数据结构如下所示。它使用PriorityNode 数据结构。这个结构本质上是一个PriorityNodes的链表,每一个都包含一个PriorityLevel的向量可以并发运行的任务和指向下一个 PriorityNode 的指针,该指针指示以后要串行运行的线程。一旦这些都完成了,如果 mNextNode 成员不是 nullptr,那么这应该安排在线程池中运行(依此类推,直到 mNextNode 为 nullptr。通过这个 PriorityNodes 链表排序是我想要的线程池以通过其线程进行排序。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) 正在创建太多线程
我正在使用Concurrency::parallel_for()
Visual Studio 2010 的并行模式库 (PPL) 来处理一组索引任务(通常,索引集远大于可以同时运行的线程数)。每个任务,在进行冗长的计算之前,首先从共享资源管理器请求一个私有的工作存储资源(以防:查看任务特定的内存映射文件,但我认为如果每个任务的故事情节是相同的从共享堆请求私有内存分配)。
共享资源管理器的使用与 a 同步,Concurrency::critical_section
这里问题开始了:如果第一个线程/任务在临界区并且第二个任务发出请求,它必须等到第一个任务的请求被处理。PPL 显然会想:嘿,这个线程正在等待,还有更多任务要做,因此创建了另一个线程,导致多达 870 个线程主要在同一个资源管理器处等待。
现在,由于处理资源请求只是整个任务的一小部分,我想告诉 PPL 在该部分保持其马匹,任何等待或协作块都不应该导致新线程从指定部分开始工作线程,我的问题是:我是否以及如何阻止特定线程部分创建新线程,即使它合作阻塞。我不介意在线程处理路径下方的其他块中创建新线程,但不会超过 2*(超)核心数。
到目前为止我考虑过的替代方案:
排队任务并从有限数量的线程处理队列。问题:我希望 PPL 的 parallel_for 能够自行完成。
定义一个
Concurrency::combinable<Resource> resourceSet
;Concurrency::parallel_for
和初始化一次resourceSet.local()
以减少资源请求的数量(通过重用资源)到线程的数量(应该小于任务的数量)。问题:此优化不会阻止多余的线程创建。parallel_for
为循环外的每个任务预先分配所需的资源。问题:这将请求过多的系统资源,而将资源量限制为线程/内核的数量是可以的(如果没有爆炸的话)。
我阅读了http://msdn.microsoft.com/en-us/library/ff601930.aspx的“不要在并行循环中重复阻塞”部分,但遵循此处的建议将导致根本没有并行线程。
c++ - 使用 PPL 或 TBB 并行聚合集合
我决定编写一个算法来利用并行聚合。这是我要转换的单线程代码。
我查看了 MSDN 页面http://msdn.microsoft.com/en-us/library/gg663540.aspx,其中涵盖了可组合的 parallel_for,以及http://msdn.microsoft.com/en-us/library/dd470426。 aspx#map_reduce_example显示了带有 parallel_reduce 的 parallel_transform,但它们是只有一个计数器的简单示例。
vector<vector<double>> sum
如上所述,我很难找到将与并行循环聚合的示例。
另外,我正在寻找有关是否使用parallel_for 和combinable 或parallel_transform 与parallel_reduce 的建议?上面的第一个链接指出:
当您需要在使用 PPL 的应用程序中应用并行聚合模式时,通常推荐使用 parallel_reduce 函数。它的声明性使其比其他方法更不容易出错,并且它在多核计算机上的性能可以与它们竞争。使用 parallel_reduce 实现并行聚合不需要在代码中添加锁。相反,所有同步都发生在内部。当然,如果parallel_reduce 不能满足您的需求,或者您更喜欢声明性较少的编码风格,您也可以使用可组合类与parallel_for 或parallel_for_each 来实现并行聚合。
您应该知道,parallel_for 和 parallel_for_each 会增加开销,因为它们支持取消和动态范围窃取等功能。此外,在并行循环内调用 combinable::local() 方法会为循环的每次迭代增加哈希表查找的成本。通常,当迭代执行复杂计算时,使用并行聚合来提高性能。
谢谢。
visual-studio-2013 - PPL 在创建线程时是否考虑系统负载?
我开始使用 PPL 创建任务并将它们 [可能] 分派给其他线程,如下所示:
我尝试了一个每秒创建一个任务的小应用程序。任务在 5 秒内执行繁重的计算,然后停止。
我想知道 PPL 在我的机器上创建了多少线程,以及机器的负载是否会影响线程数或分配给线程的任务。当我在 12 核机器上运行我的应用程序的一个或多个实例时,我注意到这一点:
- 运行 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 个用户中的一个工作到很晚,他仍然只使用 2 个线程,当机器的其余部分处于空闲状态时。
我的问题:有没有办法配置 PPL,以便它根据机器的负载动态决定创建多少线程(或保持活动或保持活动)?或者 PPL 默认情况下是否已经这样做了,我的观察结果不正确。
编辑:我尝试启动我的测试应用程序的更多实例,虽然我的机器仍然非常敏感(我在原来的问题中错了)我看不到应用程序减少了它们同时操作的数量。
visual-c++ - 如何使用 PPL 并行化“while”循环
我需要通过 PPL 并行化“while”循环。我在 MS VS 2013 的 Visual C++ 中有以下代码。
此代码通过外循环中的 std::vector 进行并行迭代。并行性由 concurrency::parallel_for() 算法提供。但是这段代码也有嵌套的“while”循环,执行从文件中读取。我需要并行化这个嵌套的“while”循环。这个嵌套的“while”循环如何通过 PPL 并行化。请帮忙。