java openmp_OpenMP:在线程之间共享数组

今天是个好日子!

我正在进行分子动力学模拟,最近我开始尝试并行实现它 . 乍一看,一切看起来都很简单:在最耗时的循环之前编写#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 . 我的汇编文件分为两部分:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值