インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
必要に応じて、%s オプションを追加してコンパイラーによる型ベースの一義化解析を向上できます (オプションはコンパイル全体に適用されます)。 これにより、行 %d のループが最適化されます。
指定されたファイルに [Q]ansi-alias オプションを使用します。 このオプションは、コンパイラーが指定された行のループを最適化するのを助けます。 ファイル全体が ANSI 規則に従っていることを確認する必要があります。 gcc のデフォルトではデフォルトの O2 設定で ANSI 規則が仮定されますが、インテル® コンパイラーでは仮定されません。 このオプションは特に C++ プログラムで役立ち、ポインターとその他のデータ型間の型ベースの一義化を有効にし、その結果、ベクトル化や並列化などの最適化が有効になります。
[Q]ansi-alias オプションは、ANSI エイリアシング規則の最適化を有効にし、プログラムがこれらの規則に準拠するようにします。
ANSI エイリアシング規則については、次のドキュメントで説明されています。
C: ISO/IEC 9899 第 6.5 章 7 項
C++: ISO/IEC 14882 第 3.10 章 15 項
次の例について考えてみます。
#include <stddef.h>
template<typename T>
class blocked_range {
T my_begin;
T my_end;
public:
blocked_range();
T begin() const {return my_begin;}
T end() const {return my_end;}
};
class ApplyMatAdd {
double *const A, *const B, *const C;
const size_t size;
public:
ApplyMatAdd(double *A_, double *B_, double *C_, size_t size_) : A(A_), B(B_), C(C_), size(size_) {}
void operator()( const blocked_range<size_t>& range ) const;
};
void ApplyMatAdd::operator()( const blocked_range<size_t>& range ) const {
for (size_t i=range.begin(); i<range.end(); ++i) {
for (size_t j=0; j<size; ++j) {
C[i*size + j] = A[i*size + j] + B[i*size + j];
}
}
}
この例では、デフォルトの O2 設定でコンパイラーが最内ループをベクトル化できません。
安全であることが分かっている場合は、[Q]ansi-alias を使用してこの例をコンパイルすると、最内ループがベクトル化されます。
コンパイル全体でこのオプションのセマンティクスに沿っていることを確認してください。