所以这是我的问题。我已经编写了一个串行和并行的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
答案 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()
)(这不是你的情况,但对于未来:)。)