That is exactly the utilization you want to see when hyperthreading is enabled. That means that it is using every single one of your cores to the max.With Hyperthreading every core can contain the state for two threads, and when one of the threads needs to wait for IO, the other thread can run. So it is something that exists purely to improve the utilization of your cores in situations where IO happens.
With math heavy code, there is little to no IO, and that means that using more threads than you have actual cores, will result in context switching and will at best do nothing, and at worst reduce your performance and slow down your code.
Set the environment variable
OMP_NUM_THREADS to the number of threads your system supports, and if your calculations are big enough, it will use more resources.
In the example I used for it it went from 55% utilization to 70% utilization, and after I increased the model size it even went to 100% utilization.
At the small size, I lost about 10% performance from doing that, and at the large size it was about equal, but the CPU still used 20W more power.
Maybe for your example it will be different If all you want to do is get 100% utilization in your task manager, then you just need to set that environment variable.