簡體   English   中英

在 C for OpenMP 中將嵌套 for 循環重寫為單個 for 循環,無冗余

[英]Rewriting nested for loop as a single for loop without redundancy in C for OpenMP

我正在嘗試制作一個 function,在 arrays 的列表中,將每個數組與它后面的每個數組進行比較:數組 0 將自己與 Arrays 1、2、3、4 等進行比較,數組 1 將自己進行比較到 Arrays 2、3、4 等等,但不是 0,因為我們已經比較過了。 rest 也是如此:數組 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循環比較?

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

您可以使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM