87 karma · joined August 26, 2022
The idea of having a strong templating engine with a fast storage backend able to use dynamic content to deliver efficiently renderes websites with minimal hardware.
"You write that it would be more useful to re-post something else" -- Is your critique just that you didnt like the quality of what I wrote? or is there something more tangable?
I had a look at the assembly generated, both in your repo, and from https://godbolt.org/z/76K1eacsG
if you look at the assembly generated:
vmovups ymm3, ymmword ptr [rdi + 4*rcx]
vmovups ymm4, ymmword ptr [rsi + 4*rcx]
add rcx, 8
vfmadd231ps ymm2, ymm3, ymm4
vfmadd231ps ymm1, ymm3, ymm3
vfmadd231ps ymm0, ymm4, ymm4
cmp rcx, rax
jb .LBB0_10
jmp .LBB0_2
you are only using 5 of the sse2 registers(ymm0 -- ymm4) before creating a dependency on one of the (ymm0 -- ymm2) being used for the results.I Wonder if widening your step size to contain more than one 256bit register might get you the speed up. Something like this (https://godbolt.org/z/GKExaoqcf) to get more of the sse2 registers in your CPU doing working.
vmovups ymm6, ymmword ptr [rdi + 4*rcx]
vmovups ymm8, ymmword ptr [rsi + 4*rcx]
vmovups ymm7, ymmword ptr [rdi + 4*rcx + 32]
vmovups ymm9, ymmword ptr [rsi + 4*rcx + 32]
add rcx, 16
vfmadd231ps ymm5, ymm6, ymm8
vfmadd231ps ymm4, ymm7, ymm9
vfmadd231ps ymm3, ymm6, ymm6
vfmadd231ps ymm2, ymm7, ymm7
vfmadd231ps ymm1, ymm8, ymm8
vfmadd231ps ymm0, ymm9, ymm9
cmp rcx, rax
jb .LBB0_10
jmp .LBB0_2
which ends up using 10 of the registers, allowing for 6 fused multiplies, rather than 3, before creating a dependency on a previous result -- you might be able to create a longer list.Again -- This was a really interesting writeup :)
Is that true on the note of "optimizing for developer time"? Do people actually have an understanding of the tradeoff they are making? Do the teams building applications in Java actually know what it would take to do them in C, and choose that the tradeoff is too big? Does the Typescript backend developer know what it would take to do the same in C++ and decide against it?
Or are they mainly working out of a preconceived bias that their favorite language is best and that everything else is worse?
For the 5 µs, I recall a currency conversion system(tin-cup) with in-memory currency rates whose only job was to convert incoming requests to USD. Ignoring the fact that this should never have been an independent system. This seems like a perfect use case for working in a highly optimized environment. ;)
Questions like: "Does using Typescript for your backend make you, the programmer, faster/more efficient?" "Do I need a full-blown ORM framework to interact with my database?" "Do I need a runtime with lightweight threads?"
I also have started developing a headache every time someone claims that they are optimizing for developer productivity but cannot articulate the tradeoff they are making.
If you use technologies that cause you to use 20x the hardware, you will need to run complicated DevOps, or whatever we call it, very early.
I have companies with ten concurrent users using Terraform to spin up their microservices in multiple regions on beefy machines. With mental/developer overhead of dealing with the complexity of large distributed systems, YEARS before their company needs the complexity. You are not optimizing for developer productivity; you are just doing random stuff, and claiming that its best practice.
"x * y is translated to CPU instructions (x >> 1) * (y - 1) + 1" namely that it now at least 3 extra highlevel operations to do simple multiplication.
As a side note it took me a second to realize that the multiplication being done is not actually xx, but rather (x (x<<1))
In other news, did you notice that Ampere's CEO, Renee J James is on the board of Oracle?