Well you could disable pinning and let the CPU use its own optimisation algorithm to roam the threads as it sees fit. It seems like a newer cpu so it might be better than trying to manually do it (or not in which case just change it back). To do this I would set threads back to 1 and cores to 44 then in each of the 44 lines regarding the cpu pin (cpuset) let them roam any of the 48 cores as they need to... so I will edit the first 4 (to show an example), but you can do all 44 lines.
placement='static'>44</vcpu> <cputune>
<vcpupin vcpu='0' cpuset='0-47'/>
<vcpupin vcpu='1' cpuset='0-47'/>
<vcpupin vcpu='2' cpuset='0-47'/>
<vcpupin vcpu='3' cpuset='0-47'/>
also each of the numbers can be sequential now for the vcpu, 0,1,2,3...43 (43 is 44 cpus as 0 counts as the first one) rather than out of order in your current config. I am thinking this might be faster as a maxed core in the vm is no longer constrained to a domain on the cpu where a possibility may arise where its HT partner is also maxed, which would hamper performance (possibly). Sorry in advance if this is wrong, but the red hat documentation suggests this scenario is possible and this could work around such an eventuality. Dont hate me if its wrong I havent tested it.
p