OpenMP* スレッド化組み込み関数の安全でない使用

omp_set_num_threads などの OpenMP* 組み込み関数が並列領域内で呼び出されています。

OpenMP* は、OpenMP* ランタイムシステムの動作を指定する各種の組み込み関数を提供します。そのような関数の 1 つに omp_set_num_threads があります。これは、並列構造の実行に利用可能なスレッド数を決定します。

一般に、並列領域に入る前にランタイムシステムのパラメーターを設定するのが最良の方法です。並列領域を実行するスレッドのチームが決定されるのは、並列領域に入る前であるため、その領域内の組み込み関数への呼び出しは、その領域のスレッド化には影響しません。これは、予期しない結果を引き起こします。

形式上、この使用法は有効です。ただし、組み込み関数呼び出しは後続の並列領域のスレッド化にのみ影響します。

ID

問題箇所

説明

1

OpenMP* の使用方法に関するエラー

OpenMP* 組み込み関数が呼び出された場所

#include <stdio.h>
#include <omp.h>

int main(int argc, char **argv)
{
    int i;

#pragma omp parallel for ordered
    for (i = 0; i < 6; i++) {
    
        // bad: call inside parallel region is not recommended
        omp_set_num_threads(3);
#pragma omp ordered
        printf("%d\n", i);
        
    }
    return 0;
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。