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

标签 c multithreading openmp

我正在努力调整一个程序以使用 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...

我希望它以 block 的形式运行,以便线程 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 子句来指定您希望每个线程处理的 block 大小。在下面的示例中,我使用 chunk 大小指定了 static 调度方法,该大小指定了每个线程应获得的连续迭代次数。在这个简单的示例中,每个线程将获得 8 次迭代的 block (例如,线程 0 将获得迭代 0-7,线程 1 将获得迭代 8-15,等等)。值得指出的是,如果您不关心 block 分布的顺序(例如,如果您不关心线程 0 是否获得第一个 block ),您可以将 static 替换为 动态dynamic 提供了根据需要将 block 分配给线程的能力,而不是从一开始就将 block 预先分配给线程(当某些迭代比其他迭代花费的时间更长时,这对于负载平衡很有用)。有关调度方法的更多信息,请查看以下内容:

示例:

#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);
  }

}

关于c - OpenMP For - 用于缓存优化的组循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749137/

相关文章:

c++11 - 将 OpenMP 与 C++11 基于范围的 for 循环结合使用?

c - 处理C中的字符串输入

c - 程序崩溃?

c - 根据宏定义,这个输出是什么

java - 同时读取数组线程安全吗?

c - 如何正确使用OpenMP?

使用并行编译器进行编译以便与 Ruby 一起使用?

c - 在 C 中,32 位机器和 64 位机器的 long 大小是多少?

c - 为什么 sigwait() 是 MT 安全的而 sigsuspend() 不是?

java - java中如何让线程等待并通知