ケーススタディー: 計算集約型ループにおける構造体配列 (AOS) および配列構造体 (SOA) データレイアウトの比較

同カテゴリーの次の記事

コードの現代化を成功に導く 3 つのアドバイス

この記事は、インテル® デベロッパー・ゾーンに公開されている「Case study: Comparing Arrays of Structures and Structures of Arrays Data Layouts for a Compute-Intensive Loop」(https://software.intel.com/en-us/articles/a-case-study-comparing-aos-arrays-of-structures-and-soa-structures-of-arrays-data-layouts) の日本語参考訳です。


ケーススタディーの PDF: https://software.intel.com/sites/default/files/article/392271/aos-to-soa-optimizations-using-iterative-closest-point-mini-app.pdf
サンプルコード (ZIP 形式): https://software.intel.com/sites/default/files/article/392271/icpv10.zip

概要

最近、あるお客様が、インテル® Xeon® プロセッサー E5-2600 シリーズ (1 ソケットあたり 8 コア) の 16 コア、デュアルソケット計算ノードを増強するために、インテル® Xeon Phi™ コプロセッサーを購入されました。61 コアのインテル® Xeon Phi™ コプロセッサーは、単独の Linux* システムとしてネイティブ実行に使用したり、インテル® Xeon® プロセッサー (ホスト) によって制御されるオフロード実行に用いることができます。このケーススタディーでは、1 つの簡単なサンプルアプリケーションを使って、ホストバージョンのテスト、インテル® Xeon Phi™ コプロセッサーのネイティブ実行、および 3 次元のデータを含む 2 つの構造体配列 (AoS) を配列構造体 (SoA) に変更するネイティブバージョン (そして、ホストバージョン) の最適化を行います。また、「offload プラグマ」を追加して主要な O(N2) ループをオフロードすることで、オフロードバージョンでネイティブバージョンとほぼ同じパフォーマンスを達成します。さらに、2 つのメインループを 4 つのループに変換し、真ん中の 2 つのループ (最内でも最外でもない) を交換する、キャッシュ・ブロッキングによるループ変換も行います。そして、すべてのインテル® Xeon® プロセッサー・バージョンとインテル® Xeon Phi™ コプロセッサー・バージョンのパフォーマンスを比較し、最も遅い AoS 倍精度実行ファイルと最も速い SoA 単精度実行ファイルではパフォーマンスに 9 倍の差があることを示します。

はじめに

このお客様は、これらのシステムでさまざまなソフトウェア・パッケージを実行される予定です。一連のソフトウェア・パッケージは、現在 x86_64 クラスターで実行されています。インテルは、インテル® コンパイラー、インテル® マス・カーネル・ライブラリー (インテル® MKL)、インテル® MPI ライブラリー、および各種パフォーマンス解析ツールなど、ソフトウェア・テクノロジーの開発に取り組んでいます。これらを利用してソフトウェアを移植することで、インテル® Xeon Phi™ コプロセッサーの Linux* 上で独立した Linux* システムのようにソフトウェアをネイティブに実行したり、ホストから PCIe バスで接続されたインテル® Xeon Phi™ コプロセッサーへ計算処理をオフロードして実行することができます。この記事の執筆時点では、コードを大幅に変更することなく、多くの計算サーバーコード (つまり、クライアントベースの Windows* 向けユーザー操作ではないコード) を移植したり、その一部をインテル® Xeon Phi™ コプロセッサーへのオフロードに対応させることが可能です。ただし、コプロセッサーで効率良く高速に実行するには、ソフトウェアの「チューニングと最適化」を行う必要があります。インテル® Xeon® プロセッサーは、アウトオブオーダー (OOO) の「大きなコア」により x86_64、128 ビットのインテル® ストリーミング SIMD 拡張命令 (インテル® SSE)、128 ビットと 256 ビットのインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) コードを実行することができますが、インテル® Xeon Phi™ コプロセッサーは、インオーダーの x86_64 命令 (x87 命令を含む) と、新しい 512 ビットのインテル® イニシャル・メニー・コア命令 (インテル® IMCI) の浮動小数点ベクトル命令のみ実行できます。最小の労力で優れたパフォーマンスが得られるように、ソフトウェア開発者が移植と最適化作業を行う上で役立つ、決定木や詳細な手順を作成します。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください

関連記事