Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

8.3.1 メモリー配置の最適化

メモリー共有型マルチプロセッサコンピュータには、複数のプロセッサが搭載されています。それぞれのプロセッサは、そのコンピュータのすべてのメモリーにアクセスできます。メモリー共有型マルチプロセッサには、プロセッサごとに特定のメモリー領域に対して、より高速なアクセスを可能にするメモリーアーキテクチャーを採用しているものがあります。このため、メモリーにアクセスするプロセッサの近くにメモリーを割り当てると、待機時間が減少し、アプリケーションのパフォーマンスが向上します。

Oracle Solaris オペレーティングシステムには、MPO 機能の一部である近傍性グループ (lgroup) の抽象化が導入されています。lgroup は、プロセッサやメモリーのようなデバイスのセットであり、セット内の各プロセッサは制限された待機時間間隔内にそのセット内の任意のメモリーにアクセスできます。ライブラリ liblgrp.so は、アプリケーションが監視と性能チューニングのために使用できるように、lgroup の抽象化をエクスポートします。アプリケーションは liblgrp.so API を使用して、次のタスクを実行できます。

  • グループ階層の検索

  • 指定された lgroup の内容と特性の検出

  • lgroup でのスレッドとメモリー配置の操作

デフォルトでは、Oracle Solaris オペレーティングシステムは、スレッドのホーム lgroup からリソースを割り当てようと試みます。たとえば、デフォルトでは、オペレーティングシステムは、スレッドのホーム lgroup にあるプロセッサ上でそのスレッドを実行し、スレッドのホーム lgroup にそのスレッドのメモリーを割り当てるスケジュールを設定しようと試みます。

次のメカニズムを使用すると、lgroup に関係するスレッドおよびメモリーの配置の検出および操作を行うことができます。

  • meminfo() システムコールを使用すると、メモリーの配置を検出できます。

  • lgrp_home() 関数を使用すると、スレッドの配置を検出できます。

  • lgrp_affinity_set() 関数を使用すると、指定した lgroup にスレッドのアフィニティーを設定することによって、スレッドおよびメモリーの配置を操作できます。

  • 標準 C ライブラリの madvise() 関数を使用すると、ユーザーの仮想メモリーの領域が特定のパターンで使用されることが予期されるとオペレーティングシステムに通知できます。madvise() に渡される MADV_ACCESS フラグを使用すると、lgroup 間のメモリー割り当てを操作できます。たとえば、MADV_ACCESS_LWP フラグを指定して madvise() を呼び出すと、指定したアドレス範囲にアクセスする次のスレッドはそのメモリー領域にもっともアクセスするスレッドであることがオペレーティングシステムに通知されます。OS はそれに応じてこの範囲のメモリーおよびスレッドを配置します。

lgroup API の詳細は、Oracle Solaris 11.3 Programming Interfaces Guide の第 4 章Locality Group APIsを参照してください。madvise() 関数の詳細は、madvise(3C) のマニュアルページを参照してください。