在OMP中使用不同的线程进行嵌套的循环

时间:2020-02-07 23:59:41

标签: openmp

在开始之前,我应该提到原始代码中的循环未完全嵌套,因此我无法使用“ collapse”原语。

我正在尝试在以下代码中同时对外部和内部“ for”循环进行线程化。下面的示例工作正常,但是有问题!内部循环使用与外部循环相同的线程ID,这会导致性能下降。我的计算机有20个线程,我希望在内部循环中使用那些空闲的线程。到目前为止,我还没有找到解决方案。有什么建议吗?

示例代码的输出如下:

iter(0,0),tid外循环:0,tid外循环:0

iter(0,1),tid外循环:0,tid外循环:0

iter(0,6),tid外循环:0,tid外循环:0

iter(1,0),tid外循环:1,tid外循环:0

iter(1,1),tid外循环:1,tid外循环:0

iter(1,6),tid外循环:1,tid外循环:0

iter(1,4),tid外循环:1,tid外循环:2

iter(1、5),tid外循环:1,tid外循环:2

iter(1、2),tid外循环:1,tid外循环:1

iter(1、3),tid外循环:1,tid外循环:1

iter(0,4),tid外循环:0,tid外循环:2

iter(0,5),tid外循环:0,tid外循环:2

iter(0,2),tid外循环:0,tid内循环:1

iter(0,3),tid外循环:0,tid内循环:1

iter(2,0),tid外循环:2,tid内循环:0

iter(3,4),tid外循环:0,tid内循环:2

iter(2,1),tid外循环:2,tid外循环:0

iter(3,5),tid外循环:0,tid内循环:2

iter(4,2),tid外循环:1,tid外循环:1

iter(3,0),tid外循环:0,tid外循环:0

iter(3,2),tid外循环:0,tid外循环:1

iter(4,4),tid外循环:1,tid外循环:2

iter(2,6),tid外循环:2,tid外循环:0

iter(4,5),tid外循环:1,tid外循环:2

iter(2,2),tid外循环:2,tid外循环:1

iter(3,3),tid外循环:0,tid内循环:1

以此类推!

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

int main (void)
{
  int i,j,thid;
  omp_set_nested(1);

    #pragma omp parallel for default(none) num_threads(3) private(i,j,thid)  schedule(static,1) 
    for (i = 0; i < 8; i++){
        thid = omp_get_thread_num();
        #pragma omp parallel for num_threads(3) schedule(static,2)
        for (j = 0; j < 7; j++)
        printf("iter (%0d, %0d), tid outer loop: %0d, tid inner loop: %0d\n", i, j, thid, omp_get_ancestor_thread_num(omp_get_level()) );
    }


  return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码很好,但是您只能设置一次num_threads。如果您的计算机能够运行20个线程,请将num_threads设置为16

#pragma omp parallel for default(none) num_threads(16) private(i,j,thid)  schedule(static,1) 
for (i = 0; i < 8; i++){
    thid = omp_get_thread_num();
    //remove num_threads here
    #pragma omp parallel for schedule(static,2)
    for (j = 0; j < 7; j++)
    printf("iter (%0d, %0d), tid outer loop: %0d, tid inner loop: %0d\n", i, j, thid, omp_get_ancestor_thread_num(omp_get_level()) );
}
相关问题