コプロセッサー上でのファイル I/O の実行

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® 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

関連情報


このヘルプトピックについてのフィードバックを送信