木曜日 3 04, 2010

OSC 2010 Tokyo/Spring, OpenSolaris セミナー資料の補足

2/27(土) のオープンソースカンファレンスのセミナー「OpenSolaris の最新情報」に来てくださった方々、ありがとうございました。

セミナー資料 (PDF) が OSC のサイトにアップロードされました:
http://www.ospn.jp/osc2010-spring/pdf/OSC2010TOKYO_Spring_opensolaris.pdf

当日私が行った、Windows XP の VirtualBox 上の OpenSolaris で CIFS サービスを起動するデモを試してみようと思ったかたがいらっしゃいましたら、以下の追加手順が必要なので、この場で補足させてください。セミナーの場で説明すべきでした。すみません

VirtualBox のネットワーク設定の変更

CIFS サービスのためのパッケージをインストールした後に、一旦 OpenSolaris をシャットダウンしてネットワーク設定を「NAT」から「ホストオンリー アダプタ」に変更する必要があります。

具体的には以下の手順となります:

  1. p.17 の記述にしたがってパッケージをインストールし、SMF マニフェストをインポート
  2. OpenSolaris をシャットダウン
  3. VirutalBox の画面上で OpenSolaris が選択されている状態で、右の区画から「ネットワーク」を選択し、「割り当て」を「NAT」から「ホストオンリー アダプタ」に変更
  4. OpenSolaris を起動
  5. p.18 以降の手順を実行

VirtualBox デフォルトの「NAT」モードのままでは、ホスト OS である Windows からゲスト OS の OpenSolaris にアクセスすることができません (VirtualBox のポートフォワード機能を適切に設定すればアクセスできそうですが、それについては私に十分な知識がありません...)。また「ホストオンリー アダプタ」では、ゲスト OS である OpenSolaris が外部ネットワークにアクセスできないので、OpenSolaris でリポジトリからパッケージをダウンロードしてインストールすることができません。したがって以下のような使い分けをすることになります:

  • OpenSolaris のインストールとパッケージのインストール - 「NAT」モードで行う
  • Windows から VirtualBox 上の OpenSolaris の共有ボリュームへのアクセス - 「ホストオンリー アダプタ」モードで行う

VirtualBox の「ブリッジ アダプタ」モードを使えば外部ネットワークへのアクセスも、ホスト OS からゲスト OS へのアクセスもできると思うのですが、ゲスト OS はホスト OS と同様に IP アドレスを持って構成される必要があるので、ネットワーク環境が必須になります。セミナー会場ではネットワーク接続せずにデモをしたので「ホストオンリー アダプタ」を使いました。

VirtualBox のネットワークモードについては、別の機会に説明したいと思います。説明と言っても VirtualBox のオンラインヘルプの 6 章に書いてあることの概略を日本語で紹介することになりますので、興味のあるかたはぜひ VirtualBox のオンラインヘルプを見てみてください。

 

金曜日 6 26, 2009

Sun Studio 12 update 1 の OpenSolaris での SPEC CPU2006 ベンチマーク

コンパイラの性能を把握する一つの指標としてベンチマークが挙げられます。2009/06/23 にSun は、Sun Blade X6275 Server Module で SPEC CPU2006 の整数演算と浮動小数点演算の 2 つの世界記録を更新しデータを提出した。と発表しました。SPECint2006 で 37.4、SPECftp2006 で 50.8 というスコアを出したとのことです。

構成の概要として以下のものが挙げられています

  • OS: OpenSolaris 2009.06
  • コンパイラ: Sun Studio 12 update 1
  • CPU: Intel Xeon 5500 番台

06/23/2009 The Sun Blade X6275 Server Module Posts Two World Speed Records on Floating Point and Integer Benchmarks

リンク先の見出しの右側にあるオレンジの ">>" をクリックすると詳細情報が表示されます。

SPEC に提出されたデータは SPEC CPU2006 の結果は SPEC の Web サイトにある CPU2006 Results -- Form から検索して参照することができます。上記の 6/23 の結果は新しすぎるのか見ることができませんでしたが、例えばフォームで以下のように入力して、ページの一番下にある「Fetch Result」をクリックすると、提出済みの Sun Blade X6275 のベンチマークをすべて見ることができます。

Column Display Criteria
Hardware Vendor SKIP  
System Display [matches] sun blade x6275
Operating System Display  
Compiler Display  

出てきた結果の中に以下の行が見えます。(C/P は Cores Per Chip (チップあたりのコア数) です)

System                                          Result  Base    # Cores # Chips # C/P   Operating System                Compiler                                                        Published
Sun Blade X6275 (Intel Xeon X5570 2.93GHz)      36.7    29.7    8       2       4       OpenSolaris 2008.11             Sun Studio 12 Update 1, (backend build 20090309)                Apr-2009
Sun Blade X6275 (Intel Xeon X5570 2.93GHz)      34.9    31.2    8       2       4       SuSe Linux Enterprise Server 10 Intel C++ and Fortran Compiler 11.0 for Linux, Build 20080930   Apr-2009

OpenSolaris 2008.11 上の Sun Studio 12.1 (おそらく Early Access 版 Sun Studio Express 2009.03) と、SuSE Linux Enterprise 上の Intel コンパイラの CINT2006 (SPECint) の結果です。この 2 行でコンパイラの優劣を決めることは全然できません。実際のデータとして Sun Studio 12 update 1 による最適化は整数、浮動小数点ともに悪くない結果が出ているということを知っていただければと思います。

使われた最適化オプション

個人的には、ベンチマーク結果以上に使われた最適化オプションの方に興味があります。上記の値で検索した結果のページから CINT2006 の Sun Studio 12 update 1 コンパイラを使った行にある「HTML」と書かれたリンクをクリックすると ベンチマーク結果の詳細ページ が開きます。このページの後半にある Peak Optimization Flags を見ると、使われたコンパイラオプションをみることができます。例えば 400.perlbench のために以下のようなオプションが使われています:

-xprofile=collect:./feedback(pass 1)   
-xprofile=use:./feedback(pass 2)   -fast   -xipo=2   
-xpagesize=2M   -xvector=simd   -xalias_level=std   
-xprefetch=no%auto   -lbsdmalloc   -lumem  

まず (pass1) として -xprofile=collect を指定してコンパイルし、プロファイルデータを収集した上で -xprofile=use を指定してコンパイルしていることがわかります。-xalias_level=std や -xprefetc=no%auto は対象のプログラムによって適していたりいなかったりするので、一概にこれを使うべきというものではないですが、-xipo=2 は多くのプログラムで試してみることができるのではないかと思います。自動並列化 (-xautopar) を使ってコンパイルしたプログラムがいつくかあることもわかります。以下は C++ の 473.astar というプログラムで使われた最適化オプションです:

-xprofile=collect:./feedback(pass 1)   
-xprofile=use:./feedback(pass 2)   -fast   -xipo=2   -m64   
-xpagesize=2M   -L/data1/SmartHeap_9/lib -R/data1/SmartHeap_9/lib 
-lsmartheap_mt64   -xalias_level=compatible   -library=stlport4   
-xautopar

最適化オプションとして -fast 以外にどのようなものが使えるのか、マニュアルページやドキュメント等を調べる以外に、SPEC のベンチマークで使われたオプションを見てみるのも一つの方法ではないかと思います。

参考

 

木曜日 6 25, 2009

Sun Studio 12 update 1 を OpenSolaris 2009.06 にインストール

OpenSolaris 2009.11 に Sun Studio 12 update 1 をインストールしてみました。

このページの説明を参考にインストールしました。
http://developers.sun.com/sunstudio/downloads/opensolaris/index.jsp

パッケージマネージャーの検索ボックスで studio と入力し、Enter を押すと以下の 4 つのパッケージが現れます。sunstudio12u1 が出てこない場合には、ツールバーの「再読み込み」ボタンを押して見てください。私の環境では「再読み込み」を押さないと出てきませんでした。

    ss-dev
    sunstudio
    sunstudio12u1
    sunstudioexpress

sunstudio12u1 を選択して「依存関係」タブをチェックすると、SUNWlibC (C++ 標準ライブラリ) や SUNWlibm (数値計算ライブラリ) などに依存していることがわかります。SUNWj6 で始まる JDK 6 のパッケージ群にも依存しています。これは、統合開発環境 (IDE) として NetBeans 6.5.1 を基盤にしていて、NetBeans 6.5.1 の C/C++ 関連の機能が Sun Studio 12 update 1 に含まれていることによります。NetBeans 自身が JDK を必要とするため、Sun Studio 12 update 1 をインストールするときに JDK 6 を同時にインストールすることが求められるます。

インストールを開始するには通常のパッケージのインストール手順通り、チェックボックスをチェックしてツールバーで「インストール/更新」をクリックします。私の環境では JDK 6 以外に sunstudio12u1 のために追加されたパッケージは SUNWhea, SUNWarc の 2 つでした。

インストールが完了すると Sun Studio に含まれるコマンドは /usr/bin にシンボリックリンクが置かれるので、C コンパイラ /usr/bin/cc や C++ コンパイラ /usr/bin/CC は即座につかえるようになります。統合開発環境は /usr/bin/sunstudio です。ファイルそのものは /opt/sunstudio12.1 にインストールされるので、Sun Studio が提供するコマンドは /opt/sunstudio12.1/bin を見ると把握できます。

Sun Studio を起動します

$ sunstudio

NetBeans 6.5.1 のマルチリンガル版に基づいた統合開発環境 (IDE) なので、日本語環境で実行すると、かなりの部分は日本語で表示されます :-)

今回のリリースで追加された新機能であるデバッガ dbxtool も起動してみます

$ dbxtool

例えば、dbxtool でデバッグオプション付きでコンパイルされた実行ファイルを dbxtool で開くことで GUI 環境で デバッグが行えます。統合開発環境ではなくて例えば vi + dbxtool や emacs + dbxtool といった組み合わせで、GUI 上でのステップ実行等を現在の開発環境から即座に行うことができます。C の hello world (hello.c)cc -g でコンパイルして a.out を dbxtool から開いたのが以下の画面です:

dbxtool についてはあらためて詳しく紹介できればと思っています。

 

水曜日 6 24, 2009

Sun Studio 12 update 1 がリリースされました

2009 年 6 月 22 日に Sun Studio 12 update 1 がリリースされました。

Sun の米国の開発者サイトにユーザー登録すると、無料でダウンロードすることができます。OpenSolaris 2008.11 または 2009.06 をお使いの方々はパッケージマネージャーからインストールできます。

今回は英語版のみのリリースです。日本語版については今しばらくおまちください。

OpenSolaris でパッケージマネージャーからインストールする場合、パッケージ名は sunstudio12u1 です。コマンドラインからインストールする場合は以下を実行します:

$ pfexec pkg install sunstudio12u1

ダウンロードサイト:
http://developers.sun.com/sunstudio/downloads/index.jsp

システム要件

Solaris SPARC Solaris x86 Linux x86
OS Solaris 10 1/06 およびそれ以降のアップデートリリース SuSE Linux Enterprise Server 10
Red Hat Enterprise Linux 5
CentOS 5
CPU UltraSPARC および SPARC64 Pentium クラスもしくはそれ以上の AMD または Intel の x86 CPU (32bit および 64bit)
メモリ 推奨: 1 から 2 GB
最小: 512 MB (IDE で開くプロジェクトの大きさに比例して、より多くのメモリが必要となります)

詳しくは リリースノート (英語) を見てください。

前回リリースの Sun Studio 12 から約 2 年ぶりのバージョンアップとなります。評価用の先行リリースであるSun Studio Express を試用していた方々は Sun Studio 12 update 1 の機能のほとんどをすでに体験済みかもしれませんが、これまで Sun Studio 12 を使っていた方々は以下の新機能の情報を参考にしてください。

新機能

  • C, C++, Fortran コンパイラが最新の UltraSPARC および SPARC64 アーキテクチャーに対応
  • 同じく最新の Intel および AMD の x86 アーキテクチャーに対応。SSSE3, SSSE4a, SSE4.1, SSE4.2 への対応を含みます
  • コンパイラおよびデバッガでの OpenMP 3.0 のサポート
  • MPI ベースのアプリケーションのプロファイリングをサポート
  • DLight - DTrace を利用したアプリケーションおよびシステムのプロファイリングを行う GUI ツール
  • dbxTool - GUI デバッガ
  • 科学計算用の、高度にチューニングされたライブラリ群を同梱。ScaLAPACK も含んでいます。
  • 統合開発環境 (IDE) を NetBeans 6.5.1 ベースのものに更新

参考

英語のページのみとなりますが以下のページも参考にしてください:

 

木曜日 4 23, 2009

Japan と書かれた OpenSolaris の T シャツ

OpenSolaris の T シャツが届き、私の手元に保管することになりました。黒地の T シャツで、サイズはアメリカサイズの M です。日本の L に相当すると思います。

右袖のところに書かれているのは以下の文字です:

Japan OPENSOLARIS User Group "No OPENSOLARIS, No Life"

左袖には Sun のロゴがあります。アメリカから送ってきてくれたものなのですが、Japan やその下の文字は確かこちらからリクエストして入れてもらったような ... すみません、記憶がとてもあいまいです。

数に限りはあるのですが、機会をみつけて配布していきたいと思っています。

 

火曜日 8 12, 2008

NetBeans 6.1 でウィンドウの背景色を黒色に、文字を白色にする

NetBeans のウィンドウの背景色を黒色に、文字を白色に変更する方法を探して色々と試してみたのですが、エディタ以外のウィンドウの背景色はシステムの設定に従うようでした。Windows XP で試してみた以下の画像は、次の設定によるものです:

  • 画面のプロパティの「デザイン」で
    • 「ウィンドウとボタン」: Windows クラシック スタイル
    • 「配色」: ハイコントラスト #1 (ただし文字色をデフォルトの黄色から白色に変更)
  • NetBeans IDE のオプションダイアログで
    • 「フォントと色」の「プロファイル」: Norway Today


クリックでリンク元画像を直接表示

 

木曜日 5 08, 2008

Sun Studio 12, 4 月から 5 月にかけていくつかパッチがリリースされました

Sun Studio 12 パッチに関する日本語ページを作りました:

以下は今日現在の最新のパッチのリストです。 以前のエントリ でふれたとおり、日本語版を含む、Sun Studio 12 マルチリンガル版をインストールすると、自動的にいくつかのパッチもインストールされます。上記の「Sun Studio 12 - インストールされるパッチ」では Sun Studio 12 マルチリンガル版インストーラーによってインストールされるパッチの一覧が記載されています。その一覧や手元のマシンにすでに適用済みのパッチと比較して、パッチのリビジョン番号 "-XX" が増えているものは、より新しいパッチがリリースされていることになります。

パッチのダウンロードは「Sun Studio 12 パッチ」のページからパッチ ID をクリックした先のページで行うことができます。

以下のリストでは Sun Studio 12 マルチリンガル版のリリース後に更新されたパッチは末尾に \*\* を付けました:

パッチ ID | パッチのリリース日 | パッチの概要 |

SPARC Solaris OS

124861-06 | 2008/05/06 | Sun Studio 12: Compiler Common patch for Sun C C++ F77 F95 \*\*
124863-03 | 2008/04/11 | Sun Studio 12: Patch for Sun C++ Compiler \*\*
124867-04 | 2008/04/02 | Sun Studio 12: Patch for C 5.9 compiler \*\*
124870-02 | 2007/11/29 | Sun Studio 12: Patch for Sun Performance Library \*\*
124872-04 | 2008/03/19 | Sun Studio 12: Patch for dbx 7.6 Debugger \*\*
124875-02 | 2007/08/06 | Sun Studio 12: Patch for Debugger GUI 3.0
126495-02 | 2007/09/13 | Sun Studio 12: Patch for debuginfo handling \*\*
126503-01 | 2007/08/06 | Sun Studio 12: Patch for Sun Distributed Make 7.8
126995-03 | 2008/04/11 | Sun Studio 12: Patch for Performance Analyzer Tools \*\*
127000-03 | 2008/03/03 | Sun Studio 12: Patch for Fortran 95 8.3 Compiler \*\*
127001-01 | 2007/08/06 | Sun Studio 12: Patch for Fortran 95 8.3 Dynamic Libraries
127143-02 | 2008/01/09 | Sun Studio 12: Patch for Fortran 95 8.3 Support Library \*\*
127147-01 | 2007/08/24 | Sun Studio 12: Patch for update notification
127152-01 | 2007/08/06 | Sun Studio 12: Patch for IDE
127156-01 | 2007/08/24 | Sun Studio 12: Patch for install utilities.

x86/x64 Solaris OS

124864-03 | 2008/04/11 | Sun Studio 12_x86: Patch for Sun C++ Compiler \*\*
124868-04 | 2008/04/02 | Sun Studio 12_x86: Patch for C 5.9 compiler \*\*
124869-02 | 2007/11/29 | Sun Studio 12_x86: Patch for Sun Performance Library \*\*
124873-04 | 2008/03/19 | Sun Studio 12_x86: Patch for dbx 7.6 Debugger \*\*
124876-02 | 2007/08/06 | Sun Studio 12_x86: Patch for Debugger GUI 3.0
126496-02 | 2007/09/13 | Sun Studio 12_x86: Patch for debuginfo handling \*\*
126498-06 | 2008/05/05 | Sun Studio 12_x86: Sun Compiler Common patch for x86 backend \*\*
126504-01 | 2007/08/06 | Sun Studio 12_x86: Patch for Sun Distributed Make 7.8
126996-03 | 2008/04/11 | Sun Studio 12_x86: Patch for Performance Analyzer Tools \*\*
127002-03 | 2008/03/03 | Sun Studio 12_x86: Patch for Fortran 95 8.3 Compiler \*\*
127003-01 | 2007/08/06 | Sun Studio 12_x86: Patch for  Fortran 95 8.3 Dynamic Libraries
127144-02 | 2008/01/09 | Sun Studio 12_x86: Patch for Fortran 95 8.3 Support Library \*\*
127148-01 | 2007/08/24 | Sun Studio 12_x86: Patch for update notification
127153-01 | 2007/08/06 | Sun Studio 12_x86: Patch for IDE
127157-01 | 2007/08/24 | Sun Studio 12_x86: Patch for install utilities.

x86/x64 Linux OS

124865-03 | 2008/04/22 | Sun Studio 12 Patch for RHEL4 and SuSE9 C++ Compiler \*\*
124866-02 | 2007/11/29 | Sun Studio 12: Patch for RHEL4 and SuSE9 Sun Performance Library \*\*
124871-04 | 2008/04/02 | Sun Studio 12: Patch for RHEL4 and SuSE9 C 5.9 compiler \*\*
124874-02 | 2007/10/08 | Sun Studio 12: Patch for RHEL4 SLES9 Linux dbx 7.6 Debugger \*\*
124877-02 | 2007/08/06 | Sun Studio 12: Linux Patch for RHEL4 and SLES9 Debugger GUI 3.0
126497-02 | 2007/10/08 | Sun Studio 12: Patch for SLES9 and RHEL4 Linux debuginfo handling \*\*
126500-01 | 2007/08/06 | Sun Studio 12: Patch for RHEL4 and SLES9 Sun Distributed Make 7.8
126994-02 | 2007/11/12 | Sun Studio 12: Patch for RHEL4 and SLES9 Lingux Performance Analyzer Tools \*\*
126997-05 | 2008/03/18 | Sun Studio 12: Sun Compiler Common patch for RHEL4 and SuSE9 Linux backend \*\*
127145-02 | 2008/03/24 | Sun Studio 12 for RHEL4 SLES9: Patch for Linux Fortran 95 8.3 Compiler \*\*
127146-01 | 2007/08/06 | Sun Studio 12 for RHEL4 SLES9: Patch for Fortran 95 8.3 Dynamic Libraries
127149-01 | 2007/08/24 | Sun Studio 12: Linux Patch for RHEL4 and SLES9 update notification
127154-01 | 2007/08/06 | Sun Studio 12: Linux Patch for RHEL4 and SLES9 IDE
127158-01 | 2007/08/24 | Sun Studio 12: Patch for Linux RHEL4 and SLES9 install utilities.

 

水曜日 4 30, 2008

NetBeans 6.1 英語版リリース。日本語メーリングリストから報告されて修正されたバグなど

米国時間の 4/28 (月) に NetBeans 6.1 英語版がリリースされました。日本は運悪く 4/29 (火) の祝日にリリースされることになってしまいましたので、「気づいたらリリースされていた」となった方々がたくさんいるのではないかと思います。

リリース情報のページを訳しましたので、6.1 での新機能や改良された点などについては NetBeans IDE 6.1 リリース情報 を見てください。このページにおかしな点などありましたら、http://ja.netbeans.org/ の nbdiscuss_ja メーリングリスト宛に教えて頂けると嬉しいです。

6.0 移行修正されたバグを検索しようとしたら 4,000 件近くあり、長大なリストになってしまいました。旧来からのバグを直したものもあるでしょうし、6.1 の開発によって発生して修正されたものもあると思います。全体のリストを紹介することに意味はあまり無いような気がしますが、一応リンクを以下に記しておきます。表示にかなり時間がかかるとおもいますので注意してください:

日本語メーリングリストで報告された問題については 13 件が修正されています。動作上の質問やバグではないかと思われる点などありましたら、ぜひ 日本語サイトのメーリングリスト 宛にご連絡ください。

 

水曜日 4 23, 2008

スレッドローカル記憶領域のアクセスモデルと -xthreadvar コンパイルオプション

前回紹介したスレッドローカル記憶領域 (TLS) について、引き続きそのアクセスモデルを見ていきたいと思います。詳細は Solaris 10 のマニュアル リンカーとライブラリ 第 8 章 スレッド固有領域 に書かれている通りなのですが、ここではその概要を紹介します。

前回の繰り返しになりますが、Linux 版の Sun Studio はスレッドローカル記憶領域の実装を GNU の仕様に基づいて行っています。それは Solaris の仕様とは若干異なります。このエントリでは Solaris 版の Sun Studio のみを想定して、Solaris のスレッドローカル記憶領域の仕様についてのみ説明します。

リンカーで説明されているモデル

Solaris のリンカーの説明では、以下の 4 つのモードが説明されています。使用に当たっての自由度は一番上の GD が最も高く、一番下の LE が最も低いです。最適化の程度 (アクセス速度) は、一番上の GD が最も低く、一番下の LE が最も高いです。

自由度 最適化 名称 概略




General Dynamic (GD) 動的な TLS
Local Dynamic (LD) 局所シンボルの動的な TLS
Initial Executable (IE) オフセットが割り当てられた静的な TLS
Local Executable (LE) 静的な TLS

コンパイラで指定できるオプション

Solaris のリンカーでは上記の 4 つのモデルが説明されていますが、コンパイル時に指定できるのは「動的 (GD) を選択するか、静的 (IE) を選択するか」の 2 つのいずれかです。LD と LE はコンパイル時に指定するようにはなっていません。

-xthreadvar=dynamic 動的 (GD)
-xthreadvar=no%dynamic 静的 (IE)

x86 バックエンドチームの説明によると、LD および LE の選択はコンパイラおよびリンカーのいずれかが、定められた条件に従って行うとのことで、コンパイル時に指定するものではないようです。リンカーのマニュアルで説明されているように、TLS のアクセスモデルはリンカーによって変更される場合があります。GD から LE へ向かって、すなわち動的なものを静的なものへ、より高速なものへと変換します。静的なものを動的なものへ変換することはありません。共有ライブラリでスレッドローカル記憶領域を使う場合には動的にコンパイルしないと実行可能ファイルからアクセスすることはできませんので、そのような場合には動的な TLS モデルを使うようにコンパイルしておく必要があります。

__thread がプログラムコード内で使われているにもかかわらず -xthreadvar による指定がされていない場合には、以下のルールでコンパイラ自身がモデルを選択します:

  • -xcode (SPARC) または -KPIC、-Kpic (x86) の指定によって位置独立コード (PIC) が使われている場合は動的: -xthreadvar=dynamic
  • 上記以外は静的: -xthreadvar=no%dynamic

-KPIC-xcode=pic13 によって位置独立コードを使う場合というのは共有ライブラリを構築する場合が殆どではないかと思います。ちょっと乱暴な解釈かもしれないですが、スレッドローカル記憶領域のアクセスモデルは共有ライブラリとそれ以外で使い分ける。とも言えそうです。

いずれにせよ、__thread を使う場合には、__thread が指定された変数のアクセスモデルは 4 つ存在し、どのモデルが使われるのかは、コンパイラおよびリンカーによって決定される。ということになります。

参考

 

月曜日 4 14, 2008

Sun Studio 12, スレッドローカルな記憶領域を使う

通常マルチスレッドアプリケーションではすべてのスレッドは同じプロセスに属すため、グローバル変数や静的変数はどのスレッドからも同じ記憶領域が参照されることになり、結果として同じ値を使うことになります。スレッド間で同じ値であることが重要なのですが、場合によっては、スレッド毎に異なる値を持った静的変数があったら便利なことがあります。

これを実現するための一つの方法としてスレッドローカル記憶領域 (TLS , Thread Local Storage) とよばれるしくみが多くのコンパイラと実行環境で提供されています。Solaris および Sun Studio コンパイラの両方で、TLS そのものと、それを使うためのしくみが提供されてています。SPARC 版の Solaris 環境ではかなり前に導入済みでした。x86/x64 版 Solaris 環境では Sun Studio 10 (2005/1) から導入され、Linux 版 Sun Studio では Sun Studio 12 (2007/10) から導入されました。

__thread を変数の前につけて宣言することによって、その変数はスレッドローカルな記憶領域に配置され、スレッド固有の値を持たせることができるようになります。以下のソースで静的変数 key_tls 配列は、スレッドに固有の記憶領域に格納され、それぞれのスレッドで異なる値を持たせることができます。

#include <pthread.h>
#include <thread.h>
#include <pstdio.h>
#include <stdlib.h>

#define NUM_THREADS 5
#define NO_KEYS 8

/\* この keys_tls はスレッドローカル記憶領域に保持されます \*/
__thread int keys_tls[NO_KEYS]

statuc void \*thread_func(void \*arg){
...

使用法は C/C++ のプログラミング時に __thread キーワードを追加するだけなのですが、内部的なアクセス方式はいくつかのタイプに区別されています。このアクセス方式はコンパイラ時に -xhtreadvar フラグで制御することができます。これについては次の機会にふれたいと思っています。

これと似たものに、スレッド固有データを扱うための POSIX スレッド API があります

  pthread_setspecific()
  pthread_getspecific()
  pthread_key_create()

スレッドローカル記憶領域を使った場合とスレッド固有データを使った場合の単純な比較を試みる C のサンプルプログラムが Sun Studio に付属しています。このブログにもソースコードを添付しておきますので、興味のあるかたはコンパイルして実行してみてください。ソースファイル内に記されているとおり、-mt -xO3 を付けてコンパイルしてください。

  $ cc -o tlsbench -mt -xO3 tlsbench.c
  $ ./tlsbench

このサンプルプログラムは、 SPARC 版の Sun Studio 12 を使っている場合には /opt/SUNWspro/examples/general/tls にインストールされていますが、x86 版、および Linux 版には付属していません。x86 版、Linux 版で試してみる場合には上のリンクからダウンロードして使ってください。

ちょっと話はそれてしまいますが、このプログラムを -fast オプションを付けてコンパイルをすると正しい比較になりません。-fast によって -xdepend が指定されたことと同じになり、-xdepend によるループ解析の結果、プログラムの 27 行目のループはデッドコードと判断され除去されます。、比較するそれぞれの処理のループ構成が異なることになってしまいます。コンパイラの最適化によってコードがどう組み替えられたのかは -g をつけてコンパイルしたオブジェクトファイルをer_src(1) コマンドによって開くことにより確認できます。

  $ cc -o tlsbench -g -mt -xO3 -xdepend tlsbench.c
  $ er_src tlsbench | more

Solaris と GNU では、TLS の仕様が若干異なります。Sun Studio Linux 版の TLS の実装は GNU の仕様に準拠したものになっています。それぞれの詳細については参考ページをみてみてください。

参考

 

金曜日 4 11, 2008

NetBeans 6.1 リリース候補ビルド (RC1) 英語版が公開されました

NetBeans 6.1 のリリース候補ビルド (RC1) 英語版が公開されました。以後、英語版は新たに発見された深刻な問題以外は修正しませんので、ユーザーの方々からの問題の報告が無ければ、このままリリースされます。通常は必ずいくつかの報告が寄せられるので、それらの修正をした上でリリースとなります。

日本語化 zip ファイルも同時に更新しましたので、RC1 と一緒に使ってください。以下のページから 6.1 RC1 のダウンロードと日本語化 zip のダウンロードができます。

http://ja.netbeans.org/downloads/61/index.html

今現在の日本語化 zip には 6.0.1 の時点の日本語訳しか含まれていませんので、6.1 の新機能などは英語で表示されます。今回のリリースでの比較的大きな新機能は JavaScript 編集支援機能と、PHP 開発環境の提供ですので、これら 2 つ以外の機能では、ほとんどのメッセージは日本語で表示されます。

日本語版の進捗については 片貝さんのブログ にあるとおり、これから翻訳を開始するところです。今のところ以下のスケジュールを予定しています。

  • 2008 年 4 月末: 英語版リリース
  • 2008 年 5 月末: 日本語版を含む他言語版をリリース

RC1 についてのフィードバックや、あるいは現在の NetBeans の日本語化されたユーザーインターフェースで修正して欲しいと思うところなど、何かありましたらぜひ nbdiscuss_ja メーリングリスト宛にコメントをお願いします。メーリングリストの購読などは以下のページを見てみてください。

http://ja.netbeans.org/lists/

 

水曜日 4 02, 2008

NetBeans のチュートリアルを OmegaT を使って日本語に翻訳する

NetBeans のチュートリアル翻訳プロジェクトに参加して、NetBeans プロファイルツールのチュートリアルを 2 つ翻訳してみることにしました。翻訳に当たってフリーの OmegaT という翻訳支援ツールを使うことにしました。この翻訳支援ツールは以下のことをしてくれます:

  • 翻訳対象のファイルから翻訳が必要な部分のみを抽出して表示
    たとえば HTML であればタグ等は消去された形で表示されたエディタ上で編集を行います
  • 類似の翻訳を候補として表示
  • 用語集のファイルが指定してあれば、用語も表示

チュートリアル翻訳プロジェクトでは、OmegaT を使って翻訳するときのために「翻訳メモリ」と呼ばれるファイルも公開していますので、それをダウンロードして使います。「翻訳メモリ」とは翻訳文書が保存されているファイルで、新しいファイルを訳す際の類似の訳文は、この翻訳メモリから探されます。また場合によってまったく同じ英文がメモリ内に見つかることがあります。その時にはその英文に対する日本語訳をそのまま流用できます。

OmegaT のダウンロードとバグ修正

OmegaT のソースを変更してコンパイルしなくてはいけませんでした...
Solaris で使っているので、もしかしたら Windows や Linux では問題ないのかもしれないです。翻訳が終わったら OmegaT プロジェクトに報告しようと思っています。私と同じような修正を行う場合には、コンパイル済みバイナリのダウンロードは不要ですので、最新リリースの 1.7.3_1 のソースファイルのみをダウンロードします:

http://downloads.sourceforge.net/omegat/OmegaT_1.7.3_01_Source.zip

OmegaT の設定ファイルは $HOME/omegat.pref という名前で保存したいようなのですが、ファイルの区切り文字が挿入されていないので、/home/keiichio/omegat.pref としたいところが /home/keiichioomegat.pref となってしまっていて結局保存できません。ファイル名を組み立てるところに File.separator を挿入すれば良いだけの話ですので、修正はごく単純です。以下の 2 つのクラスを修正します:

  • src/org/omegat/util/Preferences.java
  • src/org/omegat/fileters2/master/FilterMaster.java

もしかしたら必要な人がいるかもしれないので (いるのか?)、パッチファイルを添付しておきます。保存ファイル名を私の好みで .omegat で始まるように変更してありますので、そこら辺は適宜変更して使ってください:

修正したらソースファイルを展開したディレクトリで ant を実行すればビルドが完了します。私は手元にあった ant 1.7.0 でビルドしました。

  $ ant

起動はビルドされた jar ファイルを java に渡すだけです。ビルドすると dist ディレクトリに起動用の bash スクリプト OmegaT も用意されますが、使い勝手が良くないと思いました。これも後で OmegaT プロジェクトに報告しようかと思っています。

  $ java -jar dist/OmegaT.jar

私自身はフォントのアンチエイリアスの指定などがしたかったので、起動用のスクリプトを自分で作って使っています。参考までにスクリプトの内容を貼り付けておきます:

#!/bin/sh

myname=`basename $0`
a=`dirname $0`
bindir=`cd $a; pwd`

default_options="-client -Xss2m -Xms32m -Dawt.useSystemAAFontSettings=on"

java ${default_options} -jar $bindir/src/dist/OmegaT.jar $\*

あとは OmegaT の以下のような画面で翻訳を進めていきます

 

金曜日 3 28, 2008

コンパイラによる自動並列化の捕捉。縮約 (reduction) を自動で行わせる

前回の自動並列化の説明で、理解不足の点がありました。「姫野ベンチ」で自動並列化を試みた際に gosa という変数の演算部分が並列化できなかったため効果が現れませんでした。という説明をしましたが gosa という変数の演算のj自動並列化を可能にするオプションがありました。このエントリでは、前回はどうして並列化できなかったのか、という点と並列化を可能にするオプションについて説明します。

姫野ベンチのソースコードはダウンロードして展開すれば読むことができますが、直接読める形で公開されていません。コードの一部を紹介することに問題はないのかもしれませんが、このエントリでは姫野ベンチのソースコードは直接使わずに、同等のコードに置き換えて説明します。

どうして並列化できなかったのか

前回のエントリでは「変数がループ内に完全に閉じていないため」と簡単に説明しただけですが、具体的には以下のような状況です

for (i=1; i < 1000; i++) {
    sum += a[i]\*b[i]; /\* S1 \*/
}

変数 sum は、1 つ前のループ実行時の sum に配列の値から求めた積を加算しているため、単純な方法で並列化することはできません。例えば 2 のスレッドで実行したとしても、最後にはそれぞれのスレッドで求めた sum を一つの値に合算しないと、求める値を得ることはできません。

縮約 (reduction)

この、スレッド毎に一時的な変数で部分和を求めておいて最終的な結果は合算して求める。という処理を行うために、OpenMP では縮約 (reduction) と呼ばれる指定を変数に対して行うことができるようになっています。指定された変数のことを縮約変数と呼びます。ただし丸め誤差の影響から、縮約して複数スレッドで実行した演算結果は、単一スレッドでの演算結果と個なる場合があります。

OpenMP で、ある変数を縮約変数として扱うか否かは明示的に指定する必要があります。

/\* OpenMP: for ループで sum を縮約変数として指定 \*/
#pragma omp parallel for reduction (+:sum)

変数を縮約変数として自動並列化する -xreduction オプション

コンパイラによる自動並列化を行う際にも、コンパイラに縮約を行うように指示をすることができます。縮約可能であると判断された場合には変数は縮約変数として扱われ、並列化されます。OpenMP による並列化を行う場合と同じく、明示的に指示しない限り縮約のための解析と縮約変数の指定は行われません。縮約を行うように指示する場合には -xreduction オプションを追加します。指定されるとコンパイラは、解析の結果可能であれば変数を縮約変数として扱います。

姫野ベンチのソースで試してみる

コンパイル時に gosa の演算が縮約され、198 行目のループが並列化されたことを示すメッセージが出力されました:

cc -c  -fast -m64 -DMIDDLE -xvector=simd -xdepend -xautopar -xreduction -xloopinfo himenoBMTxps.c
"himenoBMTxps.c", 152 行目: 並列化されます
"himenoBMTxps.c", 153 行目: 並列化されません、利得なし
"himenoBMTxps.c", 154 行目: 並列化されません、利得なし
"himenoBMTxps.c", 170 行目: 並列化されます、逐次版が生成されました
"himenoBMTxps.c", 171 行目: 並列化されません、利得なし
"himenoBMTxps.c", 172 行目: 並列化されません、利得なし
"himenoBMTxps.c", 195 行目: 並列化されません、安全でない依存性 (wrk2 p)
"himenoBMTxps.c", 198 行目: 並列化されます、縮約、逐次版が生成されました
"himenoBMTxps.c", 199 行目: 並列化されません、利得なし
"himenoBMTxps.c", 200 行目: 並列化されません、利得なし
"himenoBMTxps.c", 223 行目: 並列化されます、逐次版が生成されました
"himenoBMTxps.c", 224 行目: 並列化されません、利得なし
"himenoBMTxps.c", 225 行目: 並列化されません、利得なし
cc -o bmt himenoBMTxps.o  -fast -m64 -DMIDDLE -xvector=simd -xdepend -xautopar -xreduction -xloopinfo

実行結果は以下のようになりました。前回と同じく自動並列化した実行ファイルは OMP_NUM_TREADS=2 という環境変数を指定した上で実行しています:

CPU 2 次キャッシュ メモリ
AMD Opteron 250 (2.4GHz) x2 1 MB 3326 MB

結果 (5 回計測した中央値)

コンパイルオプション 結果 (MFLOPS)
-DMIDDLE -fast -m64 -xvector=simd -xdepend 812.315620
-DMIDDLE -fast -m64 -xvector=simd -xdepend -xautopar -xreduction -xloopinfo 1069.074965

自動並列化を行う場合に、「安全でない依存性」と報告された変数が縮約によって並列化される可能性がある場合には -xautopar に加えて -xreduction を指定することで、-xautopar だけでは並列化できなかった部分も並列化することができるようになります。

 

MySQL と Sun の初めてのセミナーが 4 月 9 日(水) に開催されます

MySQL と Sun の初めてのセミナーが 4 月 9 日(水) に開催されます。

春のMySQL祭り 2008 - Jumping to the Sun !

開催日時:2008 年4月9日(水) 13:30 から
開催場所:ウエスティンホテル東京
参加費用:無料(事前登録制)
主催:MySQL 株式会社、サン・マイクロシステムズ株式会社

会場へアクセス可能でご興味のあるかたは見てみてください。

 

火曜日 3 25, 2008

Sun Studio 12, コンパイラによるプログラムの自動並列化

Sun Studio 12 には自動並列化機能があり、コンパイラがループを解析して並列化を行います。並列化しても安全かどうかを、入れ子になったループも含む全ループにわたって解析し、安全と判断された場合には OpenMP を使って並列化を行います。ループ以外は解析も変更もされません。-xautopar コンパイルオプションを付けてコンパイルすることにより自動並列化が行われます。C/C++/Fortran に対応しています:

  $ cc -xautopar foo.c

すでに OpenMP を使った並列化が実装されていたり、マルチスレッド化が行われたプログラムに対して使用することはできません。並列化が行われていないプログラムを変更することなくコンパイラによって自動的に並列化するのが、このオプションの目的です。

処理全体を把握するわけではなく、あくまでもループの解析のみに基づいて局所的に行われる並列化ですので、限定的な効果にとどまりますが、コードにまったく変更を加えることなくマルチコア/マルチソケット環境の恩恵を得ることができる可能性があるため、手元にあるプログラムの再コンパイルと実行が比較的容易な場合には、試してみる価値のあるオプションだと思います。

実際にどのループが並列化されたのか、という情報は -xloopinfo というオプションを追加することで標準エラー出力上で確認できます。

実行する際には OMP_NUM_THREADS 環境変数によって並列処理領域で使用するスレッド数を指定しておく必要があります。指定しない場合には OMP_NUM_THREADS=1 となります。

例によって「姫野ベンチ」で試してみました。処理時間のもっとも長い部分が並列化されなかったので、目に見える効果は現れませんでした。参考までにコンパイル時に -xloopinfo によって出力された内容を貼り付けておきます:

  $ make
cc -c -fast -g -m64 -DMIDDLE -xvector=simd -xdepend -xautopar -xloopinfo himenoBMTxps.c
"himenoBMTxps.c", 152 行目: 並列化されます
"himenoBMTxps.c", 153 行目: 並列化されません、利得なし
"himenoBMTxps.c", 154 行目: 並列化されません、利得なし
"himenoBMTxps.c", 170 行目: 並列化されます、逐次版が生成されました
"himenoBMTxps.c", 171 行目: 並列化されません、利得なし
"himenoBMTxps.c", 172 行目: 並列化されません、利得なし
"himenoBMTxps.c", 195 行目: 並列化されません、安全でない依存性 (wrk2 p)
"himenoBMTxps.c", 198 行目: 並列化されません、安全でない依存性 (gosa)
"himenoBMTxps.c", 199 行目: 並列化されません、安全でない依存性 (gosa)
"himenoBMTxps.c", 200 行目: 並列化されません、安全でない依存性 (gosa)
"himenoBMTxps.c", 223 行目: 並列化されます、逐次版が生成されました
"himenoBMTxps.c", 224 行目: 並列化されません、利得なし
"himenoBMTxps.c", 225 行目: 並列化されません、利得なし
cc -o bmt himenoBMTxps.o -fast -g -m64 -DMIDDLE -xvector=simd -xdepend -xautopar -xloopinfo

「安全でない依存性」と記されている部分は、変数がループ内に完全に閉じていないため (例えば一つ前のループ実行時の結果を参照している等)、並列化されなかったことを示しています。変数 gosa のために並列化されなかった198 行目から 200 行目にかけてのループが最も処理時間を要する部分なので、ここが並列化されなかった結果、全体のパフォーマンス向上には結びつきませんでした。

「並列化されます、逐次版が生成されました」という部分は、並列処理を行うものと逐次処理を行うものの両方が生成されたことを示しています。ループ内での処理が少ない場合には逐次版が実行されると説明されていますが、詳細はちょっとわかりませんでしたので引き続き調べたいと思います。上記のコンパイル結果を実行した限りでは、並列化された部分は常に並列処理が実行されていました。

試しに gosa を計算しないようにして、-xautopar の有無によるパフォーマンスの変化を見てみました。演算を一つ省いてしまっていますから姫野ベンチのこれまでの実行結果と比較できる値ではありませんが、並列化の効果を知る上での参考値にはなると思います:

-xautopar を付けてコンパイルした実行ファイルは環境変数 OMP_NUM_THREADS=2 を設定した上で実行しています:

CPU 2 次キャッシュ メモリ
AMD Opteron 250 (2.4GHz) x2 1 MB 3326 MB

結果 (5 回計測した中央値)

コンパイルオプション 結果 (MFLOPS)
-DMIDDLE -fast -m64 -xvector=simd -xdepend -xrestrict 801.706509
-DMIDDLE -fast -m64 -xvector=simd -xdepend -xrestrict -xautopar -xloopinfo 1343.303243

約 60% と、予想外に大きく向上しました。が、元々このプログラムはループ演算の性能評価に特化したものなので、ループの並列化が全体のパフォーマンスに大きく影響を及ぼすことは当たり前だとも言えます。一般的にこのくらい向上するわけでは決してないと思います。

プログラム全体にわたって効率よく最適化するには、OpenMP による並列化やマルチスレッド化を自ら行うのが良いのですが、手元のプログラムにまったく変更を加えることなく、マルチコア/マルチソケット環境の恩恵を得るには良い選択肢だと思います。

また、今回の gosa の演算をやめてしまうような変更は全然ダメですが、手元のプログラムでループ間の変数の依存を比較的簡単に調整できそうな場合は、ちょっとした変更でパフォーマンスの向上が見込めるかもしれません。

参考:

  • The OMPlab on Sun Systems (PDF)
    2007 年 6 月に北京で開催された International Workshop on OpenMP 2007 (IWOMP 2007) で使われた Sun の Ruud van der Pas のプレゼンテーション資料。自動並列化のみならず Sun の OpenMP 実装などについても説明されています

 

About

keiichio

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日