Part of the challenge is that Intel and AMD don't do you any favors.
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.
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.