| 日本−日本語 |
|
|
|
![]() |
HP aC++ バージョン A.03.55 リリースノート > 第1章 HP aC++ リリースノートバージョン A.03.33 の新機能 |
|
HP aC++ バージョン A.03.33 の新機能は次のとおりです。 このリリースでは、OpenMP C/C++ API 仕様のバージョン 1.0 を完全にサポートします。この仕様は、http://www.openmp.org/specs で入手できます。 OpenMP プラグマを認識させるには、aCC の起動時に +Oopenmp コマンド行オプションを使用してください。このオプションは任意の最適化レベルで有効です。
マルチスレッド化が行われるため、-mt を +Oopenmp と併用する必要があります (そうしないと、特に -AA を指定している場合に実行時に異常終了することがあります)。 OpenMP プラグマを使用するには、libomp およびlibcps ランタイムサポートライブラリがコンパイルシステムと実行システムの両方に存在する必要があります。コンパイラドライバは、リンク時に自動的にlibomp およびlibcps ランタイムサポートライブラリをリンクします。 これらのライブラリは、次のパッチを適用することによって、インストールされます。
多数のスレッドでの実行時のメモリー不足を避けるために、OpenMP プラグマのリンク時に -N オプションを使用することをお勧めします。 OpenMP をサポートするこの最初の aCC では、OpenMP 構文のデバッギング位置情報が正しくない場合があります。さらに、threadprivate プラグマによってマークされたシンボルが、デバッガに認識されないことがあります。この制限事項を回避するには、代わりにシンボル宣言内に __thread 記憶クラス指定子を使用してください。
また、OpenMP は、aC++ の ANSI C モード (-Ae) でもサポートされます。 aCC_MAXERR 環境変数によって、コンパイルを終了する前にコンパイラに報告させるエラーの最大数を設定できます。現在のデフォルト値は 12 ですが、ゼロより大きい任意の値を設定できます。 コンパイラは、エラーから回復できないこともあるため、 699 Error limit reached: halting compilation ではなく、 445 Cannot recover from earlier errors のメッセージが表示されることもあります。 エラーの最大数を 100 とした例を次に示します。
使用しているシステムに合った aCC ラインタイムパッチと libc パッチをインストールすることによって、aC++ ランタイムでは、malloc の Small Block Allocator (SBA) が有効になります (前述の「必須パッチ」の項を参照)。これによって、ヒープパフォーマンスが向上します。 詳細は、malloc(3) および mallopt(3) のマンページを参照してください。 デフォルト値は、次のとおりです。 M_MXFAST = 512 バイト M_NLBLKS = 100 M_GRAIN = 8 バイト デフォルトを変更したい場合は、環境変数 _M_SBA_OPTS を使用できます。形式は、次のとおりです。 export _M_SBA_OPTS=<maxfast>:<numlblks>:<grain> 既存のアプリケーションがすでに mallopt を呼び出している場合は、アプリケーションが mallopt を呼び出すときには libCsup がすでに mallopt を呼び出して小ブロックを割り当てているため、mallopt はエラーを返します。 上記のデフォルトを使用する場合や、すでに _M_SBA_OPTS を使用している場合は、エラーを無視します。デフォルトがパフォーマンスを損なう場合は、_M_SBA_OPTS にアプリケーションが使用する値を設定するか、次のように指定することによってこの機能を無効にします。 export _M_SBA_OPTS=0:0:0 メモリーリークが潜在するアプリケーションでは失敗することがあります。SBA が無効なときにアプリケーションがサイズの小さすぎるブロックを割り当てる場合は、ブロックは、割り当てられたブロックの最後のオーバーランによって失敗しないようにパディングされます。SBA が有効な場合は、次の隣接バイトが制御情報用に使用され、オーバーランはヒープを破壊して異常終了します。 指定したキャッシュ行をプリフェッチするプラグマがサポートされるようになりました。このプラグマの動作は、+Odataprefetch に似ていますが、prefetch プラグマは、キャッシュに格納された添え字付き配列の特定要素にアクセスできます。さらに、有効な lvalue は引き数として使用できますが、プラグマの目的は、配列処理のサポートです。 #pragma prefetch <argument> プラグマごとに引き数を 1 つだけ指定します。コンパイラは指令を生成して、引き数内に指定されたアドレスから始まるキャッシュ行をプリフェッチします。プリフェッチされた配列要素は有効な値でなければなりません。配列境界外で読み取りが行われると、実行時の動作が不定になります。 次の関数は、aCC コマンドに +O2 +Odataprefetch +DA2.0 (または +DA2.0W) を指定してコンパイルした場合に、ia と b をプリフェッチしますが、a[ia[i]] はプリフェッチしません。
このルーチンを次のように変更します。
2 つのプラグマ文によって、a[ia[i]] がプリフェッチされます。コンパイラは、元のコードのループと同様に、ループを引き続きアンロールすることに注意してください。 カーネルがサイズの大きいページを割り当てることができないようにプリフェッチプラグマを使用すると、問題が発生することがあります。サイズの大きいページがないと、Translation Lookaside Buffer (TLB) のパフォーマンスが損なわれることがあります。最適なページサイズは、アプリケーションによって異なりますが、平均的な推奨ページサイズは 4MB です。 特定のページアドレスが TLB バッファーにない場合は、TLB フォルトが発生します。このバッファーには、キャッシュ内で最近フェッチされたページの絶対アドレスに対する仮想アドレスのマッピングが含まれます。TLB フォルトは、特定の仮想ページアドレスに対する参照がバッファー内で絶対アドレスに変換されなかった場合に発生します。 すべての TLB とプリフェッチ機能が動作しているときでも、システムのメモリー帯域幅によって制約を受けます。PA-RISC システムにすべてのメモリースロットをロードできないと、高帯域幅が縮小されることがあります。メモリーコントローラは、すべてのスロットがロードされている場合に、最高のバンクインタリービングを得ることができます。 SDK/XDK 機能によって、別の場所にインストールされたコンポーネント、ヘッダーファイル、およびライブラリを選択することができます。次の環境変数の一方または両方を設定する必要があります。
SDKROOT 環境変数は、ツールセットコンポーネントすべての参照用の接頭辞として使用されます。別の場所にインストールされた非ネイティブの開発キットやツールセットを使用する場合に設定する必要があります。ツールセットコンポーネントには、コンパイラドライバ、コンパイラアプリケーション、プリプロセッサ、リンカー、オブジェクトファイルツールがあります。 たとえば、コンパイラツールセットが /opt/xdk-ia/ ディレクトリにインストールされている場合は、 次に、上記のコマンドで指定したデフォルトのツールセットコンポーネントの位置とコマンド実行前の以前の位置を示します。
コンパイラドライバ aCC を実行すると、上記の別の位置からツールセットコンポーネントが起動します。 コンパイラが非ネイティブで別の場所にインストールされている場合は、ディレクトリパスに、コンパイラの参照用に接頭辞を付けます。そのディレクトリを指定するには、環境変数 XDKROOT または SDKROOT を設定する必要があります。 たとえば、コンパイラが、/user/foo ディレクトリにインストールされている場合は、
SDK の使用法については、http://devresource.hp.com で入手可能な『『HP-UX Software Development Kit User’s Guide』』を参照してください。 TARGETROOT 環境変数は、ターゲットセットコンポーネントすべての参照用の接頭辞として使用されます。これも、非ネイティブの開発キットを使用する場合に設定する必要があります。ターゲットセットコンポーネントには、ヘッダーファイル、アーカイブライブラリ、共有ライブラリがあります。 たとえば、ターゲットツールセットが /opt/xdk-ia/ ディレクトリにインストールされている場合は、 次に、上記のコマンドで指定したデフォルトのツールセットコンポーネントの位置とコマンド実行前の以前の位置を示します。
LPATH などの環境変数や、-l や -L などのオプションは、$TARGETROOT 接頭辞をオーバーライドします。 このリリースでは、キーワードとして __declspec(dllimport) および __declspec(dllexport) をサポートします。これらのキーワードは、Microsoft Windows コンパイラと同じ意味で、Microsoft Windows コンパイラで開発されたアプリケーションを簡単に HP-UX システムに移植できます。 これらのキーワードのサポートによって、共有ライブラリのパフォーマンスが強化され、HP_DEFINED_EXTERNAL プラグマを使用しなくても、エクスポートされないシンボルを隠すことができます。
HP-UX システム上の aC++ コンパイラの現在の動作では、デフォルトで外部リンケージを持つすべてのシンボルをエクスポートします。容易に __declspec(dllexport) でマークされたシンボルだけをエクスポートして残りのシンボルを隠すために、デフォルトで次の 2 つのオプションを使用します。 このオプションは、__declspec(dllexport) や __declspec(dllimport) で宣言されたシンボル、または HP_DEFINED_EXTERNAL プラグマで指定されたシンボル以外の、変換単位内で使用されているすべてのシンボルを隠します。 このオプションは、__declspec(dllexport) で宣言されたシンボルや HP_DEFINED_EXTERNAL プラグマで指定されたシンボル以外の、変換単位内で定義されているすべてのシンボルを隠します。 隠されるようにマークされたすべての関数 (変換単位内で定義された関数および参照される関
このリリースでは、PBO の利便性が機能拡張されました。コンパイルフェーズでコンパイラの中間コードの代わりに直接 PA-RISC マシンコード (SOM) を生成するように選択できるようになりました。旧バージョンのコンパイラでは、PBO オプション (+I、+P) を指定するとコンパイルフェーズで、中間コードを生成し、リンクフェーズで最終的な PA-RISC マシンコードを生成していました。この動作の結果、多数のファイルが PBO オプションでコンパイルされる場合に、すべてのファイルのコード生成がリンクフェースで行われました。 これによる明らかなデメリットは、1 つのファイルだけが変更された場合でも +Oreusedir= が指定されていない場合に、その他のすべてのファイルのコード生成がリンクフェーズで行われることです。これによって、コンパイルとリンクの時間が著しく長くなります。新しい +Oprofile オプションセットを指定することによって、このデメリットを回避できます。 以下のオプションでは、+I、+P、+O4 オプションのように ISOM (中間コード .o ファイル) を生成しません。したがって、これらのオプションは ISOM をビルドするオプションよりも速く再ビルドしますが、+I フェーズでビルドされた ISOM からは、+P フェーズで再リンクされることはありません。また、新しいオプションは、+O4 オプションによるクロスモジュールの最適化をサポートしません。ソースによる再ビルドを行わない PBO ビルドプロセスでは、これらの新しいオプションを利用できませんが、SOM に変換するために現在スクリプトを使って ISOM ごとに ld -r コマンドを実行しているプロセスでは、スクリプトを実行する代わりに aCC ドライバにこれらの新しいオプションを指定することによって実行できます。 +Oprofile の新しいオプションは次のとおりです。 filename にプロファイルデータベースファイル名を指定します。+P と +df オプションを指定した動作 (つまり、+P +df filename) と同じです。 この実行可能ファイルの静的分岐予測を選択します。+Ostaticprediction と同じです。
スレッド private 変数の静的なリンク時の初期化 (POD のみ) がサポートされています。旧バージョンのコンパイラでは、初期化されていないスレッド private 変数だけがサポートされていました。 次に例を示します。
スレッド private メモリーは実行時に割り当てられるため、スレッド private 変数の仮想変数は、アドレスのコンパイル時の評価が必要な状況で使用してはいけません。次に、誤った使用例を示します。 例 1:
例 2:
-I- オプションは、prefixinclude 検索を行うために機能拡張されました。-I- オプションだけでは、引用符や山かっこで囲まれた検索パス上にない、親ファイルの引用符で囲まれたインクルードが関係している場合には処理できません。prefixinclude 検索では、インクルードしている親ファイル内の #include 指令にディレクトリ接頭辞を使用することによって、インクルードするファイルのディレクトリがインクルード検索リスト上にない場合もサポートします。 -I- を指定しない場合は、親の #include 指令でディレクトリ接頭辞を使用すると、コンパイラは、最上位レベルのソースファイルのディレクトリからのディレクトリオフセットを参照します。-I- を指定した場合は、同様に親ファイルにディレクトリ接頭辞を使用すると、検索リスト上のディレクトリと比較したオフセットが実際には定義されます。これは、子の #include "..." 指令で明示的にディレクトリ接頭辞を指定する場合と等価です。実際、ソースの #include 指令をこのように変更することによって、プリプロセッサで prefixinclude をサポートしなくても、インクルードされるファイルが見つかります。 次に、例を示します。
実際には、prefixinclude 機能では、サブディレクトリ接頭辞 (この場合は incl) は、インクルードするファイルの #include "..."形式のインクルードから継承されます。したがって、インクルードファイルが "prefix/includer" または <prefix/includer> としてインクルードされていた場合は、"prefix/includer" によってインクルードされたファイル "includee" は最初に "prefix/includee" を使って検索されます。失敗した場合は、次に "includee" を使って検索されます。適切な -I パスをそれぞれ使用します。 #include <...> ファイルの検索は、prefixinclude によって影響を受けません。#include "..." ファイル検索だけが拡張されました。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||