10.103 #pragma unroll_completely

このプラグマによって、ループを完全に展開することをコンパイラに指示します。ループの繰り返し回数をコンパイラが判別できる場合にのみ有効です。

ベクトル化されたループもベクトル化されていないループも、どちらも #pragma unroll_completely を使用して展開できます。すなわち、#pragma unroll_completely--no_vectorize--vectorize の両方に適用されます。

使用法

このプラグマは、-O3 -Otime でコンパイルする場合にのみ適用されます。-O3 -Otime を使用してコンパイルする場合、ループの展開が有効な場所では自動的にループが展開されます。このプラグマを使用すると、自動的には完全に展開されないループを完全に展開することをコンパイラに要求できます。

この #pragma プラグマは、コンパイラによって最適なループの展開が行われていないという確証が --diag_warning=optimizations などから得られる場合にのみ使用します。
このプラグマによって何らかの効果が得られたかどうかは、実際に --diag_warning=optimizations でコンパイルするか、生成されたアセンブリコードを検証したときに初めて判別できます。その両方が必要になる場合もあります。

制約条件

このプラグマは -O3 -Otime でコンパイルした場合にのみ効果があります。また、このプラグマは、自動的には展開されなかったループを展開するための、あくまでもコンパイラへの要求です。必ずしもループが展開されるとは限りません。
#pragma unroll_completely は、 for ループ、 while ループ、または do ... while ループの直前でのみ使用できます。
#pragma unroll_completely を外側のループで使用すると、ベクトル化を防止できます。逆に、内側のループで #pragma unroll_completely を使用するのが有効な場合もあります。
関連する概念
5.7 C コードのループの展開
関連する参考文書
10.102 #pragma unroll [(n)]
8.62 --diag_warning=tag[,tag,...]
8.139 -Onum
8.144 -Otime
8.192 --vectorize、--no_vectorize
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.