c++ - 通过将其拆分为线程来加快 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)如果他们不这样做,我应该使用更多线程来拆分工作吗?它会让我的循环更快或更慢吗?
解决方案
(1)。@François Andrieux 提出的问题很好。因为在原始代码中有一个结构良好的 for 循环,并且如果您使用 -O3 优化,编译器可能能够向量化计算。这种矢量化将为您提供加速。
此外,这取决于计算中的关键路径是什么。根据阿姆达尔定律,可能的加速受到不可并行路径的限制。您可能会检查计算是否到达您有锁的某个变量,然后时间也可能花在锁定上。
(2)。要找出您计算机上的内核和线程总数,您可能有lscpu
命令,它将显示您计算机/服务器上的内核和线程信息
(3)。不一定是线程越多性能越好
推荐阅读
- python-3.x - 如何等到在 python3 中按下热键而不需要打开终端窗口?
- php - 当我在我的 codeigniter 中使用 count 函数时,它给了我错误
- c# - 从 DataGrid 和数据库 C# 中删除选定的行
- java - java 正则表达式 matcher.replaceAll 与组
- java - 从 Processing3.4 插入 HTML (java)
- azure - 如何测试 Azure 市场报价?
- c - C: 将 DNA 序列压缩成二进制
- java - itext-paulo jar 错误(新)版本正在从 maven 下载
- python - 无法使用 Appium / Python 通过 XPATH 找到元素
- java - 使用jserialcomm无法在java中找到串口