为什么线程代码比c ++中的顺序代码花费更多时间?

时间:2015-11-08 20:29:21

标签: c++ c++11

我用vector [1000]使用序列码和线程代码和时间性能计算得到矩阵[1000] [1000]?

//使用此命令运行程序: - // g ++ -fopenmp -std = c ++ 11 -O3 -o OMPmonti OMPmonti.cpp -lpthread

#include<iostream>
#include<fstream>
#include <ctime>

using namespace std;

#define SIZE 1000

int main()
{
std::clock_t    start;
    start = std::clock();

    int MATRIX[SIZE][SIZE]={0};
    int VECTOR[SIZE]={0};
    int RESULT[SIZE]={0};

    for(int i=0;i<SIZE;i++)
    {
        int x=i;
        for(int j=0;j<SIZE;j++)
        {
            MATRIX[i][j]=x;
            x=x+1;
        }
        VECTOR[i]=i;

    }

    for(int i=0;i<SIZE;i++)
        for(int j=0;j<SIZE;j++)
            RESULT[i]+=MATRIX[i][j]*VECTOR[j];

    ofstream output("result.txt");
        for(int i=0;i<SIZE;i++)
            output<<RESULT[i]<<"\n";
    output.close();

    std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;

    return 0;


}

线程代码是: -

//use this command to run the program:-
//g++ -fopenmp -std=c++11 -O3 -o OMPmonti OMPmonti.cpp -lpthread

#include<iostream>
#include<pthread.h>
#include<fstream>
#include <ctime>


using namespace std;

#define SIZE 1000

int NUM_THREADS;


int MATRIX[SIZE][SIZE]={0};
int VECTOR[SIZE]={0};
int RESULT[SIZE]={0};

struct BOUNDARIES{
    int START;
    int END;
};

void *MUL_ROUTINE(void *PARAM)
{
    BOUNDARIES *info= ( BOUNDARIES *) PARAM;
    for(int i=info->START;i<=info->END;i++)
        for(int j=0;j<SIZE;j++)
            RESULT[i]+=MATRIX[i][j]*VECTOR[j];

pthread_exit(NULL);
}

int main()
{
    std::clock_t    start;
    start = std::clock();

    for(int i=0;i<SIZE;i++)
    {
        int x=i;
        for(int j=0;j<SIZE;j++)
        {
            MATRIX[i][j]=x;
            x=x+1;
        }
        VECTOR[i]=i;

    }


    NUM_THREADS=4;

    pthread_t THREADS[NUM_THREADS];
    BOUNDARIES info[NUM_THREADS];

    int ret;

    for(int i=0;i<NUM_THREADS;i++)
    {
        if(i==0)
            info[i].START=0;
        else
            info[i].START=info[i-1].END+1;

        info[i].END=info[i].START+(SIZE/NUM_THREADS-1);
        if(i<(SIZE%NUM_THREADS))
            info[i].END++;

        ret=pthread_create(&THREADS[i],NULL,&MUL_ROUTINE,&info[i]);
        if(ret)
        {
            cout<<"Error Creating Thread "<<i<<endl;
            cout<<"Terminating The Program......"<<endl;
            return 0;
        }
    }

    for(int i=0;i<NUM_THREADS;i++)
        pthread_join(THREADS[i],0);

    ofstream output("result1.txt");
    for(int i=0;i<SIZE;i++)
        output<<RESULT[i]<<"\n";
    output.close();

    std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;


    return 0;
}

2 个答案:

答案 0 :(得分:0)

您还在测量线程创建的时间。让我们假设创建这4个线程需要1.9毫秒。之后,每个线程执行它的计算,并在每个线程完成0,625ms之后。

总结上面的例子:那些时间测量是不公平的!你不应该比较两个不相同的代码!

您可以尝试在创建线程的循环之后放置您的开始时钟。但是你可能会意识到这也是不公平的,因为第一个线程可能已经启动了。因此,在任何一种情况下,您都不会花费时间来执行计算。

看到好处,您应该使用更昂贵的计算,在单核案例中需要几秒钟。在那之后,创建这些线程所需的2ms是无关紧要的。

答案 1 :(得分:0)

来自clock(3)的手册页:

  

说明
  clock()函数返回由...使用的处理器时间的近似值          程序

您正在测量两个程序执行所需的CPU时间。由于在线程编程中始终存在与通信和同步相关的开销,因此CPU时间永远不会低于顺序程序的CPU时间。

但这大多无关紧要,因为真实时间较短 - 你只是没有测量​​它。要做到这一点,你可以

  1. #include <omp.h>并使用double omp_get_wtime()函数
  2. 将函数clock_gettimeCLOCK_REALTIME
  3. 中的<ctime>一起使用
  4. 使用#include <chrono>
  5. 中提供的任何时钟

    你必须知道你在测量什么才能得出结论。