【问题标题】:C++ ctime.h will not correctly calculate timeC++ ctime.h 不会正确计算时间
【发布时间】:2014-01-15 14:42:03
【问题描述】:

所以这是我的问题。我已经编写了一个串行和并行的 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集群上运行,并且会准确记录时间!

谢谢!!

京东

【问题讨论】:

  • 对于初学者,您的 linux 编译器是否支持 OpenMP?
  • 18 秒的 CPU 时间并不一定意味着 18 秒的挂钟时间 - 特别是因为您正在测量并行化代码。
  • 是的,我的编译器支持 OpenMP。

标签: c++ linux time parallel-processing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    尝试将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())(这不是您的情况,而是用于未来 :))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2014-12-21
      相关资源
      最近更新 更多