【问题标题】:Rewriting nested for loop as a single for loop without redundancy in C for OpenMP在 C for OpenMP 中将嵌套的 for 循环重写为没有冗余的单个 for 循环
【发布时间】:2020-05-27 20:05:53
【问题描述】:

我正在尝试创建一个函数,在数组列表中,将每个数组与其后面的每个数组进行比较:数组 0 将自身与数组 1、2、3、4 等进行比较,数组 1会将自身与数组 2、3、4 等进行比较,但不是 0,因为我们已经比较了它。其余部分也是如此:数组 2 将自己与 3、4 等进行比较。

通常这可以通过一个简单的嵌套 for 循环来完成:

for (int i = 0; i <= number_of_arrays - 1; i++){
    for (int j = i+1; j<= number_of_arrays; j++){
        printf("Comparing Array %d with Array %d", i, j);
    }
}

但是,由于我使用的是 OpenMP,我不能在另一个内部使用 #pragma omp for。 该解决方案通常也使用collapse(2),但我也不能使用,因为我的内部循环的计数器取决于我的外部循环的计数器。

为了不出现这个问题,我必须把它变成一个单一的for循环,一般的解决方案似乎是:

for (int i = 0; i <= (number_of_arrays - 1)*number_of_arrays; i++){
       printf("Comparing Array %d with Array %d", i/number_of_arrays, i%number_of_arrays);
   }
}

然而,这将导致我的代码冗余,例如,我会将数组 0 与数组 1 进行比较,然后将数组 1 与数组 0 进行比较。 我怎样才能将我拥有的东西变成一个不会进行冗余比较的 for 循环?

【问题讨论】:

    标签: c for-loop openmp


    【解决方案1】:
    for (int i = 0; i <= (number_of_arrays - 1)*number_of_arrays; i++)
    {
        if(i%number_of_arrays > i/number_of_arrays)
           printf("Comparing Array %d with Array %d\n", i/number_of_arrays, i%number_of_arrays);
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用continue 添加一个简单的if 条件。

      for (int i = 0; i <= (number_of_arrays - 1)*number_of_arrays; i++){
         if(i/numer_of_arrays >= i%number_of_arrays)
              continue; 
         printf("Comparing Array %d with Array %d", i/number_of_arrays, i%number_of_arrays);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多