Understanding the definition of SPMD
You are taking these definitions too literally (as if they were mathematical definitions that could be used in a proof.)  These terms all come from the &quot;heroic&quot; age of computer architecture when people were designing by the &quot;seat of their pants&quot; and kind of just getting a feel for what works and what doesn't.  Treat them more like terms for writing poetry than mathematics.

a. SPMD might refer to either multiple threads sharing an address space or multiple processes with independent address spaces sharing only through message passing or through the file system.
b. Typically with SPMD in an environment with separate processes each process would be loaded from the same executable file.

Each thread (or process) in a SPMD machine has its own instruction pointer (indicating what instruction should be executed next).  Each thread in a SPMD program updates its instruction pointer independently.  So the threads in a SPMD program execute simultaneously, but they are executing different instructions and there is no required correlation between the instructions those threads are executing.
In a SIMD program there is only one instruction pointer.  On every time step every execution unit is executing the same instruction simultaneously.  (The term NVidia uses for SIMD execution unit is &quot;core&quot;, the term most other people use is &quot;vector lane.&quot;)

a. SMP is not part of Flynn's taxonomy.  Flynn's taxonomy is SISD, SIMD, MISD, MIMD.  That's it.  &quot;SPMD&quot; is something that someone made up after the fact but is the same thing as MIMD (as pointed out by the Hennessy and Patterson quote you include.)  &quot;SMP&quot; is part of a completely different poem.  It might be best to think of SMP as a particular way of implementing SPMD computers.  SMP typically stands for &quot;Symmetric Multiprocessor&quot; not &quot;Symmetric Multiprocessing&quot;.
b. Multithreading by OpenMP or Pthreads on multiple processors is SPMD (because you are running multiple independent threads on the same program executable.)  You might use a SMP to execute your SPMD OpenMP or Pthreads program, or you might use some other implementation of SPMD.