本ページは、Windows版のPGIコンパイラのインストール時の問題や使用法等に関する FAQ のページです。Windows 版の PGI コンパイラ製品は、Linux の bash 環境(cygwin環境)で操作する PGI Workstation 製品と Fortran 専用製品である、Microsoft(R) Visual Studio 開発環境にプラグインして使用するPGI Visual Fortran 製品があります。このページでは、これらの製品に関する FAQ を記述します。
© 株式会社ソフテック
PGI Workstation 製品の cygwin 環境に関する回答
1. Windows 版の PGI Workstation 製品に付属する cygwin とは何ですか?また、付属している cygwin のバージョンは何ですか?
PGI Fortran/C/C++ Workstation 系列の製品は、Windows 上で動作する Linux エミュレート環境である cygwin ソフトパッケージが付属されており、インストール時に cygwin も同時に実装されます。cygwin は、Windows のコマンド・プロンプト上で、bash 等のシェル環境を実現するソフトウェアです。これは、Linux や OS X 上のコマンド端末と同じ環境を実現できるものです。(Windows版の詳細)なお、この FAQ の話題とは関係しませんが、PGI 10.9 以降、PGI Workstation 製品のライセンスでは、PGI Visual Fortran のソフトウェアを使用する権利も含まれます。
同梱されている cygwin のバージョンは、従来は 1.3.x でしたが、PGI 2011の 11.2 ~ 11.6リビジョンにおいて、Cygwin 1.7.7-1 の新しいバージョンが使用されます。さらに2011年8月のリリース 11.8 では、Cygwinのメモリ使用関連の問題を回避するために、Cygwin 1.7.9-1 に更新しました。これらの1.7系のバージョンでは、日本語のような2バイト文字をサポートしているため、シェル環境での日本語操作も可能となります。また、PGIソフトウェアに同梱されている cygwin はフルパッケージではなく、cygwin のサブセットと言う形での実装となります。cygwin に関する正式な FAQ /User's Guide は以下にありますが、検索エンジン等で検索しますと日本語での記事もたくさんありますので、ご参照下さい。
2. PGI 製品に付属する cygwin と標準の cygwin には、違いがありますか?
標準の cygwin 1.7.7-1、1.7.9-1(PGI 11.8以降)に対して、PGI が一部修正を加えているところを除いては、大きな違いはありません。この PGI によるカスタマイズは、従来の PGI バージョンで使用されていた cygwin 1.3系の操作性と同じものとするための一部の修正です。例えば、以下のような変更があります。
3. PGI 11.2 以前のPGI バージョンを使用しています。新しい cygwin バージョンを使用するために PGI 11.2 以降にリビジョンアップしたいのですがインストール時の注意点はありますか?
以下の問題は PGI 11.2 ~ 11.7 のリリースソフトウェアをインストールする際に留意してください。PGI 11.8 以降では、cygwin バージョンを更新して以下の問題はないはずですが、もし、bash 操作環境の不具合が見られる場合は、以下の記事を再度確認してください。
今まで、PGIの旧バージョンで実装された cygwin を使用して、PGI/cygwin のソフトウェアのバージョンアップするユーザの方、あるいは、PGI ソフトウェアとは別に cygwin を実装して使用しているユーザの方には、非常に大事な注意事項があります。なお、全く、新規に Windows 上に、PGI コンパイラをインストールする方には、ここで話題にする問題はありません(以下の作業は必要ありません)。
PGIのインストーラーが cygwin のソフトウェアを実装する場所は、C:\cygwin フォルダー配下となります。これは、一般的な cygwin のインストール実装場所と全く同じです。このフォルダ配下に、Linux のファイルシステム環境と同じような directory (フォルダ)が作成され、その中に、cygwin のモジュールが実装されます。このフォルダの中の一つに C:\cygwin\home と言う Linux ユーザのHOMEディレクトリがあり、この中に、ご自身の専用 HOME フォルダ(一般には、$HOME=/home/{user_name})を、すでにご自身で作成している場合に、以下の注意事項があります。
【C:\cygwin\home\{user_name} ユーザのホーム配下の .bashrc ファイルの修正】
(前略)
# Environment Variables
# #####################
# TMP and TEMP are defined in the Windows environment. Leaving
# them set to the default Windows temporary directory can have
# unexpected consequences.
unset TMP
unset TEMP
上記の unset TMP と unset TEMP の2行を以下のように
# コメントで無効にして下さい。
#unset TMP
#unset TEMP
4. 現在、PGI 11.2 より前の PGI コンパイラが Windows 上にインストールされており、古い cygwin 環境です。この環境で、PGI 11.2 以降の新しいバージョンの cygwin は、どのようにインストールされますか?
PGI 11.2 ~ 11.7 の Windows 上でのインストールでは、古い cygwin 1.3.x (C:\cygwin配下)を検出して、インストール中のウイザード画面が現れ、「cygwin をアップグレードするかどうか」を尋ねます。さらに、PGI 11.8 以降では、再度 cygwin ソフトウェア(1.7.9-1 )の更新を行いましたので、これより古い cygwin が実装されている場合、同じように「cygwin をアップグレードするかどうか」を尋ねます。いずれの場合も、アップグレードを行う場合は、Yes を選択してインストール手続きを進めてください(推奨)。同じ C:\cygwin配下 に新しいソフトウェアが実装されます。No を選択すると、新 cygwin はインストールされず、古い cygwin 環境をそのまま使用する形で使用できます。なお、PGI がインストール実装した cygwin パッケージは、「コントロールパネル」の「プログラムの追加と削除」で、cygwin (PGI Workstation) として登録されておりますので、cygwin のアンインストールならびにレジストリの登録まで削除したい場合は、ここからアンインストールの実行を行って下さい。
5. PGI 11.2 ~ 11.3 リリースの PGI Workstation コマンド・プロンプト(cygwin 環境)で、 実行モジュールの実行後に出力されるべき stdout の内容が現れません。出力内容の随時フラッシュができていないようです。この対策法は?
この問題は、cygwin 機能の本質的な問題です。PGI 11.4 以降では以下の修正は必要ありません。PGI Workstation のコマンド・プロンプト(端末コンソール)を起動するバッチ・スクリプトを修正すると解決できます。このバッチスクリプトは、C:\Program files\PGI\win{32|64}\11.x 配下に存在します。この中の pgi.bat ファイル中の CYGWIN 環境変数の内容を tty から notty に変更します。具体的には、以下のように変更して下さい。
64ビット Windows 環境(Win64)のコンパイラ実装では、以下のバッチファイル(pgi.bat)を 修正します。 以下のパス名の中の 11.x は、使用しているリビジョン番号です。(PGI 11.2 の場合は 11.2です) 64bit 環境のファイル名:C:\Program files\PGI\win64\11.x\pgi.bat 32bit 環境のファイル名:C:\Program files(x86)\PGI\win32\11.x\pgi.bat set CYGWIN=tty の定義を set CYGWIN=notty に変更する。 PGI 11.4 以降は、set CYGWIN=tty の定義自体が存在していませんが、 もし、シェル操作上の不具合等があれば、この場合でもバッチファイルの set CYGROOT=C:\cygwin 行の下に、set CYGWIN=notty を追加して下さい。 PGI 11.8 以降ではこうした修正は必要ありません。 (補足) 現在、実装されているPGIコンパイラのバージョン名を知りたい場合は、 以下のコマンドの実行で表示されます。 kato5:~$ pgfortran -V pgfortran 11.3-0 32-bit target on x86 Windows -tp penryn Copyright 1989-2000, The Portland Group, Inc. All Rights Reserved Copyright 2000-2011, STMicroelectronics, Inc. All Rights Reserved 32ビット Windows 環境(Win32)のコンパイラ実装では、以下のバッチファイル(pgi.bat)を修正します。 以下のパス名の中の 11.x は、使用しているリビジョン番号です。(PGI 11.2 の場合は 11.2です) 32bit 環境のファイル名:C:\Program files\PGI\win32\11.x\pgi.bat set CYGWIN=tty の定義を set CYGWIN=notty に変更する。 PGI 11.4 以降は、set CYGWIN=tty の定義自体が存在していませんが、 もし、シェル操作上の不具合等があれば、この場合でもバッチファイルの set CYGROOT=C:\cygwin 行の下に、set CYGWIN=notty を追加して下さい。 PGI 11.8 以降ではこうした修正は必要ありません。
CYGWIN環境変数のこの問題に関する情報は、以下のOKIソフトウェア様のサイトにも記述があります。
「Cygwin で行こう」10. Cygwin GNU Emacs のページの「環境変数 CYGWIN=tty」の説明を参照
6. PGI 11.2 以降に付属する新 cygwin 1.7 以降の上でファイルのパーミッションやオーナシップの振る舞い方を期待したとおりに動作させるために、/etc/passwd や /etc/group ファイルの設定の仕方に良い方法がありますか?
cygwin 環境に適切な /etc/passwd や /etc/group ファイルを設定しておけば、file permission に関するトラブルが未然に防げます。PGI Workstation 端末(cygwin 環境)を開いた時の自分自身のオーナーシップとグループを /etc/passwd や /etc/group に明示的に追加すればよいでしょう。但し、以下の方法は一般的な方法ですが、情報セキュリティ指針が組織にある場合は、セキュリティ管理者に確認の上で、設定して下さい。また、以下の操作を行う場合は、既存の /etc/passwd や /etc/group ファイルのバックアップを取ってから操作して下さい。
Active directory 配下ではないローカルユーザのアカウントの場合の passwd と group の設定は、以下のコマンドで行います。 mkpasswd -l >> /etc/passwd mkgroup -l >> /etc/group Active directory が動作するネットワーク上のドメイン・ユーザの アカウントの場合の passwd と group の設定は、以下のコマンドで行います。 mkpasswd -d | grep{username} >> /etc/passwd mkgroup -d >> /etc/group
7. cygwin 環境で tar ファイルの展開をしようとしたところ、Cannot change ownership to uid xxx, gid xxx: Invalid argument で、展開できません。ownership 等を変更して展開できる方法はないですか?
デフォルトの passwd や group ファイルを有する cygwin 環境で使用した場合、Windows の "Administrators" group に属するユーザによる tar コマンドの実行で、問題が発生することがあります。例えば tar コマンドでは、展開ファイルを uids/gids へ変更しようとしたとき、
tar: z_arg.f90: Cannot change ownership to uid 536, gid 500: Invalid argument
と言ったようなエラーが発生します。こうした場合は、tar コマンドのオプションに --no-same-owner オプションを付けて実行するか、/etc/passwd や /etc/group を適切に設定して下さい。
8. Windows 環境と Linux 環境のテキストファイルの改行処理が異なります。Linux 上で作成したファイルを Winodws 上の一般的なエディターで開くと、各行に空行が挿入されます。「改行の様式」を変更する方法がありませんか?また、逆に DOS ファイルを cygwin bash 上でコンパイルすると構文エラーを生じる場合があります。双方向で改行様式を変換する方法を教えて下さい。
ファイルの「改行様式」は、OS 毎に異なります。一般的に以下のような様式となっています。
Windows の場合の改行様式 <CR><LF> (DOSファイル)
Linux の場合の改行様式 <LF>
Macintosh の場合の改行様式 <CR>
改行様式が異なっていると、コンパイラによるソースプログラムの改行が認識されず、コンパイル時の構文エラー等を引き起こす恐れがあります。構文エラーがないと思われるにもかかわらず、コンパイル時にエラーが生じる場合はこの問題を疑って見て下さい。
改行様式を cygwin のシェル環境上で変換する方法は、様々な方法がありますが、ここでは一番安全な方法を紹介します。これは、シェル・スクリプト・ファイルやソースファイルを含む一般的なレギュラーファイル(テキスト)に対して適用できます。
PGI Workstation のコマンドプロンプト(cygwin)のウインドウを開いて下さい。変更したいファイルが存在する directory まで移動します。Linux で作成したファイルを Windows 上に移動したファイルを Windows DOS 改行様式に変える方法を説明します。
test.f と言うファイルの改行様式を DOS タイプに変換します。u2d コマンドを使用します。 u2d は "unix to dos" の略記です。 $ u2d test.f test.f: done
逆に、Windows 上の DOS ファイルを Linux 形式に変換する方法(d2uコマンド)は、以下の通りです。あるいは、 Linux 上で行う場合は、dos2unix コマンドで実行できます。
test.f と言うファイルの改行様式を UNIX タイプに変換します。d2u あるいは dos2unix コマンドを使用します。 $ d2u test.f test.f: done (あるいは、Linux上のコマンドでは) $ dos2unix test.f
9. Windows 版のコマンドプロンプト上で、実行環境の「環境変数」をセットするためのコマンドを教えて下さい。
Windows 版の PGI Workstation 製品は、コマンドシェルとして二つの「コマンドプロンプト」のインタフェースを提供しています。Linux Bash シェル環境を使用できる「PGI Bash」と本来の DOS 環境のコマンドプロンプトである「PGI Cmd」の二つがあります。一方、PGI Visual Fortran 製品の場合は、DOS 環境のコマンドプロンプトである「PGI Cmd」のみしか使用できません。コマンドプロンプト内のセッションで、環境変数をセットする方法は、それぞれ異なりますのでご注意下さい。
(一例) 「PGI Bash」の場合 : export OMP_NUM_THREADS=4 「PGI Cmd 」の場合 : set OMP_NUM_THREADS=4
10. Windows 上で MS-MPI を使用して MPIプログラムを実行させた際、マスタプロセスにより標準出力先に write 文で文字を出力させたいのですが、出力されずプログラムが wait の状態になります。
以下のテストプログラムは、MPI プログラムで I/O 処理を伴う場合の一般的な coding です。特に、keyboard / display 等の stdin/stdout に対する入出力は、rank=0 のルート・プロセスで処理をするようにコーディングしています。こうした問題(現象)を解決するために、call flush(6)と言う構文を write 文の直後に入れています。今回の問題(症状)は、Windows 上の MS-MPI ライブラリの実装依存による問題で I/O buffering がデフォルトで行われていることに因るものです。要は write 文の出力を I/O buffer にため込んで、あるタイミングで出力するというモードとなっています。これを解決するために、call flush(機番)でバッファーの強制フラッシュを行います。
call flush(6)の 6 は、stdout の unit 番号です。print文の直後に置いて、flush すれば、display に出力されます。このflush操作は、MPI環境において、理解しておかなければいけない操作の一つです。一つのOSシステム上でマルチプロセスを扱おうとしたMPIのような場合は、デフォルトで I/O を buffering しておいた方が良い場面が多いため、強制 flush しなければいけない場面が出てきます。なお、I/O buffering方法は、使用しているOS / MPI ライブラリ / compiler の種別によって変わりうる「実装依存」の部分でもあります。
program test include 'mpif.h' integer ierr, myrank character*10 fname call mpi_init(ierr) call mpi_comm_rank(MPI_COMM_WORLD, myrank, ierr) if (myrank == 0) then write(6,*) " geometry file name" call flush(6) read *, fname print *, "File name: ",fname end if call mpi_finalize(ierr) end
11. PGI の cygwin 環境でディレクトリを作成したりファイルを作成して ls -al コマンドで見るとそのパーミッションが 000 となっています。これを適切な umask で処理されるようにするための方法は?
この問題に関連する記事は、以下の URL でも説明されています。
http://stackoverflow.com/questions/5828037/cygwin-sets-file-permission-to-000
PGI Workstation(cygwin) プロンプトを管理者権限で開き、/etc/fstab ファイルを vi等のエディターで開いて下さい。(あるいは、C:\cygwin\etc\fstab ファイルを管理者権限で同様に修正して下さい。)以下の表示のように、noaclパラメータを追加して下さい。その後、全てのPGI Workstation(cygwin) プロンプトをクローズしてから、再度、コマンドプロンプトを起動して使用して下さい。なお、一度、Windowsをログアウトしてから再度、PGIを起動した方が確実です。(参考)https://cygwin.com/cygwin-ug-net/using.html#mount-table
none / cygdrive binary,posix=0,user 0 0 を none / cygdrive binary,noacl,posix=0,user 0 0 に変える。
こうした措置をとると、別の副作用が出る場合があります。例えば、作成したファイルのパーミッションが見かけ上変更出来ないと言ったことです(理由は分かりませんが)。こうしたことで不都合が出た場合、noaclパラメータを付けない元の状態に戻した方がよい場合もあります。ご自身の使い勝手により、ご判断ください。