C ユーザーズガイド

並列化の適切性

MP taskloop プラグマによって、ループを並列化するように指示されます。

不規則なフロー制御や、一定しない増分による繰り返しを持ったループに対しては、正当な並列化を実行できません。たとえば、setjmp、longjmp、exit、abort、return、goto、ラベル、break を含んだ for ループは並列化に適しません。

特に重要なこととして、繰り返し間の依存性を持った for ループでも、明示的に並列化できる点に注意してください。すなわち、このようなループに対して MP taskloop プラグマが指定されていると、for ループが並列化に適していないと判断されない限り、単にこの指示に従ってコンパイルを実行してしまいます。このような明示的な並列化を行なった場合は、不正確な結果が発生しないかを確認してください。

1 つのループに対して serial_loop または serial_loop_nestedtaskloop の両方のプラグマが指定されている場合には、最後の指定が優先的に使用されます。

以下の例を考えてみましょう。


      #pragma MP serial_loop_nested
          for (i=0; i<100; i++) {
         # pragma MP taskloop
           for (j=0; j<1000; j++) {
                   ...
          }
         }

この例では、i ループは並列化されませんが、j ループは並列化が可能です。