Oracle Solaris Studio 12.2: C ユーザーガイド

並列化の適切性

MP taskloop プラグマは、for ループを並列化するように指示します。

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

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

1 つの for ループに対して 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 ループは並列化されます。