Not all parts of ATK are threaded, so the CPU utilization will change a lot during the run, depending on the task. For instance, a large matrix diagonalization will for sure run on 100% CPU.
Also note that hyperthreading may fool the normalization of the CPU usage, so even if a process is utilizing all of the CPU, it may be reported as 50% only.
If you want to experiment with hyperthreading, you can run ATK as
MLK_DYNAMIC=FALSE MKL_NUM_THREADS=4 atkpython script.py
where 4 is the number of threads to use.
The syntax I used is for Linux or Cygwin. You can set these variables in the Control Panel on Windows, then they also apply to the processes run in the Job Manager (after you restart VNL). Or you can set them just for one job, in the terminal window, using
set MKL_DYNAMIC=FALSE
set MKL_NUM_THREADS=4
atkpython script.py