Я хочу распараллелить вложенные циклы с зависимостями:
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