【发布时间】:2016-07-02 17:05:12
【问题描述】:
我有以下测试程序,它有一个简单的函数,可以找到我试图在多个线程中运行的素数(仅作为示例)。
#include <cstdio>
#include <iostream>
#include <ctime>
#include <thread>
void primefinder(void)
{
int n = 300000;
int i, j;
int lastprime = 0;
for(i = 2; i <= n; i++) {
for(j = 2; j <= i; j++) {
if((i % j) == 0) {
if(i == j)
lastprime = i;
else {
break;
}
}
}
}
std::cout << "Prime: " << lastprime << std::endl;
}
int main(void)
{
std::clock_t start;
start = std::clock();
std::thread t1(primefinder);
t1.join();
std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;
start = std::clock();
std::thread t2(primefinder);
std::thread t3(primefinder);
t2.join();
t3.join();
std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;
return 0;
}
如图所示,我在 1 个线程中运行该函数一次,然后在 2 个不同的线程中运行一次。我使用-O3 和-pthread 用g++ 编译它。我在 Linux Mint 18 上运行它。我有一个 Core i5-4670。我知道它归结为操作系统,但我非常希望这些线程在某种程度上并行运行。当我运行程序时,top 在使用 1 个线程时显示 100% CPU,在使用 2 个线程时显示 200% CPU。尽管如此,第二次运行所需的时间几乎是原来的两倍。
CPU 在运行程序时什么也不做。为什么不并行执行?
编辑:我知道两个线程都在做同样的事情。我选择primerfinder函数只是作为一个令人尴尬的并行示例,所以当我在多个线程中运行它时,它应该需要同样长的实时时间。
【问题讨论】:
-
如果您希望操作系统同时在两个内核中运行线程,您将需要一些操作系统特定的 API 调用;最好是告诉操作系统在单独的内核上运行的调用。否则,操作系统将与系统中的所有线程、任务和可执行文件进行循环,您的线程可能不会并行运行(它们可能会被交换到操作系统方便的执行点)。
-
您可以尝试使用
cpu_set_t(在linux中)显式设置核心并提供较低的nice值。 -
我看不出多个线程如何相互补充。他们正在调用相同的确切功能。看来您只是多次执行相同的操作。也许您希望一个线程搜索素数 > 200000,而另一个线程搜索那些
-
一些可以防止线程加速的事情(与您的代码没有直接关系,只是想我会提到它们)是:1)错误共享 2)同步开销 3)调度开销 4)线程启动时间开销。特别是如果并行完成的工作不是很好。
-
@thomas 那是废话
标签: c++ multithreading c++11 parallel-processing