使用动态调度计算openmp for循环中的迭代次数

时间:2017-01-11 18:30:02

标签: c parallel-processing openmp

我正在运行带有动态负载平衡的openmp的for循环。我想打印每个线程在程序结束时处理的任务/迭代次数。 循环看起来像这样:

chunk=1;
#pragma omp parallel for schedule(dynamic,chunk) private(i)
for(i=0;i<n;i++){
//loop code
}

3 个答案:

答案 0 :(得分:3)

没有比这更容易了。只需将组合parallel for指令拆分为两个独立的结构,即可在循环之前和之后添加额外的代码:

#pragma omp parallel
{
   int iters = 0;
   #pragma omp for schedule(dynamic,chunk)
   for (int i = 0; i < n; i++) {
      ...
      iters++;
   }
   #pragma omp critical
   printf("Thread %d did %d iterations\n", omp_get_thread_num(), iters);
}

答案 1 :(得分:1)

如果你真的想要在你的并行区域或你做的其他代码之外打印程序末尾的迭代次数(并避免错误共享),那么简单的解决方案就是使用threadprivate

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

int iters;
#pragma omp threadprivate(iters)

int main(void) {
  omp_set_dynamic(0); //Explicitly turn off dynamic threads
  int i;
  int n = 10000;
  #pragma omp parallel for schedule(dynamic)
  for(i=0; i<n; i++) {
    iters++;
  }
  #pragma omp parallel
  #pragma omp critical
  printf("Thread %d did %d iterations\n", omp_get_thread_num(), iters);
}

这是一个复杂的解决方案,它还要求您更改代码的结构。

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

int main(void) {
  int i;
  int n = 100;
  int nthreads;
  int *aiters;
  #pragma omp parallel
  {
    nthreads = omp_get_num_threads();
    #pragma omp single
    aiters = malloc(sizeof *aiters * nthreads);
    int iters = 0;
    #pragma omp for schedule(dynamic)
    for(i=0; i<n; i++) {
      iters++;
    }
    aiters[omp_get_thread_num()]=iters;
  }
  for(i=0; i<nthreads; i++)
    printf("Thread %d did %d iterations\n", i, aiters[i]);
  free(aiters);
}

答案 2 :(得分:0)

为每个帖子使用私人个人计数器。没有别的办法了。

这样的东西
.zoombtn:active{
    background:{background_of_button}
}