如何在嵌套循环的openmp中实现break函数

时间:2019-12-06 20:19:40

标签: c openmp

我知道您不能在OpenMP for loop上设置中断,但是您可以建议一个从嵌套for循环中断的替代方法。 找到某些结果后,如何停止所有线程的工作?

代码附在此处

#pragma omp parallel default(none) private( dict_len, success)
    {
        #pragma omp for collapse(5)
        for(int i=0; i<dict_len; i++) {
            for(int j=0; j<dict_len; j++) {
                for(int k=0; k<dict_len; k++) {
                    for(int l=0; l<dict_len; l++) {
                        for(int m=0; m<dict_len; m++) {
                            unsigned char* result = X;

                            if (success == 1) {

                                    #pragma omp critical
                                    {
                                        printf("%s\n", result);
                                    }
                                     #pragma omp cancel for
                            }
                            free(result);
                            printf("unsuccessful!\n");
                            #pragma omp cancellation point for  
                        }
                    }  
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您的代码有效,但请注意以下几点:

  • dict_len必须等于所有OpenMP工作者。首选使用firstprivateshared而不是private来代替此变量。
  • 默认情况下,OpenMP不会激活以取消。您需要指定它,将OMP_CANCELLATION环境变量设置为true。