Oracle® Developer Studio 12.5: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

8.3 Oracle Solaris OS のチューニング機能

Oracle Solaris オペレーティングシステムは、OpenMP プログラムのパフォーマンスを改善する機能をサポートしています。これらの機能には、メモリー配置の最適化 (MPO) および複数ページサイズサポート (MPSS) があります。

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) のマニュアルページを参照してください。

8.3.2 複数ページサイズサポート

Oracle Solaris の Multiple Page Size Support (MPSS) 機能を使用すると、アプリケーションで仮想メモリーの領域ごとに異なるページサイズを使用できます。特定のプラットフォームのデフォルトのページサイズは、pagesize コマンドを使用すると取得できます。このコマンドで -a オプションを指定すると、サポートされるすべてのページサイズが表示されます。詳細は、pagesize(1) のマニュアルページを参照してください。

トランスレーションルックアサイドバッファー (TLB) は、仮想メモリーアドレスを物理メモリーアドレスにマップするために使用されるデータ構造です。TLB で使用可能な仮想と物理のマッピング情報がないメモリーアクセスには、性能ペナルティーが関連付けられます。ページサイズが大きいと、TLB が固定数の TLB エントリを使用して、より多くの物理メモリーを割り当てます。このため、ページサイズが大きくなると、仮想と物理のメモリーマッピングのコストが減少し、全体的なシステムパフォーマンスが向上することがあります。

アプリケーションのデフォルトのページサイズを変更する方法はいくつかあります。

  • Oracle Solaris コマンドの ppgsz(1) を使用する。

  • -xpagesize-xpagesize_heap、または -xpagesize_stack の各オプション付きでアプリケーションをコンパイルする。詳細は、cc(1)、CC(1)、または f95(1) のマニュアルページを参照してください。

  • mpss.so.1 共有オブジェクトを事前ロードすると、環境変数を使用してページサイズを設定できるようになります。詳細は、mpss.so.1(1) のマニュアルページを参照してください。