【发布时间】:2021-02-13 17:15:26
【问题描述】:
在我开始之前,让我说我只使用过一次线程,当时我们在大学里被教导过线程。因此,我使用它们的经验几乎为零,我不知道我想做的是否是个好主意。
我正在做我自己的一个项目,并且我正在尝试使 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)如果他们不这样做,我应该使用更多线程来拆分工作吗?它会让我的循环更快还是更慢?
【问题讨论】:
-
你是如何编译这个的,用什么编译器和什么标志?计算是否有意义地长,足以克服线程开销?结果如何合并?
-
@FrançoisAndrieux 如果这回答了您的第一个问题,我正在使用 Visual Studio。我不知道哪些计算被认为很长,但循环最初需要大约 60 毫秒才能完成。至于结果,我只是在整个过程之前和之后使用了一个断点。
-
您了解调试和发布构建以及编译器可以优化您的代码的程度吗?如果您在调试构建中测量了时间,那么测量几乎没有意义。切换到 Release 并重试。
-
您无法在调试器中可靠地测量执行时间。您需要在优化的构建中自己测量时间。
标签: c++ multithreading optimization parallel-processing