c语言中的openmp并行递归函数

c语言中的openmp并行递归函数,c,recursion,openmp,permutation,C,Recursion,Openmp,Permutation,如何使用openMP并行化下面的递归?因为我的代码有一个问题,可以用这种方法解决。我从以下站点获得此代码: 代码: //C程序,用于打印允许重复的所有排列 #包括 #包括 /*函数在两个指针处交换值*/ 无效交换(字符*x,字符*y) { 焦炭温度; 温度=*x; *x=*y; *y=温度; } /*用于打印字符串排列的函数 此函数采用三个参数: 1.一串 2.字符串的起始索引 3.字符串的结束索引*/ 无效排列(字符*a,整数l,整数r) { int i; 如果(l==r) printf(“%

如何使用openMP并行化下面的递归?因为我的代码有一个问题,可以用这种方法解决。我从以下站点获得此代码:

代码:

//C程序,用于打印允许重复的所有排列
#包括
#包括
/*函数在两个指针处交换值*/
无效交换(字符*x,字符*y)
{
焦炭温度;
温度=*x;
*x=*y;
*y=温度;
}
/*用于打印字符串排列的函数
此函数采用三个参数:
1.一串
2.字符串的起始索引
3.字符串的结束索引*/
无效排列(字符*a,整数l,整数r)
{
int i;
如果(l==r)
printf(“%s\n”,a);
其他的
{

对于(i=l;i,我至少有两种方法可以考虑这样做。一种是在置换函数上并行化,另一种是在置换函数上并行化

这个答案使用了第二种方法。对于
n=strlen(str)
来说,排列的数量(也称为秩)是
n!
。例如,对于
str=“ABCD”
来说,秩的数量是
24
。这里有一种方法可以对秩进行排序(基于):


如果您根据一些openmp教程尝试并行化循环的方法,会发生什么意外?您尝试了哪些方法?它们以何种方式失败?您是否阅读了嵌套并行化的相关内容?我看到的教程中,没有以这种方式锁定循环,我尝试并行化置换函数,但是,它始终仅使用线程0进行重复没有在线程之间分割任务。我不得不说我是编程新手,不知道嵌套并行是如何工作的。请展示您如何“尝试并行化排列函数”并解释结果/行为是如何不令人满意的。尽量避免让人觉得只需要满足您需要的代码。我尝试了以下形式。我不知道使用openmp并行化此递归的策略。我不想要现成的代码,只需要并行化的策略,因为我无法将递归分为两部分agma omp parallel num_threads(2){permute()str,0,n-1);}请编辑您的问题以添加有用的信息。请选择。请阅读。
// C program to print all permutations with duplicates allowed
#include <stdio.h>
#include <string.h>

/* Function to swap values at two pointers */
void swap(char *x, char *y)
{
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

/* Function to print permutations of string
This function takes three parameters:
1. String
2. Starting index of the string
3. Ending index of the string. */
void permute(char *a, int l, int r)
{
   int i;
   if (l == r)
     printf("%s\n", a);
   else
   {
       for (i = l; i <= r; i++)
       {
          swap((a+l), (a+i));
          permute(a, l+1, r);
          swap((a+l), (a+i)); //backtrack
       }
   }
}

/* Driver program to test above functions */
int main()
{
    char str[] = "ABC";
    int n = strlen(str);
    permute(str, 0, n-1);
    return 0;
}
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define SWAP(a,b) do{t=(a);(a)=(b);(b)=t;}while(0)

void get_permutation(int rank, int n, char *vec) {
    int t, q, r;
    if (n < 1) return;
    q = rank / n;
    r = rank % n;
    SWAP(vec[r], vec[n-1]);
    get_permutation(q, n-1, vec);
}

int main(int argc, char *argv[]) {
  char a[5] = "ABCD", t[5];

  #pragma omp parallel for private(t) schedule(dynamic)
  for (int r = 0; r < 24; ++r) {
    strcpy(t, a);
    get_permutation(r, 4, t);
    #pragma omp critical
    printf("%3d: %s\n", r, t);
  }
}
  3: BCAD
  6: DABC
  7: CABD
  9: DACB
  8: BDCA
 10: BADC
 11: BACD
 13: CDAB
 14: DBAC
 15: CBAD
 16: DCBA
  1: DCAB
 17: ACDB
 19: ACBD
 20: DBCA
 21: ADCB
 22: ABDC
 23: ABCD
 12: CBDA
  0: BCDA
 18: ADBC
  4: CDBA
  2: BDAC
  5: CADB