インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

6.6.4. ホストを経由したFPGAのプログラミング

インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、ホスト・アプリケーションから独立してカーネルをコンパイルするオフライン・コンパイラーです。 カーネルをOpenCL™ランタイムにロードするには、clCreateProgramWithBinary関数をホスト・アプリケーションに含めます。
注意:
ホストシステムが複数のプロセッサーで構成されている場合、FPGAには一度に1つのプロセッサーしかアクセスできません。例えば、2つのプロセッサーに対応する2つのホスト・アプリケーションが、同じFPGAにカーネルを同時に起動しようとしているとします。2番目のホスト・アプリケーションは、デバイスがビジーであることを示すエラーメッセージを受け取ります。2番目のホスト・アプリケーションは、1番目のホスト・アプリケーションがOpenCLのコンテキストを解放するまで実行できません。
  1. オフライン・コンパイラーでOpenCLカーネルをコンパイルし.aocxファイルを作成します。
  2. ホスト・アプリケーションにclCreateProgramWithBinary関数を含め、.aocxファイルからcl_program OpenCLプログラム・オブジェクトを作成します。
  3. ホスト・アプリケーションにclBuildProgram関数を含め、指定したデバイスで実行可能なプログラムファイルを作成します。
    以下は、clCreateProgramWithBinaryを使用しFPGAデバイスをプログラムするホストコード例です。
    size_t lengths[1];
    unsigned char* binaries[1] ={NULL};
    cl_int status[1];
    cl_int error;
    cl_program program;
    const char options[] = "";
    
    FILE *fp = fopen("program.aocx","rb");
    fseek(fp,0,SEEK_END);
    lengths[0] = ftell(fp);
    binaries[0] = (unsigned char*)malloc(sizeof(unsigned char)*lengths[0]);
    rewind(fp);
    fread(binaries[0],lengths[0],1,fp);
    fclose(fp);
    
    program = clCreateProgramWithBinary(context,
                                        1,
                                        device_list,
                                        lengths,
                                        (const unsigned char **)binaries,
                                        status,
                                        &error);
    clBuildProgram(program,1,device_list,options,NULL,NULL);
    clBuildProgram関数が正常に実行されると、CL_SUCCESSが返されます。
  4. clCreateKernelsInProgramまたはclCreateKernel関数を使用し、プログラム実行可能ファイルからカーネル・オブジェクトを作成します。
  5. カーネルを実行するための関数を含め、スケジュールされたカーネルをFPGAで実行するようホストランタイムに指示します。
    • NDRangeカーネルを実行するためのコマンドをエンキューするには、clEnqueueNDRangeKernelを使用します。
    • 単一ワークアイテムのカーネルをエンキューするには、clEnqueueTaskを使用します。
    重要:

    インテルでは、使用されていないイベント・オブジェクトを解放することを推奨しています。SDKは、明示的な指示があるまでイベント・オブジェクトを解放せずに保持し続けます。使用していないイベント・オブジェクトを保持し続けると、不必要にメモリーが消費されます。

    イベント・オブジェクトの解放には、clReleaseEvent関数を呼び出します。

    複数のFPGAのプログラムをメモリーにロードすることができます。ホストはそれらを使用し、必要に応じてFPGAを再プログラムします。

OpenCLホストランタイムのAPI呼び出しに関しては、OpenCL Specification version 1.0を参照ください。