It's a while since I used LSF, but IIRC, LSF works with more general concepts than "number of cores". Remember one LSF job queue might be starting jobs on several different computers with different hardware specifications, and also one LSF job might be running in parallel on several computers (not just several cores of one computer).
LSF has the concept of the number of "processors" that a each computer has, and the number of "processor slots" that each job requests. It's up to the humans who configure LSF how to map those onto the actual hardware available. For example the number of "processors" might be used as measure of different CPU speeds on different single-processor computers, not necessarily the number of physical cores.
IIRC LSF doesn't know anything about how a job uses multiprocessinig or multi-threading once it is running. If you want to control that (e.g. run four job streams with 4, 2, 1, 1 cores available on a single 8-core machine) either you have to trust your users not to abuse the system, or you write shell scripts to set the approporiate environment variables or whatever, to tell and/or enforce what resources a program can use when it runs. That still means trusting the software developers to do it right - and of course the users and developers may be the same people, in sone situations.