除非另有禁止,否则 MP taskloop pragma 建议编译器应并行化指定的 for 循环。
任何具有不规则控制流和未知循环迭代增量的 for 循环均不能进行并行化。例如,包含 setjmp、longjmp、exit、abort、return、goto、labels 和 break 的 for 循环均不能并行化。
特别重要的是,具有迭代间依赖性的 for 循环可以进行显式并行化。这意味着,如果为此类循环指定了一个 MP taskloop pragma,除非 for 循环被取消资格,否则编译器将完全遵循该 pragma。用户有责任确保此类显式并行化不会导致错误结果。
如果为 for 循环指定了 serial_loop(或 serial_loop_nested)pragma 和 taskloop pragma,则将使用最后指定的 pragma。
请看以下示例:
#pragma MP serial_loop_nested for (i=0; i<100; i++) { # pragma MP taskloop for (j=0; j<1000; j++) { ... } } |
i 循环将不并行化,但是 j 循环可能并行化。