このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーにのみ適用されます。
ホスト上で実行するコードと同じように、コプロセッサー上で実行するコードでもファイルの読み書きを行うことができます。オフロードコードによりコプロセッサー上で読み書きを行うには、コプロセッサー上の特別なディレクトリー ./proxyfs/ を使用する必要があります。 このディレクトリーに対する読み書きは、ホストの環境変数 MIC_PROXY_FS_ROOT で定義された親ディレクトリー構造で、ホストにプロキシーされます。 例えば、MIC_PROXY_FS_ROOT=/home/user/app と定義すると、ホストのディレクトリー /home/user/app/proxyfs/ にプロキシーされます。
オフロードコードはローカルファイルのように読み書きを行い、ファイル I/O はホストシステムに自動的にプロキシーされます。このファイルはホスト上にのみ存在します。コプロセッサー上にキャッシュコピーは存在しません。このため、通信によるペナルティーが予想されます。
コプロセッサーのプロキシー・ディレクトリー名 ./proxyfs/ は事前定義されています。 ディレクトリー名を変更することはできません。
フォワードスラッシュ (/) の前のドット (.) を指定しないと、オフロードコードのファイル I/O はホストにプロキシーされず、I/O は代わりにコプロセッサーのローカル・ディレクトリー /proxyfs/ へ書き込まれます。
オフロードコードがディレクトリー ./proxyfs/ 以外に作成したファイルとディレクトリーはホストにプロキシーされません。 コプロセッサーのファイルシステムにローカルに存在します。例えば、/tmp/testFile.dat への書き込みは、ローカルのコプロセッサーのファイルシステムにのみ書き込まれます。
プロキシーされたホスト上のディレクトリーに書き込まれたファイルは、コプロセッサーから読み取ることができます。逆も同様です。コプロセッサー上の ./proxyfs/ に書き込まれたファイルは、ホストから読み取ることができます。 読み取り用にファイルを開く前に、書き込み用に開かれていたファイルを閉じる必要があります。
コードのオフロードされたセクションからローカルファイル (つまり、ホストにプロキシーされないファイル) を作成するには、/proxyfs/ 以外のディレクトリーにファイルを書き込みます。
環境変数 MIC_PROXY_IO は、stdout および stderr のプロキシーを制御します。 デフォルトは 1 で、stdout および stderr はホストにプロキシーされます。stdout および stderr のホストへのプロキシーを無効にするには、MIC_PROXY_IO を 0 に設定します。
ファイルのプロキシーを無効にするには、MIC_PROXY_FS_ROOT を空の値に設定するか、変数そのものを指定しません。
ファイル I/O のディレクトリーを指定しない場合、ファイルが書き込まれるコプロセッサー上のデフォルト・ディレクトリーは /tmp/coi_procs/coprocessr_num/PID になります。 例えば、コプロセッサー #1 に対してオフロードが行われ、プロセス PID#2929 で制御された場合、コプロセッサー上のデフォルト・ディレクトリーは /tmp/coi_procs/1/2929 になります。
システムのコプロセッサーの番号は 1 から開始します。例えば、192.168.1.100 にある最初のコプロセッサーは、コプロセッサー #1 です。 OFFLOAD 宣言子のターゲット指定 target(mic:0) で指定する番号とは異なります。
stdout への出力は CPU 上に直ちに表示されません。出力が見えるようにするには、ユニット 6 への各 PRINT または WRITE の後に FLUSH 6 を実行する必要があります。
program main
character*1 buffer(5)
integer f, r, d
!dir$ offload begin target(mic) nocopy(fp)
open(f, FILE='./proxyfs/myfile.txt', IOSTAT=r)
if (r .ne. 0) then
print *, 'Failed to open myfile.txt for write'
stop
endif
write(f,*) 55
close(f)
!dir$ end offload
!dir$ offload begin target(mic) nocopy(fp) out(buffer)
open(f, FILE='./proxyfs/myfile.txt', IOSTAT=r, STATUS='OLD')
if (r .ne. 0) then
print *, 'Failed to open myfile.txt for read'
stop
endif
read(f, '(I)') d
close(f)
!dir$ end offload
if (d .ne. 55) then
print *, 'File incorrectly read back on coproc'
stop
endif
print *, d
end