【发布时间】: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