An image to complement what Stephen said, modified from https://commons.wikimedia.org/wiki/File:Supermicro_dual_opteron_server_board_IMGP7335_wp.jpg[], your machine likely looks something like:

If you squint you can see "CPU1" and "CPU2" marked on the motherboard near each socket. We can also see the little lever used to hold each CPU in place, as demonstrated e.g. on this video: https://www.youtube.com/watch?v=Ng5D9T__4Jc
Dual socket motherboards are a very popular server motherboard architecture.
On the image we can also see 8 slots marked P1-DIMM1A, P1-DIMM1B, P1-DIMM2A, P1-DIMM2B, and similar for P2-*. DIMM is a generic name for this RAM memory form factor so we understand that these are memory slots, and presumably P1 and P2 mean "processor 1" and "processor 2", so these likely make up the two NUMA nodes lscpu
would be talking about.
And now for the grand finale, some ASCII art:
+--------------------------+ +--------------------------+
| Socket 1 | | Socket 2 |
| | | |
| +----------------------+ | | +----------------------+ |
| | Core 0 | | | | Core 0 | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 0 (cpu0) | | | | | | Thread 0 (cpu15) | | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 1 (cpu1) | | | | | | Thread 1 (cpu16) | | |
| | +------------------+ | | | | +------------------+ | |
| +----------------------+ | | +----------------------+ |
| | | |
| +----------------------+ | | +----------------------+ |
| | Core 1 | | | | Core 1 | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 0 (cpu2) | | | | | | Thread 0 (cpu17) | | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 1 (cpu3) | | | | | | Thread 1 (cpu18) | | |
| | +------------------+ | | | | +------------------+ | |
| +----------------------+ | | +----------------------+ |
| | | |
| | | |
.... more cores ..... .... more cores .....
| | | |
| +----------------------+ | | +----------------------+ |
| | Core 6 | | | | Core 6 | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 0 (cpu12) | | | | | | Thread 0 (cpu26) | | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 1 (cpu13) | | | | | | Thread 1 (cpu27) | | |
| | +------------------+ | | | | +------------------+ | |
| +----------------------+ | | +----------------------+ |
| | | |
| +----------------------+ | | +----------------------+ |
| | Core 7 | | | | Core 7 | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 0 (cpu28) | | | | | | Thread 0 (cpu42) | | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 1 (cpu29) | | | | | | Thread 1 (cpu43) | | |
| | +------------------+ | | | | +------------------+ | |
| +----------------------+ | | +----------------------+ |
| | | |
.... more cores ..... .... more cores .....
| | | |
| +----------------------+ | | +----------------------+ |
| | Core 14 | | | | Core 14 | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 0 (cpu40) | | | | | | Thread 0 (cpu54) | | |
| | +------------------+ | | | | +------------------+ | |
| | | Thread 1 (cpu41) | | | | | | Thread 1 (cpu55) | | |
| | +------------------+ | | | | +------------------+ | |
| +----------------------+ | | +----------------------+ |
| | | |
+--------------------------+ +--------------------------+
where we can see how the logical core numbers (cpu0 - cpu55) might have been across each hyperthread of each core. It's a bit confusing that he Linux kernel calls them "CPUs" when they are just hyperthreads and not the actual chip. But it's also understandable why.
Related "hyperthreads vs cores" answer: So what are logical cpu cores (as opposed to physical cpu cores)?
“Thread(s) per core” × “Core(s) per socket” × “Socket(s)”. equals to the number of On-line CPU(s) list,
not CPU(s) line? – wjrforcyber Jan 26 '24 at 02:26