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*}
}

do loopでこれを達成しようとしましたが、理解できませんでした。誰かが私のためにこれを変更できますか?

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;
        }
    }
}

単にあなたが最善だと思う数にそれを分割してください。

break手動スレッドを使用する(ただしingを許可する)より複雑な回答については、次の回答を参照してください: https ://stackoverflow.com/a/9813239/1180785

于 2013-03-17T22:43:21.727 に答える