加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

OpenMP For – 用于缓存优化的组循环

发布时间:2020-12-16 09:48:30 所属栏目:百科 来源:网络整理
导读:我正在努力调整程序以使用OpenMP.我有一组嵌套for循环.最外面的for循环是沿着图像向下的y轴循环.我想在循环中运行多个并行线程,但是我很难快速完成它. 目前,当我运行8个线程时,它运行如下: thread 0 - row 0,8,16...thread 1 - row 1,9,17...thread 2 - row
我正在努力调整程序以使用OpenMP.我有一组嵌套for循环.最外面的for循环是沿着图像向下的y轴循环.我想在循环中运行多个并行线程,但是我很难快速完成它.

目前,当我运行8个线程时,它运行如下:

thread 0 -> row 0,8,16...
thread 1 -> row 1,9,17...
thread 2 -> row 2,10,18...
thread 3 -> row 3,11,19...

我希望它以块运行,因此线程0执行前1/8行.做这个的最好方式是什么?

当前代码:

...
int y_percent = data_size_Y/8;
int thread = 0;

#pragma omp parallel for num_threads(8) firstprivate(vecs,bufferedOut,data_size_X,data_size_Y,kern_cent_X,kern_cent_Y,sum)
for(int y = y_percent*omp_get_thread_num(); y < (omp_get_thread_num()+1)*y_percent; y++){ // the y coordinate of theoutput location we're focusing on

解决方法

您可以在pragma语句上使用schedule子句来指定希望每个线程处理的块大小.在下面的示例中,我使用块大小指定静态调度方法,该块大小指定每个线程应该获得的连续迭代的数量.在这个简单的例子中,每个线程将获得每个8次迭代的块(例如,线程0将获得迭代0-7,线程1迭代8-15等).值得指出的是,如果您不关心块分布的排序(例如,如果您不关心线程0是否获得第一个块),则可以使用dynamic替换static. dynamic提供了在线程需要时为线程分配块的能力,而不是从一开始就将块预先分配给线程(当某些迭代比其他迭代需要更长的时间时,对于负载平衡非常有用).有关计划方法的更多信息,请查看以下内容:

> Wikipedia article – Scheduling Clauses
> LLNL docs – DO/for Directive

例:

#include <stdlib.h>
#include <stdio.h>
#include <omp.h>

int main() {
  int i;
  int iterations = 32;
  int num_threads = 4;

#pragma omp parallel for schedule(static,8) num_threads(num_threads)
  for(i=0; i<iterations; i++) {
    printf("thread %d: %dn",omp_get_thread_num(),i);
  }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读