Parallel processing 用于openmp上的循环

Parallel processing 用于openmp上的循环,parallel-processing,openmp,Parallel Processing,Openmp,当我不使用openMP时,下面的代码运行得更快。为什么会这样? 我在一台双核机器上运行它。 使用open mp运行所需的时间约为0.05秒,而在不使用openMP的情况下运行时仅需0.03秒 #include<omp.h> #include<iostream> #include<time.h> using namespace std; int main() { clock_t start=clock(); int i,j,t1,t2, n=1; float

当我不使用openMP时,下面的代码运行得更快。为什么会这样? 我在一台双核机器上运行它。 使用open mp运行所需的时间约为0.05秒,而在不使用openMP的情况下运行时仅需0.03秒

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

int main()
{
clock_t start=clock();
int i,j,t1,t2, n=1;
float a[1000][1000];
float b[1000][1000];



#pragma omp parallel 
{
#pragma omp for private(i)
for(j=0; j<1000; j++)
{
    for(i=0; i<1000; i++)


    {
            a[i][j]=(i*j*i*j)/(i+j+1)/(i*j*i+8*i+1);
            b[i][j]=(i*j*i*j)/(i+j+1)/(i*j*i+8*i+1);

    }
}
}
clock_t end=clock();
cout<<"Time to run is "<<(double)(end - start)/CLOCKS_PER_SEC<<endl;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
时钟启动=时钟();
int i,j,t1,t2,n=1;
浮动a[1000][1000];
浮动b[1000][1000];
#pragma-omp并行
{
#pragma omp用于私人(i)

对于(j=0;您的代码没有任何错误),但是您应该考虑问题的大小。1000×1000×4字节(浮点)=4MB。这通常是大多数现代系统的组合L2高速缓存的大小。静态情况下的并行化开销大约是一些CPU周期(100-99个周期)。。因此,通过并行程序实际实现的性能增量会因此开销而丢失。如果将问题更改为10000*100000,则问题是内存受限的,性能的变化非常明显。好的。感谢提供信息。此外,我还发现时钟()函数将给出进程所花费的总时间,包括每个线程所花费的时间。也许,这就是我最终错误地测量墙时间的原因。应该计算所有线程所消耗的时间,然后我们看看并行化有多好?假设您总共有“W”要做的工作量,当使用n个线程运行时,每个线程将执行W/n,总的来说,时间应减少系数(1/n)如果没有,那么我们检查算法。为了以后的引用,在循环结束后,在循环开始和结束之前把你的时间开始。C++数组中的内存布局是沿着列的。对于元素A[i] [j],下一个邻居是[i] [j+1]。所以你应该把外环改成“i”而不是“j”。非常感谢“厄运”。