c++ - 使用 Concurrency::parallel_for() 的边际性能增益

标签 c++ parallel-processing

在我的应用程序中,我有一个运行超过一千万个项目的 for 循环,如下所示:

int main(int argc, char* argv []) 
{
    unsigned int nNodes = 10000000;
    Node** nodeList = new Node* [nNodes];

    initialiseNodes(nodeList);  // nodes are initialised here

    for (unsigned int ii = 0l ii < nNodes; ++ii) 
        nodeList[ii]->update();

    showOutput(nodeList)       // show the output in some way
}

我不会详细说明节点是如何准确初始化或显示的。重要的是 Node::update() 方法是一个小方法,独立于其他节点。因此,并行执行此 for 循环将非常有利。由于是小事,这次想远离OpenCL/CUDA/OpenMP,所以改用了C++的Concurrency::parallel_for。那么代码看起来像这样:

#include <ppl.h>

int main(int argc, char* argv []) 
{
    unsigned int nNodes = 10000000;
    Node** nodeList = new Node* [nNodes];

    initialiseNodes(nodeList);  // nodes are initialised here

    Concurrency::parallel_for(unsigned int(0), nNodes, [&](unsigned int ii) {
            nodeList[ii]->update();
    });

    showOutput(nodeList)       // show the output in some way
}

我发现这确实会稍微加快程序的速度,但通常只提高 20% 左右。坦率地说,我期待更多。有人可以告诉我这是否是使用 parallel_for 时的典型加速因素?或者有没有办法从中获得更多 yield (无需切换到 GPU 实现)?

最佳答案

在一个问题上投入更多核心并不总是会带来改善。事实上,在最坏的情况下,它甚至会降低性能。从使用多核中获益取决于很多因素,例如所涉及的共享数据量。有些问题本质上是可并行化的,有些则不是。

关于c++ - 使用 Concurrency::parallel_for() 的边际性能增益,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607216/

相关文章:

java - 我应该使用两个可以互相杀死的线程吗?

c++ - 能否使用 OpenMP 并行化以下 C++ 代码以获得更好的性能?

c++ - 如何通过q​​t中的ODBC驱动程序连接到oracle 12c?

c++ - 如何在 C++ 中对文件系统进行非并发打印?

c++ - 如何使用这个单链表?

javascript - Android WebView : parallel Loading, 布局和 Javascript

java - 如何在Camel中使用**直接**端点实现并行处理?

c++ - 批量导入包含在 Eclipse for Opencv 中

c++ - Sublime3 构建系统在远程 linux 机器上编译 C++

c# - Task.Factory.StartNew "action"参数和更高级别的局部变量