问题标签 [parallel-for]
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.
multithreading - 将 TBB parallel_for 应用于 40 核工作站时性能下降
我已经在 4 核(8 线程)笔记本电脑 i7-3920XM 上以这种方式实现了 TBB parallel_for。完成计算大约需要 15s,每个核心的 cpu 使用率约为 70%。如果我为该作业初始化固定数量的线程,例如 g_nthreads = 4,则需要 12 秒。没关系,我对默认方式很满意。
问题是如果我在 20 核(40 线程)工作站 Xeon E5-2680 上使用相同的代码,性能会迅速降级到 30 秒,其中 TBB 自动为作业初始化 40 个线程。在这种情况下,总体 CPU 使用率为 12%,其中只有一半显示为正在运行。当我再次将线程数固定为 4 时,需要 13 秒,但总体 CPU 使用率仍约为 12%。
看起来这项工作不一定需要在 20 核(40 线程)计算机上运行这么多线程,并且将工作划分为 40 个任务的开销决定了性能。
如何在 20 核(40 线程)计算机上为这项工作最大化 CPU 使用率并提高性能?Func()是一个需要大量计算的 EM 函数。
更新:
最后,我在 40 核计算机上实现了 100% CPU 的性能。
1,该程序将线程固定到通常不应该是正确方法的核心。最好让 TBB 自己决定打开内核。
2、强制程序使用tbbmalloc.dll和tbbmalloc_proxy.dll,可以在VS中设置:项目属性--C/C++--高级--强制包含文件-->“tbb/tbbmalloc_proxy.h”。这 2 个 DLL 用于 TBB 内存管理。
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() 方法会为循环的每次迭代增加哈希表查找的成本。通常,当迭代执行复杂计算时,使用并行聚合来提高性能。
谢谢。
multithreading - TParallel.For中的ASTride是什么意思?
TParallel.For()
有一个名为AStride
. 在我的例子中,ASTride 是 2:
我在这里无法理解“ASTride”的技术含义。是否AStride = 2
意味着第一个线程将处理范围内[1..10]
的两个连续数字,第二个线程将处理下一个连续数字等?
** 英语不是我的母语,我将“Stride”翻译为“long step”或“pace”。
matlab - Matlab中遗传算法的并行化
我在 Matlab 中编写了一个并行遗传算法,特别是双物种遗传算法 (DSGA)(更多信息可以在本文中找到),我在并行化部分代码时遇到了一些麻烦。
现在我是物理和数学专业的学生,我刚刚开始编程以帮助我的研究项目。我已经在 Matlab 中实现了一个带有某种并行适应度函数的串行遗传算法,但我对实现这个双物种遗传算法很感兴趣。
好的,问题是:我如何运行 2 个不同的 for 循环,这些循环在不同的 matlab 工作人员上做不同的事情?2 个 for 循环将有不同的数据和不同的代码,但我需要它们同时运行。我认为我不能为此使用 parfor 循环。在阅读了并行工具箱的文档后,看起来使用单程序多数据 (spmd) 功能可能是一种选择?我不确定它的最佳选择是否真的有效。
任何意见,将不胜感激。
谢谢。
c++ - Openmp:无法正确计算并行for循环内的作业状态
我正在尝试在并行 for 循环中实现任务状态报告功能。这种 for 循环的并行化是使用“OPENMP”执行的。
我希望像这样执行状态报告:
当然,我可以通过计算“开始时间”和“当前时间”之间的差异来计算“预计剩余时间”。但是,即使使用“静态”声明,我似乎也无法在 for 循环中准确计算“完成的工作”。
一些指导将不胜感激。
我的代码的输出:
从最后两行输出中可以看出,我无法正确计算作业状态。
这是我的代码:
注意:我故意使用“std::endl”而不是“\n”,因为以某种方式刷新输出缓冲区会干扰我的工作百分比计算。我确信如果我在并行执行实际计算时会出现类似的情况
更新: 根据“Avi Ginsburg”的回答,我正在尝试这样做:
问题(更新):问题是同一个线程被用于并发执行。因此,“已完成工作”报告受到严重限制。如何根据数据将作业分配给不同的核心。
这是我的代码的当前输出:
c++ - C++ OpenMP 与只读引用变量并行
我正在尝试与 GCC 4.4.7 版本并行运行代码。我使用了 OpenMP 库。我有一个由所有线程共享的只读变量(指向类的指针)。
代码编译执行没有任何错误,但是我在串行序列中运行相同的代码时没有得到相同的结果(串行模式下的结果为真)。代码如下所示:
我的第一个想法是问题出在两个引用变量c和toto上,但是这两个变量是在每个线程中创建的,因此它们对每个线程都是私有的。我尝试将c1用作threadprivate,但出现编译错误。如果c1被声明为共享,则输出结果没有变化。也许问题出在同时对 smae 变量的多次访问?我该如何解决这个问题?
c - OMP 用于并行线程 ID hello world
我正在尝试开始在 C 中使用基本的 OpenMP 功能。我对“omp parallel for”的基本理解使我相信以下内容应该在线程之间分配以下循环迭代,并且应该同时执行。我得到的输出如下。代码如下。我的 hello world 示例中是否缺少一些微妙的东西?
来自 omp 线程的 Hello World 0 来自 omp 线程的 Hello World 0 来自 omp 线程的 Hello World 0 来自 omp 线程的 Hello World 0 来自 omp 线程的 Hello World 0 来自 omp 线程 0 的 Hello World 等等。
julia - Julia 中的并行循环计数器
在 Julia 中,我想在并行 for 循环中打印出循环完成的迭代次数。
这是一种安全的方法吗,和/或有更好的方法吗?
c++ - 优化 parallel_for 实现
我有一些代码使用 Microsoft 的 PPL 来执行 parallel_for 循环,然后我不得不将其移至 Linux 和 Mac,这使我制作了自己的版本。它做了应该做的事情,并且性能不错,但它仍然比其他相同的 PPL parallel_for 循环慢 20%。
我也许应该提一下,通常会执行 10000 到 100000 次迭代,但每次迭代只是几个平方根和乘法。但是,它必须运行得非常快,因为它是用于交互式应用程序的。
对于 C++ 11 来说仍然是新的,所以如果有经验的人可以查看我的实现并就为什么它不是一直存在以及可以改进的地方提供一些反馈,我会很高兴。
完整的测试代码如下。
multithreading - Parallel-For 循环给出的求和结果与单个 for 循环不同。我错过了什么?
我们的一个程序中有一个不为人知的错误。我已经将它的至少一部分缩小到这个并行for循环。
i 是一个 int[],用于测试目的,填充整数 0 - 99999。runningTotal 是一个长整数。lockObject 是一个新的 Object();
Parallel-For 循环在完成时似乎总是返回总数 704,982,704;单线程循环返回 4,999,950,000。
所以显然是线程问题,但我只是没有看到错误。Parallel-For 循环是否正确实施?
相关代码如下: