インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

使用ガイドライン: 関数呼び出しとコンテナー

関数呼び出し

関数呼び出しは、一般に使用されているプログラミング構造です。SDLT コンテナーを使用する際は、次の簡単なガイドラインに従ってください。

ループ変数をインライン展開されていない関数に渡す場合、現在の C++ アプリケーション・バイナリー・インターフェイス (ABI) では、メモリーレイアウトとオブジェクトのオリジナルのレイアウトが一致していなければならないため、余分なデータ変換が発生したり、ベクトル化が妨げられることがあります。そのため、SDLT アプローチは、すべてのメソッドまたは関数呼び出しがインライン展開されているか、#pragma omp declare simd を使用している場合、最適に動作します。関数を明示的または暗黙的に "inline" にすることは、ヒントでしかありません。コンパイラーの制限やヒューリスティックにより、関数がインライン展開されないことがあります。この問題を回避するには、コンパイラーの制限やヒューリスティックを無視するように指示する、#pragma forceinline recursive を使用することを推奨します。このプラグマを指定すると、以降のコードブロックのインライン展開可能なすべての関数と関数呼び出しがインライン展開されます。これにより、ループ本体や関数本体が大きくなり過ぎて、最適化できなくなることがあります。その場合は、関数の呼び出し範囲を検証および再構成し、インライン展開されない SIMD 対応関数呼び出しを適用することを検討してください。

1 次元コンテナーの概要

std::vector<typename> が、内部的には SIMD フレンドリーな形式でデータを格納し、プログラマーには AOS ビューを提供できるとしたらどうしますか?

SDLT の 1 次元コンテナーは、これを実現するためのものです。オブジェクトの配列のインメモリー・データ・レイアウトを次の形式に抽象化します。

1. AOS (構造体配列)

2. SOA (配列構造体) - SIMD フレンドリー

インポート/エクスポートのみ

メモリーレイアウトが抽象化され、オリジナルの構造体のレイアウトと一致しなくなる可能性があるため、コンテナーはデータへのメモリー参照を提供できません。コンテナーの特定の要素でオブジェクトのインポート/エクスポートのみを行うことができます。使用する際には、インポート/エクスポートのパラダイムに従うため、アルゴリズムのコードを多少変更する必要があるかもしれませんが、アルゴリズム自体は同じままです。

SDLT の 1D コンテナーは、std::vector<T> と同様のインターフェイスを利用して、動的にサイズ調整できます。誤って C++ ラムダ関数のコンテナーへコピーされるのを防ぐため、コンテナーのコピー・コンストラクターを削除し、代わりに 明示的な “clone” メソッドを提供しています。

コンテナーは、SIMD ループでの使用に関する、SDLT の accessor と const_accessor の概念を提供します。std::vector 互換のインターフェイスは、連携を容易にするためであり、ハイパフォーマンスのためではありません。

std::vector と同様に、コンテナーには配列データがあり、その範囲がデータの存続期間を制御します。

n 次元コンテナーの概要

多次元コンテナーは、1 次元コンテナーの概念を一般化したものです。抽象的な方法で、多次元アクセスのセマンティクスと格納ロジックを分けています。多次元の SDLT コンテナーは、任意の次元数に対応すると同時に、必要に応じて内部的にデータを表現できる汎用コンテナーです。1 次元コンテナーとは異なり、多次元コンテナーはサイズ変更不可で、std::vector のようなインターフェイスはありません。1 次元コンテナーは std::vectors から格納を分離したようなもので、多次元コンテナーは配列 (固定長または可変長) に似ています。

次に、データ項目 (プリミティブ) の型、メモリー上のデータレイアウト、コンテナーの形状でパラメーター化した n 次元コンテナーの例を示します。

n_container<PrimitiveT, LayoutT, ExtentsT>

テンプレート引数 説明
typename PrimitiveT
格納されるプリミティブの型。
typename LayoutT
データレイアウトの種類。
typename ExtentsT
コンテナーの次元。

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804