首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于缓存优化的OpenMP组循环

用于缓存优化的OpenMP组循环
EN

Stack Overflow用户
提问于 2013-11-03 02:09:38
回答 2查看 1.9K关注 0票数 3

我努力调整一个程序来使用OpenMP。我有一组嵌套的for循环。最外层的for循环是一个y轴循环,它沿着图像向下移动.我想在循环中运行多个并行线程,但我在快速实现它时遇到了困难。

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

代码语言:javascript
复制
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行。做这件事最好的方法是什么?

当前代码:

代码语言:javascript
复制
...
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     
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-03 15:47:13

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

示例:

代码语言:javascript
复制
#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: %d\n", omp_get_thread_num(), i);
  }

}
票数 6
EN

Stack Overflow用户

发布于 2013-11-03 05:11:00

您可以简单地使用以下代码来实现这一点。

代码语言:javascript
复制
#pragma omp parallel for num_threads(8)
for(int y = 0; y < data_size_Y; y++) {
    ....
}

一般来说,我认为firstprivate的长列表是不必要的。根据具体使用这些变量的方式,大多数变量应该能够定义为shared

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19749137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档