コンピューティングにおいて、データ指向設計とは、CPUキャッシュの効率的な利用を目的としたプログラム最適化手法であり、ビデオゲーム開発でよく用いられます。[1]この手法では、データのレイアウトに重点を置き、フィールドを必要に応じて分離・ソートし、データの変換について考慮します。提唱者には、マイク・アクトン、[2] 、スコット・マイヤーズ、[3]、ジョナサン・ブロウなどがいます。
並列配列(または配列構造)は、データ指向設計の主な例です。これは、オブジェクト指向設計に典型的な 配列構造とは対照的です。
データ指向設計をプログラミングパラダイムとして定義することは、多くの人が他のパラダイムと並行して使用できると信じていることから議論の余地があるように見えるが、[4]データレイアウトに重点を置いているため、他のほとんどのパラダイムとは互換性がない。[1]
動機
これらの方法は、 IBM PowerPCベースのPlayStation 3 (PS3) やXbox 360コンソールを含む第 7 世代のビデオ ゲーム コンソールの2000 年代半ばから後半にかけて特に人気になりました。歴史的に、ゲーム コンソールは、最上位のデスクトップ コンピューターと比較すると、比較的弱い中央処理装置(CPU) を備えていることがよくあります。これは、グラフィックス処理装置(GPU) に、より多くの電力とトランジスタ バジェットを割り当てるための設計上の選択です。たとえば、第 7 世代 CPU は、最新のアウトオブオーダー実行プロセッサではなく、クロック速度が高くパイプラインが深いインオーダー プロセッサを使用して製造されました。また、ほとんどの種類のコンピューティング システムでは、メイン メモリが処理要素から数百クロック サイクル離れています。さらに、CPU が高速になり、メイン メモリ容量も大幅に増加したため、膨大なデータ消費が発生し、共有バスでのキャッシュ ミス(フォン ノイマン ボトルネック)の可能性が高まりました 。その結果、パフォーマンス制御には参照の局所性手法が用いられ、ボトルネックを解消するためにメモリアクセスパターンの改善が必要になりました。ソフトウェアの問題の一部はItaniumで発生した問題と似ており、事前のスケジューリングのためにループの展開が必要でした。
オブジェクト指向との対比
従来のオブジェクト指向プログラミング(OOP)設計原則はデータの局所性に乏しく、[5] [6]、実行時多態性(動的ディスパッチ)が用いられる場合(特に一部のプロセッサで問題となる)は特にその傾向が強いという主張がある。[7] [1] OOPは「データを中心にコードを整理する」ように見えるが、実際には個々のフィールドや配列を特定の関数によるアクセスのために効率的な形式で物理的にグループ化するのではなく、データ型を中心にソースコードを整理する。さらに、レイアウトの詳細が抽象化層の下に隠蔽されることが多いが、データ指向プログラマはレイアウトの詳細を何よりも優先して考慮したい。
参照
参考文献
- ^ abc Llopis, Noel (2009年12月4日). 「データ指向設計」.データ指向設計(あるいは、なぜOOPで自ら足を撃ってしまうのか) . 2020年4月17日閲覧。
- ^ 「CppCon 2014: Mike Acton「データ指向設計とC++」」。YouTube。2014年9月29日。
- ^ "code::dive conference 2014 - Scott Meyers: CPUキャッシュとその重要性". YouTube . 2015年1月5日.
- ^ Richard Fabian (2018年10月8日). 「データ指向設計」. www.dataorienteddesign.com . 2023年12月20日閲覧。
- ^ 「INTEL ® HPC 開発者カンファレンスで洞察力を高め、INTEL SIMD データ レイアウト テンプレート (INTEL SDLT) を使用してベクトル化の効率を向上」(PDF)。
- ^ Holger Homann; Francois Laenen (2018). 「SoAx: HPCコードにおける粒子処理のための汎用C++配列構造」. Computer Physics Communications . 224 : 325–332 . arXiv : 1710.03462 . Bibcode :2018CoPhC.224..325H. doi :10.1016/j.cpc.2017.11.015. S2CID 2878169.
- ^ 「オブジェクト指向設計の何が問題なのか?どこに害があるのか?」仮想関数呼び出しに関する問題(例:i-cache ミス)について説明します。