The definition of the utilization rates is given in the nvml documentation, p90:
8.12 nvmlUtilization_t Struct Reference
#include <nvml.h>
Data Fields
• unsigned int gpu
Percent of time over the past second during which one or more kernels was executing on the GPU.
• unsigned int memory
Percent of time over the past second during which global (device) memory was being read or written.
The utilization rates for a given workload will likely vary if you change the application clocks (I assume that is what you mean by frequency
).
For example, if the GPU core clock runs faster, then the processing of the workload may be changed, and it may take less time to complete the workload.