News for hackers. Stuff that matters.
Re:Apple Silicon M1: Black Magic Fuckery by uncomputation on Tuesday November 24, 2020 @07:13PM (#25204559)
Someone please correct me for the sake of all of us if I’m wrong, but it sounds like Apple is using specialized hardware for “NSObject” retain-and-release operations, which may bypass/reduce the impact on general RAM.
Re:Apple Silicon M1: Black Magic Fuckery by xenadu02 on Wednesday November 25, 2020 @04:52AM (#25207536)
On recent Apple Silicon CPUs uncontended most atomic operations are essentially free - almost identical in speed to the non-atomic version of the same operation. Reference counting must be atomic safe whether using ARC or MRR. On x86 systems those atomic operations impose a performance cost. On Apple Silicon they do not. It does not change how much memory is used but it does mean you can stop worrying about the cost of atomic operations. It has nothing to do with the ARMv8 instruction set, it has to do with how the underlying hardware implements those operations and coordinates among cores.

Separately from that x86's TSO-ish memory model also imposes a performance cost whether your algorithm needs those guarantees or not. Code sometimes relies on those guarantees without knowing it. Absent hardware support you would need to insert ARM atomics in translated code to preserve those guarantees which on most ARM CPUs would impose a lot of overhead. The M1 allows Rosetta to put the CPU into a memory ordering mode that preserves the expected memory model very efficiently (as well as using 4K page size for translated processes).

Re:Apple Silicon M1: Black Magic Fuckery by kllrnohj on Wednesday November 25, 2020 @11:13AM (#25210742)
> On recent Apple Silicon CPUs uncontended most atomic operations are essentially free - almost identical in speed to the non-atomic version of the same operation.

They are fast for atomics but still far, far slower than the equivalent non-atomic operation. An add operation takes around half a cycle (upper bound here - with how wide the firestorm core is an add operation is almost certainly less than half a cycle). At 1ghz a cycle is 1 nanosecond. The M1 runs at around 3ghz. So you're still talking the atomic operation being >10x slower than non-atomics.

Which should not be surprising at all. Apple didn't somehow invent literal magic here. They still need coherency across 8 cores, which means at a minimum L1 is bypassed for the atomic operation. The L2 latency is very impressive, contributing substantially to that atomic operation performance. But it's still coming at a very significant cost. It's very, very far from free. There's also no ARM vs. x86 difference here, since the atomic necessarily forces a specific memory ordering guarantee that's stricter than x86's default. Both ISAs are forced to do the same thing and pay the same costs.

Re:Apple Silicon M1: Black Magic Fuckery by saagarjha on Wednesday November 25, 2020 @09:41PM (#25216380)
> So you're still talking the atomic operation being >10x slower than non-atomics.

How did you arrive at this number?

Re:Apple Silicon M1: Black Magic Fuckery by kllrnohj on Thursday November 26, 2020 @12:50PM (#25222108)
> How did you arrive at this number?

It's in the post. Half a cycle for an add or less, and cycles are every 1/3 nanosecond. So upper bound for an add would be around 1/6th a nanosecond. Likely less than that still yet, since the M1 is probably closer to an add in 1/8th a cycle not 1/2. Skylake by comparison is at around 1/4th a cycle for an add, and since M1's IPC is higher it's not going to be worse at basic ALU ops.

6 nanoseconds @ 3ghz is 18 cycles. That's on the slow end of the spectrum for a CPU instruction.

Re:Apple Silicon M1: Black Magic Fuckery by saagarjha on Friday November 27, 2020 @01:57AM (#25226152)
Where? 6 nanoseconds is pretty long, that’s about how long it’d take to do an entire retain/release pair, which is a couple dozen instructions I believe.
Re:Apple Silicon M1: Black Magic Fuckery by torstenvl on Tuesday November 24, 2020 @07:46PM (#25204754)
I don't think that's quite right. Apple believes strongly in retain-and-release / ARC. It has designed its software that way; it has designed its M1 memory architecture that way. The harmony between those design considerations leads to efficiency: the software does things in the best way possible, given the memory architecture.

I'm not an EE expert and I haven't torn apart an M1, but Occams's Razor would suggest it's unlikely they made specialized hardware for NSObjects specifically. Other ARC systems on the same hardware would likely see similar benefits.

Re:Apple Silicon M1: Black Magic Fuckery by dfox on Tuesday November 24, 2020 @09:34PM (#25205394)
I suspect that Apple didn't anything special to improve performance of reference counting apart from not using x86. Simply put x86 ISA and memory model is built on assumption that atomic operations are mostly used as part of some kind of higher-level synchronization primitive and not for their direct result.
Re:Apple Silicon M1: Black Magic Fuckery by lilyball on Wednesday November 25, 2020 @01:10AM (#25206416)
M1 is faster at retain/release under Rosetta2 than x86, and yet Rosetta2 still has the same strong memory model that x86 does.
Re:Apple Silicon M1: Black Magic Fuckery by dfox on Wednesday November 25, 2020 @06:10AM (#25208019)
One thing is that M1 has incredible memory BW and is implemented on single piece of silicon (which certainly helps with low-overhead cache consistency). Another thing is that rosetta certainly does not have to preserve exact behavior of x86 (and in fact it cannot because doing so will negate any benefits of dynamic translation) it only has to care about what can be observed by the user code running under it.
Re:Apple Silicon M1: Black Magic Fuckery by saagarjha on Tuesday November 24, 2020 @09:24PM (#25205334)
The hardware makes uncontended atomics very fast, and Objective-C is a heavy user of those. But it would really help any application that could use them, too.
Re:Apple Silicon M1: Black Magic Fuckery by thu2111 on Wednesday November 25, 2020 @11:34AM (#25211016)
But GCd languages don't need to hit atomic ops constantly in the way ref-counted Objective C does, so making them faster (though still not as fast as regular non-atomic ops) is only reducing the perf bleeding from the decision to use RC in the first place. Indeed GC is generally your best choice for anything where performance matters a lot and RAM isn't super tight, like on servers.

Kotlin/Native lets us do this comparison somewhat directly. The current and initial versions used reference counting for memory management. K/N binaries were far, far slower than the equivalent Kotlin programs running on the JVM and the developer had to deal with the hassle of RC (e.g. manually breaking cycles). They're now switching to GC.

The notion that GC is less memory efficient than RC is also a canard. In both schemes your objects have a mark word of overhead. What does happen though, is GC lets you delay the work to deallocate from memory until you really need it. A lot of people find this quite confusing. They run an app on a machine with plenty of free RAM, and observe that it uses way more memory than it "should" be using. So they assume the language or runtime is really inefficient, when in reality what's happened is that the runtime either didn't collect at all, or it collected but didn't bother giving the RAM back to the OS on the assumption it's going to need it again soon and hey, the OS doesn't seem to be under memory pressure.

These days on the JVM you can fix that by using the latest versions. The runtime will collect and release when the app is idle.

Re:Apple Silicon M1: Black Magic Fuckery by nemothekid on Tuesday November 24, 2020 @07:39PM (#25204712)
I saw that point brought up on Twitter and I don't know how it it makes more efficient use of RAM.

Specifically, as I understood it is that Apple software (written in objective C/Swift) uses a lot of retain/release (or Atomic Reference Counting) on top of manual memory, for memory management rather than other forms of garbage collection (such as those found in Java/C#), which gives Objective C programs a lower memory overhead (supposedly). This is why the iPhone ecosystem is able to run so much more snappier than the Android ecosystem.

That said, I don't see how that translates to lower memory usage than x86 programs. I think the supporting quotes he used for that point are completely orthogonal. I don't have an M1 mac, but I believe the same program running on both machines should use the same amount of memory.

Re:Apple Silicon M1: Black Magic Fuckery by sgerenser on Wednesday November 25, 2020 @12:24AM (#25206247)
The only thing I can think of that would actually reduce memory usage on M1 vs the same version of MacOS on x86 would be if they were able to tune their compressed memory feature to run faster (with higher compression ratio) on the M1. That would serve to reduce effective memory usage or need to fall back to swap. I would not expect something like that to be responsible for more than, say, a 5-10% RAM usage decrease though.
Re:Apple Silicon M1: Black Magic Fuckery by danieldk on Wednesday November 25, 2020 @01:54AM (#25206590)
That would serve to reduce effective memory usage or need to fall back to swap. I would not expect something like that to be responsible for more than, say, a 5-10% RAM usage decrease though.

I think you can reach a lot more than that. Presumably, on Intel they use something like LZO or LZ4, since it compresses/decompresses without too much CPU overhead. But if you have dedicated hardware for something like e.g. Brotli or zstd, one could reach much higher compression ratios.

Of course, this is assuming that memory can be compressed well, but I think this is true in many cases. E.g. when selecting one of the program/library files in the squash benchmarks:

https://quixdb.github.io/squash-benchmark/

you can observe higher compression ratios for e.g. Brotli/gzip/deflate than LZO/LZ4.

Re:Apple Silicon M1: Black Magic Fuckery by sgerenser on Wednesday November 25, 2020 @07:35AM (#25208542)
I suspect Apple is using their own LZFSE[0] compression, perhaps now with special tweaks for M1. The reason I only suspected a 5-10% increase though is even if it’s able to achieve a massive increase in compression ratio (compressing 3GB to 1GB instead of 2GB, say), that’s still only saving 1GB total. Which I guess isn’t nothing and is more than 10% on an 8GB machine.

[0] https://en.m.wikipedia.org/wiki/LZFSE

Re:Apple Silicon M1: Black Magic Fuckery by lern_too_spel on Tuesday November 24, 2020 @10:06PM (#25205588)
For a very long time, budget Android devices that were one or even two generations older were faster than just released iPhones at launching new apps to interactivity (see: hundreds of Youtube "speed comparison" videos). This was purely due to better software, as the iPhone had significantly faster processors and I/O. RAM doesn't play a big factor at launch. One very minor contributor would be that the GC doesn't need to kick in until later, while ARC is adding its overhead all the time.

Edit: apparently, this isn't common knowledge.

https://www.youtube.com/watch?v=emPiTZHdP88

https://youtu.be/hPhkPXVxISY

https://youtu.be/B5ZT9z9Bt4M

Re:Apple Silicon M1: Black Magic Fuckery by thu2111 on Wednesday November 25, 2020 @11:39AM (#25211085)
Ridiculous that you're downvoted. There are a lot of people posting here who haven't worked on memory management subsystems.

GC vs RC is not a trivial comparison to make, but overall there are good reasons new systems hardly use RC (Objective-C dating back to the 90s isn't new). Where RC can help is where you have a massive performance cliff on page access, i.e. if you're swapped to disk. Then GC is terrible because it'll try and page huge sections of the heap at once where as RC is way more minimal in what it touches.

But in most other scenarios GC will win a straight up fight with an RC based system, especially when multi-threading gets involved. RC programs just spend huge amounts of time atomically incrementing and decrementing things, and rummaging through the heap structures, whereas the GC app is flying along in the L1 cache and allocations are just incrementing a pointer in a register. The work of cleaning up is meanwhile punted to those spare cores you probably aren't using anyway (on desktop/mobile). It's tough to beat that by hand with RC, again, unless you start hitting swap.

If M1 is faster at memory ops than x86 it's because they massively increased memory bandwidth. In fact I'd go as far as saying the CPU design is probably not responsible for most of the performance increase users are seeing. Memory bandwidth is the bottleneck for a lot of desktop tasks. If M1 core is say 10% faster than x86 but you have more of them and memory bandwidth is really 3x-4x larger, and the core can keep far more memory ops in flight simultaneously, that'll explain the difference all by itself.

Re:Apple Silicon M1: Black Magic Fuckery by lern_too_spel on Wednesday November 25, 2020 @01:12PM (#25212278)
Indeed, one of the articles cited by the article that this discussion is about (https://blog.metaobject.com/2020/11/m1-memory-and-performanc...) links to a paper saying that GC needs 4x the memory to match manual memory management and then makes a huge wacky leap to say that ARC could achieve that with less. It can't. ARC will always be slower than manual memory management because it behaves the same way as naive manual memory management with some overhead on top.

On the other hand, that same paper shows that for every single one of their tested workloads, the generational GC outperforms manual memory management. Now obviously, you could do better with manual memory management if you took the time to understand the memory usage of your application to reduce fragmentation and to free entire arenas at a time, but for applications that don't have the developer resources to apply to that (the vast majority), the GC will win.

I'm not saying that better memory management is the reason Android wins these launch to interactivity benchmarks because the difference is so stark relative to the hardware performance that memory management isn't nearly enough to explain it, but it does contribute to it. (My own guess is that most of the performance difference comes from smarter process initialization from usage data. Apple is notoriously bad at using data for optimization.)

Re:Apple Silicon M1: Black Magic Fuckery by donarb on Wednesday November 25, 2020 @12:03PM (#25211407)
ARC stands for Automatic Reference Counting.

https://en.wikipedia.org/wiki/Automatic_Reference_Counting

Re:Apple Silicon M1: Black Magic Fuckery by ianai on Tuesday November 24, 2020 @09:07PM (#25205223)
Tfa says the hardware optimization for ARC is to the point of being bespoken. Hardware will always beat software optimization. Further, the other GCs have much higher ram overheads than this combined, bespoke system.

Apple has decades of proven experience producing and shipping massively over engineered systems. I believe em when they say these processors do ARC natively.

Re:Apple Silicon M1: Black Magic Fuckery by nemothekid on Tuesday November 24, 2020 @10:08PM (#25205607)
I’m not denying that Apple has better ARC performance. It’s that I don’t understand how an application would use less memory on ARM than x86. I’d expect the ARM code to run faster (as a result of being able to do atomic operations faster), but I don’t see how that translates to less memory usage
Re:Apple Silicon M1: Black Magic Fuckery by AnonC on Tuesday November 24, 2020 @11:52PM (#25206150)
In one of those random “benchmark tests” online where someone opened several applications on an M1 Mac with 8GB RAM and did some work on those, they kept Activity Monitor open alongside and pointed to the increase in swap at some stage. So it seems like the swap is fast enough and is used more aggressively. That reduces the amount of RAM used at any point in time. The data in RAM has also benefited from compression in macOS for several years now.
Re:Apple Silicon M1: Black Magic Fuckery by ianai on Tuesday November 24, 2020 @10:20PM (#25205688)
Read up on the performance overhead of GC across other languages. They’re messy and can lock up periodically. They take up significant ram and resources.
Re:Apple Silicon M1: Black Magic Fuckery by wmf on Tuesday November 24, 2020 @10:34PM (#25205780)
We're talking about non-GC apps on x86 vs. the same non-GC apps on Arm.
Re:Apple Silicon M1: Black Magic Fuckery by ianai on Wednesday November 25, 2020 @05:55AM (#25207921)
Even those still do memory management-and usually poorly.
Re:Apple Silicon M1: Black Magic Fuckery by gameswithgo on Tuesday November 24, 2020 @07:36PM (#25204689)
it makes objective c and swift memory management faster but it doesn’t reduce ram usage at all. (maybe a weee bit less bandwidth used)
Re:Apple Silicon M1: Black Magic Fuckery by rimliu on Wednesday November 25, 2020 @02:50AM (#25206861)
If memory is released as soon as possible instead of waiting for the next GC cycle, does not it make it more efficient?
Re:Apple Silicon M1: Black Magic Fuckery by tokamak-teapot on Wednesday November 25, 2020 @04:41AM (#25207468)
Yes!

Hopefully I can clear up the discussion a little:

Q: Does reference counting 'use' less RAM than GC?

A: Yes (caveats etc. go here, but your question is a good explanation)

Q: Does the M1 in and of itself require less RAM than x86 processors?

A: No

Q: So why are people talking about the M1 and its RAM usage as if it's better than with x86?

A: It's really just around the faster reference counting. MacOS was already pretty efficient with RAM.

I'd like to propose tokamak-teapot's formula for hardware purchase:

Minimum RAM believed to be required = actual amount of RAM required * 2

N.B. I am aware that a sum that's greater than 16GB doesn't magically become less than 16GB, but it is somewhat surprising how well MacOS performs when it feels like RAM should be tight, so I'd suggest borrowing a Mac or making a Hackintosh to experience this if you're anxious about hitting the ceiling.

Re:Apple Silicon M1: Black Magic Fuckery by masklinn on Wednesday November 25, 2020 @03:17AM (#25207007)
There is no “next GC cycle”, objc and swift use ref counting on every platform (there was an abortive GC attempt on desktops a few years back but it never saw wide use and has been deprecated since mountain lion).
Re:Apple Silicon M1: Black Magic Fuckery by gameswithgo on Wednesday November 25, 2020 @07:33AM (#25208529)
these are not gc apps, they are reference counted.
Re:Apple Silicon M1: Black Magic Fuckery by wmf on Tuesday November 24, 2020 @07:53PM (#25204808)
It's ARMv8.x atomic instructions.
Re:Apple Silicon M1: Black Magic Fuckery by jolux on Tuesday November 24, 2020 @07:40PM (#25204724)
Their hardware is almost certainly specialized for reference counting, but I would be surprised if they had a custom instruction or anything.