1

这是我的主要猎人的一部分。我想在条件满足并且 b 设置为 false 之后尽快打破 omp 并行:

#pragma omp parallel for
for( long l = 1; l <= n; l++ ) {
if (m % p[l] == 0) {
b = false;
*// Break omp parallel for*}
}

我试图通过循环来实现这一点,但我无法弄清楚。请问有人可以帮我修改吗?

4

1 回答 1

1

我相信唯一的方法是添加一个失败变量,但它不会给你任何性能提升;

#pragma omp parallel for
for( long l = 1; l <= n; l++ ) {
    if (b) {
        if (m % p[l] == 0) {
            b = false;
        }
    }
}

如果它真的会那么长,最好将循环分成几段;

#pragma omp parallel for
for( long l = 1; l < n / 2; l++ ) {
    if (m % p[l] == 0) {
        b = false;
    }
}
if (b) {
    #pragma omp parallel for
    for( long l = n / 2; l <= n; l++ ) {
        if (m % p[l] == 0) {
            b = false;
        }
    }
}

只需将其拆分为您认为最好的数量即可。

对于使用手动线程(但允许breaking)的更复杂的答案,请参阅此答案:https ://stackoverflow.com/a/9813239/1180785

于 2013-03-17T22:43:21.727 回答