今天是个好日子!
我正在进行分子动力学模拟,最近我开始尝试并行实现它 . 乍一看,一切看起来都很简单:在最耗时的循环之前编写#pragma omp parallel for directive . 但实际上,这些循环中的函数在数组上运行,或者,确切地说,属于我的类的对象的数组,该数组包含有关此系统的粒子系统和函数的所有信息,因此当我添加#时pragma指令在最耗时的循环之一之前,尽管我的2核4线程处理器已满载,但计算时间实际上增加了几倍 .
为了解决这个问题,我写了另一个更简单的程序 . 该测试程序执行两个相同的循环,一个并行,第二个循环 - 串行 . 测量执行这两个循环所花费的时间 . 结果让我感到惊讶:每当第一个循环并行计算时,其计算时间与串行模式(分别为1500和6000毫秒)相比有所下降,但第二个循环的计算时间急剧增加(15000对6000连续) .
我尝试使用private()和firstprivate()子句,但结果是一样的 . 不应该自动共享并行区域之前定义和初始化的每个变量吗?如果在另一个向量上执行,第二个循环的计算时间恢复正常:vec2,但是为每次迭代创建一个新向量显然不是一个选项 . 我也尝试将vec1的实际更新放到#pragma omp关键区域,但这也没有任何好处 . 没有帮助添加Shared(vec1)子句 .
如果你能指出我的错误并展示正确的方法,我将不胜感激 .
是否有必要将私有(i)放入代码中?
这是测试程序:
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
using namespace std;
#define N1 1000
#define N2 4000
#define dim 1000
int main(){
vectorres1,res2;
vectorvec1(dim),vec2(N1);
clock_t t, tt;
int k=0;
for( k = 0; k
vec1[k]=1;
}
t = clock();
#pragma omp parallel
{
double temp;
int i,j,k;
#pragma omp for private(i)
for( i = 0; i
for(j = 0; j
for( k = 0; k
temp+= j;
}
}
vec1[i]+=temp;
temp = 0;
}
}
tt = clock();
cout<
for(int k = 0; k
vec1[k]=1;
}
t = clock();
for(int g = 0; g
for(int h = 0; h
for(int y = 0; y
vec1[g]+=h;
}
}
}
tt = clock();
cout<
getchar();
}
感谢您的时间!
附:我使用visual studio 2012,我的处理器是Intel Core i3-2370M . 我的汇编文件分为两部分: