イベントイベントはコマンドの実行順序を整理する場合に使うことができます。
つまり一つのコマンドキューにコマンドが挿入されて、挿入順序で実行する場合は不要となります。
イベントオブジェクトが必要となる場面は、複数のコマンドが並行に実行して、パフォーマンスを向上させたい時です。
挿入したコマンドの実行ステータスはどの時点においても次の一つとなります。
ユーザーイベントを除くイベントオブジェクトの生成は複数の方法があります。例えば
等のコマンドは、コマンドキューにコマンドが挿入された時点でイベントオブジェクトを生成します。
clCreateUserEvent関数はユーザイベントオブジェクトを生成。ユーザイベントはコマンドがデバイスに実行される前に、アプリケーションがユーザーイベントを終了するまで待機するコマンドを挿入させることを可能とする。
詳しくは「表:clCreateUserEvent」(表B.93「表:clCreateUserEvent」)を参照ください。
clCreateUserEventはユーザーイベントを生成したい場合に使います。ユーザーイベントはコマンドが生成するイベントオブジェクトと同じもので、唯一異なる点は明示的にホスト内で生成したことです。
cl_event org.jocl.CL.clCreateUserEvent( //(1) cl_context context, //(2) int[] errcode_ret) //(3)
生成したオブジェクトの実行ステータスは、CL_SUBMITTEDに初期化されます。
clSetUserEventStatus関数はユーザイベントオブジェクトの実行状態を設定します。
詳しくは「表:clSetUserEventStatus」(表B.94「表:clSetUserEventStatus」)を参照ください。
int org.jocl.CL.clSetUserEventStatus( cl_event event, //(1) int execution_status) //(2)
clCreateUserEventを使って生成したユーザイベントオブジェクトを指定。 | |
設定される新たな実行状態を指定。CL_COMPLETEまたは、負の整数値でエラーを示すことができる。 |
ユーザイベントオブジェクトと関連付けたメモリオブジェクトは以下のようにイベントステータスを完了してから解放してください。
evt = clCreateUserEvent(context, null); clSetUserEventStatus(evt, CL_COMPLETE); clReleaseMemObject(mem);
clWaitForEvents関数を呼び出すと、event_list内のイベントオブジェクトで識別されるコマンドのホストスレッドの完了を待機します。実行ステータスがCL_COMPLETEまたは負の値の場合、コマンドは完了とみなします。event_listで指定したイベントは同期点としても作用します。
詳しくは「表:clWaitForEvents」(表B.95「表:clWaitForEvents」)を参照ください。
int org.jocl.CL.clWaitForEvents( int num_events, //(1) cl_event[] event_list) //(2)
詳しくは「表:clGetEventInfo」(表B.96「表:clGetEventInfo」)と「表:cl_event_info」(表B.97「表:cl_event_info」)を参照ください。
int org.jocl.CL.clGetEventInfo( cl_event event, //(1) int param_name, //(2) long param_value_size, //(3) Pointer param_value, //(4) long[] param_value_size_ret) //(5)
詳しくは「表:clGetEventInfo」(表B.96「表:clGetEventInfo」)と「表:cl_event_info」(表B.97「表:cl_event_info」)を参照ください。
取得できる情報のうちcl_command_typeは特に有用なので頭の隅にでも覚えておくようにするとよいでしょう。eventに関連付けられたコマンドを特定することが可能となります。戻り値は以下のような値があります。
Copyright 2018-2019, by Masaki Komatsu