Interpret the output of lstopo
Here are the answers to your questions:
I'd view it as a graphical image rather than an ASCII image.
$ lstopo --output-format png -v --no-io > cpu.png
NOTE: You can view the generated file cpu.png
"PU P#" = Processing Unit Processor #. These are processing elements within the cores of the CPU. On my laptop (Intel i5) I have 2 cores that each have 2 processing elements, for a total of 4. But in actuality I have only 2 physical cores.
L#i = Instruction Cache, L#d = Data Cache. L1 = a Level 1 cache.
In the Intel architectures the instruction & data get mixed as you move down from L1 → L2 → L3.
"Socket P#" is that there are 2 physical sockets on the motherboard, there are 2 physically discrete CPUs in this setup.
In multiple CPU architectures the RAM is usually split so that a portion of it is assigned to each core. If CPU0 needs data from CPU1's RAM, then it needs to "request" this data through CPU1. There are a number of reasons why this is done, too many to elaborate here. Read up on NUMA style memory architectures if you're really curious.
The drawing is showing 4 cores (with 1 Processing Unit in each) that are in 2 physical CPU packages. Each physical CPU has "isolated" access to 16 GB of RAM.
No, there is no shared memory among all the CPUs. The 2 CPUs have to interact with the other's RAM through the CPU. Again see the NUMA Wikipage for more on the Non Uniform Memory Architecture.
Yes, the system has a total of 32 GB of RAM. But only 1/2 of the RAM is accessible by either physical CPU directly.
What's a socket?
A socket is the term used to describe the actual package that a CPU is contained inside of, for mounting on the motherboard. There are many different styles and configurations; check out the Wikipedia page on CPU Sockets.
This picture also kind of illustrates the relationships between the "cores", the CPUs, and the "sockets".