0
#include <iostream>
#include <time.h>
#include <pthread.h>
using namespace std;

void*genFunc2(void*val)
{
    int i,j,k;
    for(i=0;i<(1<<15);i++)
    {
        clock_t t1=clock();
        for(j=0;j<(1<<20);j++)
        {
            for(k=0;k<(1<<10);k++)
            {

            }
        }
        clock_t t2=clock();
        cout<<"t1:"<<t1<<" t2:"<<t2<<" t2-t1:"<<(t2-t1)/CLOCKS_PER_SEC<<endl;
    }
}

int main()
{
    cout<<"begin"<<endl;
    pthread_t ntid1;pthread_t ntid2;pthread_t ntid3;pthread_t ntid4;
    pthread_create(&ntid1,NULL,genFunc2,NULL);
    pthread_create(&ntid2,NULL,genFunc2,NULL);
    pthread_create(&ntid3,NULL,genFunc2,NULL);
    pthread_create(&ntid4,NULL,genFunc2,NULL);
    pthread_join(ntid1,NULL);pthread_join(ntid2,NULL);
    pthread_join(ntid3,NULL);pthread_join(ntid4,NULL);
    return 0;
}

我在上面展示了我的例子。当我只创建一个线程时,它可以在 2 秒内打印时间。但是,当我创建四个线程时,每个线程仅在 15 秒内打印其结果。为什么?

4

1 回答 1

2

这种算法可以很容易地使用 OpenMP 进行并行化,我建议您检查它以简化您的代码。

话虽如此,您使用该clock()函数来计算运行的执行时间。这不会显示您执行的挂钟,而是您的 CPU 忙于执行程序的时钟滴答数。这有点奇怪,因为它可能,例如,显示 4 秒而仅过去了 1 秒。这是 4 核机器上的完美逻辑:如果 4 核在您的线程中都 100% 忙碌,那么您使用了 4 秒的计算时间(以核心·秒为单位)。这是因为您除以CLOCKS_PER_SEC常数,这仅适用于单个核心。您的每个核心都在运行CLOCKS_PER_SEC,有效地解释了您的实验之间的大部分差异。

此外,您的代码需要考虑两个注意事项:

  • 您应该停用任何类型的优化(例如:gcc 上的 -O0),否则您的内部循环可能会根据编译器和其他情况(例如并行化)而被删除。
  • 如果您的计算机只有两个激活了超线程的真实内核(因此在您的操作系统中显示了 4 个内核),它可以解释您的运行与我之前的解释之间的剩余差异。

要以高分辨率解决您的问题,您应该使用此答案clock_gettime(CLOCK_MONOTONIC, &timer);中解释的功能。

于 2013-11-06T14:59:24.743 回答