CS作业代写 This work is licensed under a Creative Commons Attribution-NonCommercial-

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License
Read Buffer dC
Computer Graphics
Execute Kernel

Copyright By PowCoder代写 加微信 powcoder

Write Buffer dB
Write Buffer dA
OpenCL Events
An event is an object that communicates the status of OpenCL commands
Whopp-a, whopp-a
mjb – , March 27, 2021
Computer Graphics
OpenCL Events

opencl.events.pptx
mjb – , March 27, 2021
From the OpenCL Notes:
11. Enqueue the Kernel Object for Execution
size_t globalWorkSize[ 3 ] = { NUM_ELEMENT, 1, 1 }; size_t localWorkSize[ 3 ] = { LOCAL_SIZE, 1, 1 } ;
status = clEnqueueNDRangeKernel( cmdQueue, kernel, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL );
event that will be thrown when this kernel is finished executing
status = clEnqueueNDRangeKernel( cmdQueue, kernel, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL );
Computer Graphics
# events to wait for before this event wait kernel is allowed to execute list
mjb – , March 27, 2021
Creating an Event
event that will be thrown when this kernel is finished executing
cl_event waitKernelA, waitKernel B, waitKernelC;
status = clEnqueueNDRangeKernel( cmdQueue, kernel, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, &waitKernelC );
Computer Graphics
event(s) to wait for before this kernel is allowed to execute
mjb – , March 27, 2021
Waiting for Events from Previously-Executed Kernels
cl_event waitKernelA, waitKernel B, waitKernelC; …
cl_event dependenciesAB[ 2 ]; dependenciesAB[ 0 ] = waitKernelA;
event that will be thrown when this kernel is finished executing
dependenciesAB[ 1 ] = waitKernelB;
status = clEnqueueNDRangeKernel( cmdQueue, kernelC, 1, NULL, globalWorkSize, localWorkSize, 2, dependenciesAB, NULL );
event(s) to wait for before this kernel is allowed to execute
mjb – , March 27, 2021
Computer Graphics
Creating an Execution Graph Structure
cl_event waitKernelA, waitKernel B, waitKernelC;
event that will be thrown when this
cl_event dependenciesAB[ 2 ]; kernel is finished executing
dependenciesAB[ 0 ] = waitKernelA; dependenciesAB[ 1 ] = waitKernelB;
status = clEnqueueNDRangeKernel( cmdQueue, kernelC, 1, NULL, globalWorkSize, localWorkSize, 2, dependenciesAB, &waitKernelC );
event(s) to wait for before this kernel is allowed to execute
Computer Graphics
mjb – , March 27, 2021

Creating the Full Execution Graph Structure
cl_event waitKernelA, waitKernel B, waitKernelC, waitKernelD;
cl_event dependenciesAB[ 2 ]; dependenciesAB[ 0 ] = waitKernelA; dependenciesAB[ 1 ] = waitKernelB;
cl_event dependenciesCD[2]; dependenciesCD[ 0 ] = waitKernelC; dependenciesCD[ 1 ] = waitKernelD;
status = clEnqueueNDRangeKernel( cmdQueue, kernelA, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, &waitKernelA );
status = clEnqueueNDRangeKernel( cmdQueue, kernelB, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, &waitKernelB );
status = clEnqueueNDRangeKernel( cmdQueue, kernelC, 1, NULL, globalWorkSize, localWorkSize, 2, dependenciesAB, &waitKernelC ); status = clEnqueueNDRangeKernel( cmdQueue, kernelD, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, &waitKernelD );
status = clEnqueueNDRangeKernel( cmdQueue, kernelE, 1, NULL, globalWorkSize, localWorkSize, 2, dependenciesCD, NULL );
Computer Graphics
mjb – , March 27, 2021
Waiting for One Event
cl_event waitKernelA, waitKernel B.
status = clEnqueueNDRangeKernel( cmdQueue, kernelC, 1, NULL, globalWorkSize, localWorkSize, 1, &waitKernelA, NULL );
Computer Graphics
event(s) to wait for
mjb – , March 27, 2021
Placing a Barrier in the Command Queue
status = clEnqueueBarrier( cmdQueue ); Note: this cannot throw its own event
This does not complete until all commands enqueued before it have completed.
Computer Graphics
mjb – , March 27, 2021
Placing an Event Marker in the Command Queue
Note: this can throw its own event
This does not complete until all commands enqueued before it have completed.
This is just like a barrier, but it can throw an event to be waited for.
Computer Graphics
cl_event waitMarker;
status = clEnqueueMarker( cmdQueue, &waitMarker );
mjb – , March 27, 2021
Waiting for Events Without Enqueuing Another Command
status = clWaitForEvents( 2, dependencies );
event(s) to wait for
This blocks until the specified events are thrown, so use it carefully!
Computer Graphics
mjb – , March 27, 2021
I Like Synchronizing Things This Way
// wait until all queued tasks have taken place:
Wait( cl_command_queue queue ) {
cl_event wait; cl_int status;
status = clEnqueueMarker( queue, &wait ); if( status != CL_SUCCESS )
fprintf( stderr, “Wait: clEnqueueMarker failed\n” );
status = clWaitForEvents( 1, &wait ); // blocks until everything is done! if( status != CL_SUCCESS )
fprintf( stderr, “Wait: clWaitForEvents failed\n” );
Call this before starting the timer, before ending the timer, and before retrieving data from an array computed in an OpenCL program.
Computer Graphics
mjb – , March 27, 2021

Getting Event Statuses Without Blocking
CL_EVENT_COMMAND_QUEUE CL_EVENT_CONTEXT CL_EVENT_COMMAND_TYPE CL_EVENT_COMMAND_EXECUTION_STATUS
Specify one of these
cl_int eventStatus;
status = clGetEventInfo( waitKernelC, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &eventStatus, NULL );
CL_EVENT_COMMAND_EXECUTION_STATUS returns one of these
CL_QUEUED CL_SUBMITTED CL_RUNNING CL_COMPLETE
Computer Graphics
cl_int is what type CL_EVENT_COMMAND_EXECUTION_STATUS returns
mjb – , March 27, 2021
Note that this a nice way to check on event statuses without blocking. Thus, you could put this in a loop and go get some other work done in between calls.

程序代写 CS代考 加微信: powcoder QQ: 1823890830 Email: powcoder@163.com