首页 > 解决方案 > 通过将其拆分为线程来加快 for 循环

问题描述

在我开始之前,让我说,当我们在大学里学习线程时,我只使用过一次线程。因此,我使用它们的经验几乎为零,我不知道我想做的是否是个好主意。

我正在做自己的一个项目,我正在尝试使 for 循环快速运行,因为我需要实时应用程序的循环中的计算。在“优化”循环中的计算之后,我已经接近了所需的速度。但是,它仍然需要改进。

然后,我想起了穿线。我想如果我将它分成 4 部分,我可以让循环运行得更快,每个部分用于我机器的每个核心。所以这就是我试图做的:

void doYourThing(int size,int threadNumber,int numOfThreads) {
    int start = (threadNumber - 1) * size / numOfThreads;
    int end = threadNumber * size / numOfThreads;
    for (int i = start; i < end; i++) {
        //Calculations...
    }
}
int main(void) {
    int size = 100000;
    int numOfThreads = 4;

    int start = 0;
    int end = size / numOfThreads;
    std::thread coreB(doYourThing, size, 2, numOfThreads);
    std::thread coreC(doYourThing, size, 3, numOfThreads);
    std::thread coreD(doYourThing, size, 4, numOfThreads);

    for (int i = start; i < end; i++) {
        //Calculations...
    }
    coreB.join();
    coreC.join();
    coreD.join();
}

这样,计算时间从 60 毫秒变为 40 毫秒。

问题:

1)我的线程真的在不同的核心上运行吗?如果这是真的,我预计速度会更快。更具体地说,我认为它需要接近初始时间的 1/4。

2)如果他们不这样做,我应该使用更多线程来拆分工作吗?它会让我的循环更快或更慢吗?

标签: c++multithreadingoptimizationparallel-processing

解决方案


(1)。@François Andrieux 提出的问题很好。因为在原始代码中有一个结构良好的 for 循环,并且如果您使用 -O3 优化,编译器可能能够向量化计算。这种矢量化将为您提供加速。

此外,这取决于计算中的关键路径是什么。根据阿姆达尔定律,可能的加速受到不可并行路径的限制。您可能会检查计算是否到达您有锁的某个变量,然后时间也可能花在锁定上。

(2)。要找出您计算机上的内核和线程总数,您可能有lscpu命令,它将显示您计算机/服务器上的内核和线程信息

(3)。不一定是线程越多性能越好


推荐阅读