OpenMP的学习初步

Parallel Programming Patterns

1.根据设计需求,找出可以并行设计程序的空间

A.找出并发的内容

a) 域分解

b) 任务分解

B.算法结构设计空间

设计出的算法具有:效率,简单,可移植,可测量

 

C.支持结构

a) 程序结构

SPMD – Same Program Multiple Data

loop parallelism

boss/worker

fork join

b) 数据结构

i. 共享数据

ii. 共享队列

iii. 分布数组

D.落实机器处理空间

2.改进设计

A.任务,数据,部分程序的顺序

B.线程,进程,时间清单

C.源代码的组织,共享数据

D.消息,同步机制,结果

并行任务分析

任务分解

 

Example

First.嵌套循环中,比如串行执行M*N个时钟

#define N 23

#define M 1000

for (k = 0; k < N; k++)

for (j = 0; j < M; j++)

w_new[k][j] = DoSomeWork(w[k][j], k, j);

 

Second.转换成一个for循环,串行依然是M*N个时钟

#define N 23

#define M 1000

for (kj = 0; kj < N*M; kj++) {

k = kj / M;

j = kj % M;

w_new[k][j] = DoSomeWork(w[k][j], k, j);

 

Third.用多线程并行,

#define N 23

#define M 1000

#pragma omp for private(k,j) schedule(static, 500)

动态调度让每一条线程执行通过块大小(chunk-size)(默认为1)指定数量的迭代。当线程执行完交给它的迭代,它就请求再次执行chunk-size次迭代,直到所有迭代结束。显而易见,最后一次迭代可能少于chunk-size次

for (kj = 0; kj < N*M; kj++) {//k,j都是每个线程私有的变量

 

k = kj / M;

j = kj % M;

w_new[k][j] = DoSomeWork(w[k][j], k, j);

}

 

#define N 23

#define M 5323

#define numThreads 16

 

. . .

 

int start = ((N*M)/numThreads) * myID;

int end = ((N*M)/numThreads) * (myID+1);

. . .

if (myID == (numThreads-1)) end = N*M;

 

. . .

 

for (kj = start; kj < end; kj++) { . . . }

 

#define N 23

#define M 1000

#define numThreads 4

 

. . .

 

for (kj = myID; kj < N*M; kj+=numThreads) {

k = kj / M;

j = kj % M;

w_new[k][j] = DoSomeWork(w[k][j], k, j);

 

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值