I profile a game on a powerful device such as Galaxy S8. I see
GPU utilization is 10 to 12%
GPU Clock shoots up to 89M either once every few seconds or few times per second. Rest is 0%
CPU utilization is 20 to 30%
And
EGL->FPS swings from 13 to 47 wildly.
GPU and CPU both seem not very busy so I can't conclude if CPU or GPU bound. Yet FPS varies a lot. How should I interpret this?
FPS on Snapdragon Profiler will give you an instantaneous measure of the projected FPS between frames which increases variance as it's not implicitly accumulated or averaged. I would recommend smoothing it out with a simple moving average located in the metric settings icon on the graph track.
Per-process CPU % utilization considers the utilization across all cores. If the device you are using has a 4 core Snapdragon processor then the ~25% CPU utilization mentioned above might mean that you are probably indeed maxing 1/4th of the available cores but there's still 3 cores theoretically available that can be used (the other ~75%). This is a common behavior for single threaded CPU bound applications. I recommend doing a 'Trace' capture with the 'CPU Scheduling' metric enabled to see how your threads are executing across the cores. If the assumption I made earlier about a single thread maxing one core is true, you should see your main thread potentially context switching between cores but always executing in one continous line and the rest of the cores might have 'empty' spaces were CPU's were idle.
Also in 'Trace' capture you can enable the per-process 'Rendering Stages' metric which will give you the time spent on the GPU by your application. If you see many big 'gaps' in the data that means the GPU was either doing something else(unlikely) or most likely idling, hence not GPU bound.