c - 如何在openmp嵌套for循环中实现break函数

标签 c openmp

我知道您无法在 OpenMP for 循环上设置中断,但您能否建议一种可以从嵌套 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  
                        }
                    }  
                }
            }
        }
    }

最佳答案

您的代码可以运行,但请注意以下几点:

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

关于c - 如何在openmp嵌套for循环中实现break函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59219825/

相关文章:

c - 为什么这段代码的行为不可预测?

c - ‘...’ token 之前的预期声明说明符或 ‘&’

c++ - 如何取消 CFtpConnection::PutFile?

c - 警告 : '0' flag ignored with precision and ‘%i’ gnu_printf format

c++ - 仅当存在数据竞争与锁定时才使用 OpenMP 临界区?

c - 与 C 偏移相关的 NASM

python - 从 Python 中使用 OpenMP 调用 C 函数会导致最后出现段错误

c++ - openmp:增加线程数会降低性能

c - OpenMP 并行 GSL 常微分方程计算

c++ - C/C++ 中的数据并行库