javaopenclgpujocl

time measurement execution and allocation in gpu


I am execution a parallel kernel on GPU using OpenCL and JOCL.

I want to know:

1/ Is there any functions to know the kernel size in term of work-items and work groups and how it is executed in my Nvidia GPU platform?

2/ is there a possibility to know the execution time of the kernel without GPU/CPU data transfers because? I used java tools System.currentTimeMillis(); before starting the kernel and after but it includes the data transfers time.

3/ more precisely is there any possibility to know the execution time of each GPU core?


Solution

  • 1) In kernel,

    get_global_size(0) gives number of items in x dimension
    get_global_size(1) gives number of item arrays in y dimension
    get_global_size(2) gives number of item matrices in z dimension
    

    total number is multiplication of them but if kernel is launched only 1-dim then only first function is enough.

    get_local_size(0 or 1 or 2);
    

    gives same thing for items in groups, not total items.

    get_num_groups (0 or 1 or 2)
    

    is similar but gives number of groups in total groups.

    Number of dimensions are taken from

     int dims=get_work_dim ()
    

    2) Event based performance queries from host code:

    http://www.jocl.org/cloth/docs/doc-utils/org/jocl/utils/Events.html

    computeExecutionTimeMs(org.jocl.cl_event event) Compute the execution time for the given event, in milliseconds.

    1), 2) and 3) a profiler

    can show all except "each core"(but gives info of "Lanes" which may not map to same core at all times but you can see what a single thread was doing) part. https://developer.nvidia.com/nvidia-nsight-visual-studio-edition visuals and tables give enough information about bottlenecks and kernel hotspots