Rani Icons
Jun. 12th, 2025 08:15 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)





Snaggin is free. Credit is appreciated. Comments are loved.
Okay. So.
Admin: the LRP has a variety of in-game resources. One of the more valuable ones is mithril, which gets used for all sorts of things, like armour and weaponry and building works, particularly military ones.
This event we are seeing the launch of The Cow Stock Market. This inevitably was a topic of discussion over this evening's pizza: discussion of the designs of the I Promise To Pay The Bearer On Demand One (1) Cow slips! speculation over Cow Futures! debate over the impact on the gold mithril standard!
It'll be fiiiiiiiiiine, says A. It'll all be TOTALLY fine. You can absolutely build fortifications out of cows!
-- and at this point, for those of you who are abruptly cackling, I need to point out that A has not read Nona the Ninth.
I also need to point out that I am in a specific groupchat, specifically set up following the event where someone managed to get their hands on some copies of Nona a few days before official release and there was consequently significant in-field bartering for who got to be next in the queue to inhale them, that is named after. well. the cows. did you know that cows have best friends.
But A had no idea why I was abruptly losing it, and I decided that rather than attempt to explain I was in fact first of all going to Depart Our Table, find my Nona dealers, and relate unto them the story of The Thing A, All Unawares, Just Said.
The reaction was extremely gratifying.
Two things:
I keep (especially post-surgery, cotemporal with relearning how to walk) finding more small ways that how I've been doing my various physio exercises isn't quite right. This is a good thing! Isn't it fascinating to be learning more about embodiment and how my body works and how I can best deploy my various muscles!
Up until the hypermobility clinic, all the physio I was ever prescribed made me worse, not better.
It abruptly dawned on me, all at once, that the subtlety of the changes I'm making with adjusting how I'm shifting my weight around and so on and so forth? Are almost certainly not actually externally visible. Like, yes, people not understanding hypermobility and problems with it was also Definitely A Problem, but -- the part where I'm still, mm, not necessarily fixing things but certainly developing them, finding places where even with What The Hypermobility Clinic Told Me To Do I wasn't getting quite right... well, the hypermobility specialists clearly went "eh, good enough", and in terms of the effects on my ability to Things I think they were clearly demonstrably provable correct, but -- yeah, okay, sudden understanding of some of just how difficult it would have been to correct some of this stuff.
(I'm very sure that all my various epiphanies will turn out to be about things that still aren't quite right, that I can still refine further -- I'm having an extended phase of that with Pilates right now -- but this is a good thing, actually. It's really nice to have such clear evidence that I'm getting to know and understand myself better.)
After I found some issues with my benchmark which invalidated my previous results, I have substantially revised my previous blog entry. There are two main differences:
A proper baseline revealed that my amd64 numbers were nonsense because I wasn’t fencing enough, and after tearing my hair out and eventually fixing that I found that the bithack conversion is one or two cycles faster.
A newer compiler can radically improve the multiply conversion on arm64 so it’s the same speed as the bithack conversion; I've added some source and assembly snippets to the blog post to highlight how nice arm64 is compared to amd64 for this task.
Books on pre-order:
Books acquired in May:
Borrowed books read in May:
I continue to not read much (by my standards). I did not manage to read any of the physical books I had out of the library until they needed to be returned, and I've got several half-finished books in progress. (Oh, and in writing this I've realised I already have the Renée Ahdieh book in ebook, and haven't read it there either!)
[1] Pre-order
[2] Audiobook
[3] Physical book
[4] Crowdfunding
[5] Goodbye read
[6] Cambridgeshire Reads/Listens
[7] FaRoFeb / FaRoCation / Bookmas / HRBC
[8] Prime Reading / Kindle Unlimited
We still haven't met with Senior Management: it's now due tomorrow, in person. I'm gently trying not to panic.
There's still been no message of support to all members of staff and students from the University, and nothing at all from the department. Though I understand they're still in discussions in the background. This is frustrating.
The subject was raised at a recent All Staff meeting (in which people submit questions as text, and senior management attempt to answer them). We were given broad assurances that the university values and supports trans people, but nothing actually useful or genuinely supportive was said.
In the meantime a new EHRC chair is due to be appointed, and they're considering a person with a known anti-trans background. There's an Open Letter available to sign in protest, written by a very good friend and colleague: https://docs.google.com/forms/d/e/1FAIpQLSe_Y77t7CQqKjdGifNa0lE3HKjDAb1UoJdjuLAbInhIQsRMhw/viewform
I've also seen a good template if you want to write directly: https://docs.google.com/document/d/1865KMfu24JgmwnWmYXaVc3jlzj5uQFEq69hXMxKP6BU/edit?tab=t.0
And I wrote my own version:
9th June 2025
Dear Women’s and Equalities Select Committee and Joint Committee on Human Rights,
Cc: Pippa Heylings, as my MP
I am writing to express my grave concern about the proposed appointment of Dr Mary-Ann Stephenson as the Chair of the Equality and Human Rights Commission.
I won't include a string of references here, because I think you will have seen them all already, but I think it is imperative that the next person appointed as Head of the EHRC should not be seen to have a strong anti-trans background. Trans people are currently scared. Scared for their jobs, if they cannot access their workplace in safety and dignity. Scared of being assaulted if they go to the "wrong" toilet. Scared of being outed as trans in public if they try to follow the new guidelines.
And I am scared as a cis woman, a woman who is not trans, at what is happening in our country, and what this means for my friends and colleagues and for trans people in general. For intersex people, non-binary people, and any woman who might be mistaken for being trans. Other women need to feel safe too, but excluding trans people is not the way to do this.
The EHRC needs to stand up for the rights of everyone, and to be seen to do so. I sincerely hope you will take this into account.
Kind Regards,
Eleanor Blair
Great Shelford, Cambridge, CB22
I'm not even going to attempt to get into the member of the EHRC who was quoted as effectively saying that trans people have been misled about their rights under the Equality Act for the last 15 years, and there will now be a period of adjustment, but they should just get used to having fewer rights than they thought they did. The Guardian changed their headline and reporting three times as a result of her protesting about being misquoted, but that seems to have been the gist of it. Not mentioning that the "misleading" guidance came from the EHRC themselves, and was based on the previous understanding of the Equalities Act and entirely consistent with it. FFS
Reading. FINISHED:
STARTED:
Writing. First pass through indexing a cookbook on EYB!
Some Actual Notes re pain for The Book, including (and I am very proud of myself for this) actually writing down my questions alongside the bare "here's what it contained".
Watching. Murderbot S01E01. I am dubious but expecting to keep watching. If you encourage me I might say more when it is not past curfew.
Cooking. ... apparently I have not managed Much Of Note this week.
Eating. POTATOES at the ALLOTMENT courtesy of ALLOTMENT FRIENDS. Also finished my choi sum and had my first AMAZING broad beans and nibbled kohlrabi speculatively, all on Tuesday.
Today I have nibbled: a cherry; the first few redcurrants; a pod's worth of Kelvedon Wonder peas; half a tiny tomato.
Making & mending. Made some progress on A's left glove. Realised, belatedly, that I'd done the same thing with picking up stitches unevenly along the two sides of the palm. Ripped back most of the way to where I started from and Sulked. BUT HEY I've remembered the pattern and where I'd stowed all the bits for it!
Growing. See Eating for my biggest excitements. Sugar Magnolia (purple sugar-snap pea) now setting pods; my main intention with it this year (given that I planted a whole packet of seeds and have wound up with ...fewer plants than that) is just to get myself sorted with a significantly larger number of seeds for next year, but hey, maybe they'll all be super productive and I'll actually get to eat some too.
Stockings now at the plot to go onto the cherry tomorrow, hopefully.
Tomatoes planted out when tiny not doing so great (i.e. have mostly disappeared). Tomatoes planted out when larger Actually Flowering. Desperately need to stake the lot of them.
Tiny single solitary surviving oca has started to Go.
V grumpy about how poorly the squash I got started A While Ago have coped with getting put outside given that they are in biodegradable fibre pots so I'm not even disturbing their roots. Getting the rest of them in the ground AND THEN SOWING MORE very much also high on tomorrow's priority list. (And the beans, augh.)
Observing. Met a neighbour!
https://dotat.at/@/2025-06-08-floats.html
A couple of years ago I wrote about random floating point numbers. In that article I was mainly concerned about how neat the code is, and I didn't pay attention to its performance.
Recently, a comment from Oliver Hunt and a blog post from
Alisa Sireneva prompted me to wonder if I made an
unwarranted assumption. So I wrote a little benchmark, which you can
find in pcg-dxsm.git
.
(Note 2025-06-09: I've edited this post substantially after discovering some problems with the results.)
Briefly, there are two basic ways to convert a random integer to a floating point number between 0.0 and 1.0:
Use bit fiddling to construct an integer whose format matches a float between 1.0 and 2.0; this is the same span as the result but with a simpler exponent. Bitcast the integer to a float and subtract 1.0 to get the result.
Shift the integer down to the same range as the mantissa, convert to float, then multiply by a scaling factor that reduces it to the desired range. This produces one more bit of randomness than the bithacking conversion.
(There are other less basic ways.)
The double precision code for the two kinds of conversion is below. (Single precision is very similar so I'll leave it out.)
It's mostly as I expect, but there are a couple of ARM instructions that surprised me.
The bithack function looks like:
double bithack52(uint64_t u) {
u = ((uint64_t)(1023) << 52) | (u >> 12);
return(bitcast(double, u) - 1.0);
}
It translates fairly directly to amd64 like this:
bithack52:
shr rdi, 12
movabs rax, 0x3ff0000000000000
or rax, rdi
movq xmm0, rax
addsd xmm0, qword ptr [rip + .number]
ret
.number:
.quad 0xbff0000000000000
On arm64 the shift-and-or becomes one bfxil
instruction (which is a
kind of bitfield move), and the constant -1.0
is encoded more
briefly. Very neat!
bithack52:
mov x8, #0x3ff0000000000000
fmov d0, #-1.00000000
bfxil x8, x0, #12, #52
fmov d1, x8
fadd d0, d1, d0
ret
The shift-convert-multiply function looks like this:
double multiply53(uint64_t u) {
return ((double)(u >> 11) * 0x1.0p-53);
}
It translates directly to amd64 like this:
multiply53:
shr rdi, 11
cvtsi2sd xmm0, rdi
mulsd xmm0, qword ptr [rip + .number]
ret
.number:
.quad 0x3ca0000000000000
GCC and earlier versions of Clang produce the following arm64 code, which is similar though it requires more faff to get the constant into the right register.
multiply53:
lsr x8, x0, #11
mov x9, #0x3ca0000000000000
ucvtf d0, x8
fmov d1, x9
fmul d0, d0, d1
ret
Recent versions of Clang produce this astonishingly brief two instruction translation: apparently you can convert fixed-point to floating point in one instruction, which gives us the power of two scale factor for free!
multiply53:
lsr x8, x0, #11
ucvtf d0, x8, #53
ret
My benchmark has 2 x 2 x 2 tests:
bithacking vs multiplying
32 bit vs 64 bit
sequential integers vs random integers
I ran the benchmark on my Apple M1 Pro and my AMD Ryzen 7950X.
These functions are very small and work entirely in registers so it has been tricky to measure them properly.
To prevent the compiler from inlining and optimizing the benchmark loop to nothing, the functions are compiled in a separate translation unit from the test harness. This is not enough to get plausible measurements because the CPU overlaps successive iterations of the loop, so we also use fence instructions.
On arm64, a single ISB (instruction stream barrier) in the loop is enough to get reasonable measurements.
I have not found an equivalent of ISB on amd64, so I'm using MFENCE. It isn't effective unless I pass the argument and return values via pointers (because it's a memory fence) and place MFENCE instructions just before reading the argument and just after writing the result.
In the table below, the leftmost column is the number of random bits; "old" is arm64 with older clang, "arm" is newer clang, "amd" is gcc.
The first line is a baseline do-nothing function, showing the overheads of the benchmark loop, function call, load argument, store return, and fences.
The upper half measures sequential numbers, the bottom half is random numbers. The times are nanoseconds per operation.
old arm amd
00 21.44 21.41 21.42
23 24.28 24.31 22.19
24 25.24 24.31 22.94
52 24.31 24.28 21.98
53 25.32 24.35 22.25
23 25.59 25.56 22.86
24 26.55 25.55 23.03
52 27.83 27.81 23.93
53 28.57 27.84 25.01
The times vary a little from run to run but the difference in speed of the various loops is reasonably consistent.
The numbers on arm64 are reasonably plausible. The most notable thing is that the "old" multiply conversion is about 3 or 4 clock cycles slower, but with a newer compiler that can eliminate the multiply, it's the same speed as the bithacking conversion.
On amd64 the multiply conversion is about 1 or 2 clock cycles slower than the bithacking conversion.
The folklore says that bithacking floats is faster than normal integer to float conversion, and my results generally agree with that, apart from on arm64 with a good compiler. It would be interesting to compare other CPUs to get a better idea of when the folklore is right or wrong -- or if any CPUs perform the other way round!
I'm playing an ice hockey game tonight in Cambridge, a charity fundraiser between Warbirds and Tri-Base Lightning. But until then I have a strangely unscheduled day. I might sleep or read or something.
I could post about what I've been up to lately!
Work:
Hockey:
Other:
Coming up: my summer is full of ice hockey camps and tournaments (Prague, Hull, Sheffield, Biarritz) and my old club Streatham have just announced all their summer training sessions will be "Summer Skills Camps" open to all interested WNIHL players, so I'm looking at going to London regularly again in July and August.