To be clear, for every machine type, we are offering a HT per virtual CPU. So that means that an n1-standard-8 instance gets 4 physical cores and 8 hyperthreads. (We are also offering 3.75GB of RAM and ~440G of ephemeral disk per vCPU).
So I would say:
n1-standard-1: 1/2 physical core
n1-standard-2: 1 physical core
...
n1-standard-8: 4 physical cores
This stuff is very confusing and I'd love to find the right way to communicate it clearly.
In the ideal world for a set of cores C if I run a piece of independent, memory bound, code on all of them I get O(C) scale. Generally that doesn't hold in shared L2/L3 cores or where HyperThreads are counted as cores.
We can define a scaling factor Cf such that 0 < Cf < 1.0 independent code scales at O(Cf).
In one school you could price out at cores such that 1/Cf physical cores were assigned per Core purchased (rounded up to the nearest unit of computation) but that doesn't begin to get into the question of shared memory vs shared network vs shared disk.
I think the best you can do for now is call it a core if Cf is > .95.