我用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;
}
答案 0 :(得分:0)
您还在测量线程创建的时间。让我们假设创建这4个线程需要1.9毫秒。之后,每个线程执行它的计算,并在每个线程完成0,625ms之后。
总结上面的例子:那些时间测量是不公平的!你不应该比较两个不相同的代码!
您可以尝试在创建线程的循环之后放置您的开始时钟。但是你可能会意识到这也是不公平的,因为第一个线程可能已经启动了。因此,在任何一种情况下,您都不会花费时间来执行计算。
看到好处,您应该使用更昂贵的计算,在单核案例中需要几秒钟。在那之后,创建这些线程所需的2ms是无关紧要的。
答案 1 :(得分:0)
来自clock(3)
的手册页:
说明
clock()函数返回由...使用的处理器时间的近似值 程序
您正在测量两个程序执行所需的CPU时间。由于在线程编程中始终存在与通信和同步相关的开销,因此CPU时间永远不会低于顺序程序的CPU时间。
但这大多无关紧要,因为真实时间较短 - 你只是没有测量它。要做到这一点,你可以
#include <omp.h>
并使用double omp_get_wtime()
函数clock_gettime
与CLOCK_REALTIME
<ctime>
一起使用
#include <chrono>
你必须知道你在测量什么才能得出结论。