コプロセッサー上でのファイル 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 上に直ちに表示されません。出力が見えるようにするには、printf 操作の後に fflush(0); 操作を実行する必要があります。

#pragma offload_attribute(push,target(mic))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma offload_attribute(pop)

int main()
{
        FILE *fp;
        char buffer[7];

        #pragma offload target(mic) nocopy(fp)
        {
                fp = fopen("./proxyfs/myfile.txt", "wb");
                if (fp == NULL)
                {
                        fprintf(stderr, "Failed to open myfile.txt for write\n");
                        exit(1);
                }
                fwrite("Hello\n", 1, 7, fp);
                fclose(fp);
        }
        #pragma offload target(mic) nocopy(fp) out(buffer)
        {
                fp = fopen("./proxyfs/myfile.txt", "rb");
                if (fp == NULL)
                {
                        fprintf(stderr, "Failed to open myfile.txt for read\n");
                        exit(1);
                }
                fread(buffer, 1, 7, fp);
                fclose(fp);
                if (strcmp(buffer, "Hello\n") != 0)
                {
                        fprintf(stderr, "File incorrectly read back on coproc\n");
                        exit(1);
                }
        }

        printf("%s", buffer);

        return 0;
}

関連情報


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