

I’ve both lived in the UK and The Netherlands.
IMHO, it’s to do with how socially the UK is a very classist society were people worry a lot (insanely so compared with The Netherlands) not just about their place in the social ladder but about it being visible to others - the TV Sitcom Keeping Up Appearances is actually a pretty good illustration of this: even though it’s a comedy and thus exagerated in the forms the characters in it display such traits and act on them, the way of thinking of the characters is based on how people in Britain (especially England) tend to see their standing in society and the importance they give to projecting the “right” appearances (part of what makes that comedy funny is that it’s a satire of certain traits of British society: a lot of British comedy is even more funny once you’ve lived there for a while and start getting the in-jokes).
Then overlayed on this is the common take there on social climbing which is to spend far more time and effort trying to stop others below oneself in the social ladder from climbing than in climbing oneself. People like to look down on those seen as lower status, expect others to “know their place” and will actually put some effort into making sure those who don’t are punished for it.
This is, IMHO, why punishing the poor is so popular in Britain. It also anchors a lot of the anti-immigration feeling since there is no lower class in British Society than non-Britons.
As for other Anglo-Saxon countries, I don’t really know.
When two processing devices try and access the same memory there are contention problems as the memory cannot be accessed by two devices at the same time (well, sorta: parallel reads are fine, it’s when one side is writing that there can be problems), so one of the devices has to wait, so it’s slower than dedicated memory but the slowness is not constant since it depends on the memory access patterns of both devices.
There are ways to improve this: for example, if you have multiple channels on the same memory module then contention issues are reduced to the same memory block, which depends on the block-size, though this also means that parallel processing on the same device - i.e. multiple cores - cannot use the channels being used by a different device so it’s slower.
There are also additional problems with things like memory caches in the CPU and GPU - if an area of memory cached in one device is altered by a different device that has to be detected and the cache entry removed or marked as dirty. Again, this reduces performance versus situations where there aren’t multiple processing devices sharing memory.
In practice the performance impact is highly dependent on if an how the memory is partitioned between the devices, as well as by the amount of parallelism in both processing devices (this latter because of my point from above that memory modules have a limited number of memory channels so multiple parallel accesses to the same memory module from both devices can lead to stalls in cores of one or both devices since not enough channels are available for both).
As for the examples you gave, they’re not exactly great:
I don’t think that direct access by the CPU to manipulate GPU data is at all a good thing (by the reasons given on top) and to get proper performance out of a shared memory setup at the very least the programming must done in a special way that tries to reduce collisions in memory access, or the whole thing must be setup by the OS like it’s done on PCs with integrated graphics, were a part of the main memory is reserved for the GPU by the OS itself when it starts and the CPU won’t touch that memory after that.