комбинации r элементов в GPU с OPENMP в C ++ - PullRequest
0 голосов
/ 22 октября 2019

Я хочу распараллелить вложенные циклы с зависимостями:

for (int i=1;i<n; i++){
   for (int j=i+1; j<n; j++){
    for (int k=j+1; k<n; k++){  /
     //10 to 15 more for loops
      foo(i,j,k,......)
  }
 }
}

openmp не делает этого

то, с чем я сейчас работаю, это:

for (i=0; i<n; i++)
 for (j=0; j<n; j++)
  for (k=0; k<n; k++)
    ........ some 10 to 15 more for loops
    if ( i<j && j<k && .......)
    function_do_something(i,j,k,......)
  }
 }
}

Это работает, но не лучшая идея.

Я нашел этот код https://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/, который выглядит намного лучше, чем мой. В настоящее время я пытаюсь распараллелить этот код (я думаю, что мне нужно написать несколько прагм задач), может быть, его более эффективный код (?), Если кто-нибудь может мне помочь, это будет оценено.

// C++ Program to print all combination of  
// size r in an array of size n  
#include<omp.h>
#include <bits/stdc++.h> 
using namespace std; 
void combinationUtil(int arr[], int n, int r,  
                    int index, int data[], int i);  

// The main function that prints all 
// combinations of size r in arr[]  
// of size n. This function mainly  
// uses combinationUtil()  
void printCombination(int arr[], int n, int r)  
{  
    // A temporary array to store  
    // all combination one by one  
    int data[r];  

    // Print all combination using  
    // temprary array 'data[]'  
    combinationUtil(arr, n, r, 0, data, 0);  
}  

/* arr[] ---> Input Array  
n ---> Size of input array  
r ---> Size of a combination to be printed  
index ---> Current index in data[]  
data[] ---> Temporary array to store current combination  
i ---> index of current element in arr[] */
void combinationUtil(int arr[], int n, int r,  
                    int index, int data[], int i)  
{  
#pragma omp target data map(arr[0:7], data[0:r])
    // Current cobination is ready, print it  
    if (index == r)  
    {  

#pragma omp parallel for 
     for (int j = 0; j < r; j++)  
            cout << data[j] << " ";  
        cout << endl;  
 //       return;  
    }  

    // When no more elements are there to put in data[]  
    if (i >= n)  
        return;  

    // current is included, put next at next location  
    data[index] = arr[i];  
    combinationUtil(arr, n, r, index + 1, data, i + 1);  

    // current is excluded, replace it with next (Note that  
    // i+1 is passed, but index is not changed)  
    combinationUtil(arr, n, r, index, data, i+1);  
}  

// Driver code  
int main()  
{  
    int arr[] = {1, 2, 3, 4, 5};  
    int r = 3;  
    int n = sizeof(arr)/sizeof(arr[0]);  
    printCombination(arr, n, r);  
    return 0;  
}  

// This is code is contributed by rathbhupendra

код от https://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/

Пока я здесь

3 1 2 
3 1 2 
3 1 2 
4 1 2 
4 1 2 
5 1 2 
4 1 3 
4 1 3 
5 1 3 
5 1 4 
4 5 3 
4 5 3 
5 5 3 
5 5 4 
5 3 4
...