C ++ ctime.h无法正确计算时间

时间:2014-01-15 14:42:04

标签: c++ linux time parallel-processing

所以这是我的问题。我已经编写了一个串行和并行的C ++矩阵乘法代码。我想计算每个人执行的时间。换句话说,输出应如下所示:

“串行乘法时间:####秒。”
“并行乘法时间:####秒。”

但我遇到的问题是在linux机器上运行此代码。它在Windows上完美运行,但我需要在linux中运行此代码。当我运行代码时,他的串行乘法时间给了我一个值,但是并行时间给了我更高的值,但它运行得更快。例如,我使用两个矩阵运行矩阵乘法,每个矩阵1000x1000。串行时间为9秒,并行时间为18秒,但计算完成所花费的时间只有一小部分。我等了一段时间才完成序列乘法,但是并行乘法马上完成,只是因为经过了一段时间的错误值。这是我的代码:

#include <iostream>
#include <omp.h>
#include <time.h>
#include <stdlib.h>
using namespace std;

int     RowA;
int     ColA;
int     RowB;
int     ColB;
clock_t     PTime = 0;
clock_t     STime = 0;

double**        MatA;
double**        MatB;
double**        MatC;

void        CreateMatrix();
void        PopulateMatrix();
void        S_MultiplyMatrix();
void        P_MultiplyMatrix();

int main()
{
    cout << "Enter Size of Matrix A: ";
    cin >> RowA >> ColA;
    cout << "Enter size of Matrix B: ";
    cin >> RowB >> ColB;

    if ( ColA == RowB )
    {
        CreateMatrix();
        PopulateMatrix();

        STime = clock();
        S_MultiplyMatrix();
        STime = clock() - STime;
        cout << "Serial Matrix Multiplication time: " << STime/CLOCKS_PER_SEC << "    seconds. " << endl;

        PTime = clock();
        P_MultiplyMatrix();
        PTime = clock() - PTime;
        cout << "Parallel Matrix Multiplication time: " << PTime/CLOCKS_PER_SEC << " seconds. " << endl;
    }
    else
    {
        cout << "Matrix Dimensions do not agree!!" << endl;
    }
    return 0;
}


void CreateMatrix()
{
    MatA = new double*[RowA];
    for ( int i=0; i<RowA; i++ )
    {
        MatA[i] = new double[ColA];
    }

    MatB = new double*[RowB];
    for ( int i=0; i<RowB; i++ )
    {
        MatB[i] = new double[ColB];
    }

    MatC = new double*[RowA];
    for ( int i=0; i<RowA; i++ )
    {
        MatC[i] = new double[ColB];
    }
}


void PopulateMatrix()
{
    for ( int i=0; i<RowA; i++ )
    {
        for ( int j=0; j<ColA; j++ )
        {
           MatA[i][j] = rand() & 10 + 1;   
        }
    }

    for ( int i=0; i<RowB; i++ )
    {
        for ( int j=0; j<ColB; j++ )
        {
            MatB[i][j] = rand() & 10 + 1;
        }
    }
}


void S_MultiplyMatrix()
{

    for ( int i=0; i<RowA; i++ )
    {
        for ( int j=0; j<ColB; j++ )
        {
            for ( int k=0; k<ColA; k++ )
            {  
                MatC[i][j] += MatA[i][k]*MatB[k][j];
            }
        }
    }

}


void P_MultiplyMatrix()
{
    #pragma omp parallel for //default(none) shared(MatA, MatB, MatC, RowA, ColB, ColA)
    for ( int i=0; i<RowA; i++ )
    {
        #pragma omp parallel for
        for ( int j=0; j<ColB; j++ )
        {
            double temp = 0;
            for ( int k=0; k<ColA; k++ )
            {
                temp += MatA[i][k]*MatB[k][j];
            }
            MatC[i][j] = temp;
        }
    }
}

请帮忙解决这个问题!我不知道为什么它不能正确计算Linux中的时间。就像我说的,我在windows中没有问题,但是我需要在linux中运行它,因为我有更大的矩阵计算需要在Linux集群上运行并准确记录时间!

谢谢!

JD

2 个答案:

答案 0 :(得分:4)

clock函数实际测量您在CPU上主动花费的时间,而不是墙上时间。它在您的情况下不是很有用,因为它测量所有线程的CPU时间,并且通常超过挂起时间。

如果您不需要高分辨率,可以使用time功能测量墙上时间,但具有一秒分辨率。如果您需要更精确的计时,可以查看this answer

答案 1 :(得分:1)

尝试使用带有单调时钟的clock_gettime()。 http://linux.die.net/man/3/clock_gettime

我一直在使用它与OpenMP,它工作正常。

clock()返回一个cpu时间,而不是墙上时间 - 例如: C++: Timing in Linux (using clock()) is out of sync (due to OpenMP?)

请记住,OpenMP提供了自己的时间测量功能,你应该在并行代码中使用它(比如omp_get_wtime())(这不是你的情况,但对于未来:)。)