Hacker Newsnew | past | comments | ask | show | jobs | submit | ridiculous_fish's commentslogin

Oklo | Remote (US) or Santa Clara or Brooklyn | Full time | https://oklo.com

Join us in pioneering the next generation of nuclear reactors! You'll leverage your software skills alongside nuclear engineers to model, simulate, design, and deploy advanced fission power technology. You will work at the forefront of the nuclear industry, developing novel techniques to reach new levels of safety, efficiency, and resiliency. Come be a part of powering the future with advanced fission power plants to provide clean, reliable, affordable energy.

We are hiring for:

- Software Engineer: https://job-boards.greenhouse.io/oklo/jobs/4018702004

- Senior Software Engineer: https://job-boards.greenhouse.io/oklo/jobs/5739483004

- Software Engineer (Applied AI/ML): https://job-boards.greenhouse.io/oklo/jobs/6150355004

See more opportunities here: https://job-boards.greenhouse.io/oklo

Please mention Hacker News in your cover letter!


Just sent in an application (email siarasmall@proton.me). Super thrilled about the mission and engineering culture at Oklo and would love to chat!

_That_ Oklo? This is wild, god bless your work.


Just applied and forgot to mention Hacker News. Would be really excited to join, `makc [dot] anufriev [at] gmail.com`


Seconded - those RealTek dongles are no good.

For my Macs, the IOCrest USB4 adapters with the AQC113 chipset have been rock-solid and can saturate my 10Gbe network. They do run hot but no stability issues. That's what I use and recommend.

The newer RTL8159 based dongles are smaller, cheaper, cooler, and can do 10 Gbe on paper. But they top out at 7 Gbps on Macs, which don't implement the USBx2 spec.


But op said their RTL-8157, which is also RealTek, is good?


But only 5Gb not 10Gb


Oklo | Remote (US) or Santa Clara or Brooklyn | Full time | https://oklo.com

Join us in pioneering the next generation of nuclear reactors! You'll leverage your software skills alongside nuclear engineers to model, simulate, design, and deploy advanced fission power technology. You will work at the forefront of the nuclear industry, developing novel techniques to reach new levels of safety, efficiency, and resiliency. Come be a part of powering the future with advanced fission power plants to provide clean, reliable, affordable energy.

We are hiring for:

- Software Engineer: https://job-boards.greenhouse.io/oklo/jobs/4018702004

- Senior Software Engineer: https://job-boards.greenhouse.io/oklo/jobs/5739483004

See more opportunities here: https://job-boards.greenhouse.io/oklo

Please mention Hacker News in your cover letter!


Could you explain what "Oklo requires remote employees to travel to headquarters (Santa Clara, CA) twice a quarter annually" means? Does this mean 8x per year or twice per year?


Dang that's cool


I bought one of these as soon as I heard about it ($74 from eBay) and tested it against my USB-4 AQC113 mainstays ($87, IO CREST brand on Amazon), from my MBP.

The new RTL-based adapter is physically smaller, runs way cooler, but only gets ~6 Gbps from my Mac to my Linux box, with a lot of jitter (iperf3).

The AQC adapter is all metal, gets uncomfortably hot, and sustains 9.3 Gbps, no problem. It's about the same size as the middle adapter in the photo.

The USB-4 AQC adapters are only ~$13 more, and yet are significantly faster with lower jitter. I'm staying with those.

Hope that helps someone!


This paper missed the state of the art!!!

This concerns unsigned division by a 32 bit constant divisor. Compilers routinely optimize this to a high-multiply by a "magic number" but this number may be up to 33 bits (worst-case, divisor dependent, 7 is a problem child). So you may need a 32x33-bit high multiply.

What compilers do today is some bit tricks to perform a 32x33 bit high multiply through a 32x32 multiply and then handling the last bit specially, through additions and bitshifts. That's the "GM Method" in the paper; the juice to be squeezed out is the extra stuff to handle the 33rd bit.

What the paper observes is that 32x33 high multiply can be performed via a 64x64 high multiply and then the extra stuff goes away. Well yes, of course.

But amazingly in ALL of these worst case situations you can compute a different magic number, and perform a (saturating) increment of the dividend at runtime, and ONLY need a 32 bit high multiply.

That is, these are the two algorithms for unsigned division by constants where the magic number overflows:

- This paper: Promote to twice the bit width, followed by high multiply (32x64 => 64) and then bitshift

- SOTA: Saturating increment of the dividend, then high multiply (32x32 => 32) and then bitshift

Probably the paper's approach is a little better on wide multipliers, but they missed this well-known technique published 15 years ago (and before that, I merely rediscovered it):

https://ridiculousfish.com/blog/posts/labor-of-division-epis...


The paper doesn't require a bitshift after multiplication -- it directly uses the high half of the product as the quotient, so it saves at least one tick over the solution you mentioned. And on x86, saturating addition can't be done in a tick and 32->64 zero-extension is implicit, so the distinction is even wider.


> And on x86, saturating addition can't be done in a tick

Perhaps I misunderstand your point, but I am rather sure that in SSE.../AVX... there do exist instructions for saturating addition:

* (V)PADDSB, (V)PADDSW, (V)PADDUSB, (V)PADDUSW

* (V)PHADDSW, (V)PHSUBSW


Unfortunately, that's only vector, and ≤16-bit ints at that, no 32-bit ints; and as the other reply says, nearly non-existent multiply-high which generally makes vectorized div-by-const its own mini-hell (but doing a 2x-width multiply with fixups is still better than the OP 4x-width method).

(...though, x86 does have (v)pmulhw for 16-bit input, so for 16-bit div-by-const the saturating option works out quite well.)

(And, for what it's worth, the lack of 8-bit multiplies on x86 means that the OP method of high-half-of-4x-width-multiply works out nicely for vectorizing dividing 8-bit ints too)


On x86, there is no vector instruction to get the upper half of integer product (64-bits x 64-bits). ARM SVE2 and RISC-V RVV have one, x86 unfortunately does not (and probably wont for a long time as AVX10 does not add it, either).


There is one for the f64 FMA recycling IFMA from AVX512 they have for bignum libraries;it's a 52 bit unsigned multiply and accumulates either the low or the high output halves into a 64bit accumulator.

It's surely no 64 bit but it's much more than 32 bit. And it's giving you access to the high halves so you can use it to compute 32x32->64 on vector even if only half as packed as that could be.


From my research you can always fit it in a 32x32 multiply, you only need the extra bit at compile time. The extra bit tells you how to adjust the result in the end, but the adjustment is also a constant.


Any idea why no one applied this to llvm in the interim?


I was curious how defer is implemented. `defer` in Go is famously function-scoped, not lexically-scoped. This means that the number of actively-deferred statements is unbounded, which implies heap allocation.

The answer is that Solod breaks with Go semantics here: it just makes defer block-scoped (and unavailable in for/if blocks, which I don't quite get).

https://github.com/solod-dev/solod/blob/main/doc/spec.md#def...


What's the point if it's incompatible? The README suggests using go's testing toolchain and type checker, but that's unreliable if the compiled code has different behavior than the tested code. That's like testing and typechecking your code in a C++ compiler but then for production you run it through a C compiler.

Would have been a lot more useful if it tried to match the Go behavior and threw a compiler error if it couldn't, e.g. when you defer in a loop.

Is this just for people who prefer Go syntax over C syntax?


I don't work regularly on it but I have a proof of concept go to c++ compiler that try to get the exact same behaviour : https://github.com/Rokhan/gocpp

At the moment, it sort of work for simple one-file project with no dependencies if you don't mind there is no garbage collector. (it try to compile recursively library imports but linking logic is not implemented)


As long as you exclude defers in a loop, this can be done statically: count the maximum number of defers in a function, and add an array of that size + counter at the function entrance. That would make it a strict subset.


tbh I'd rather have this behaviour, defer should've been lexically scoped from the beginning.


> This means that the number of actively-deferred statements is unbounded, which implies heap allocation.

In C you can allocate dynamically on the stack using alloca or a VLA.



Oklo | Remote (US) or Santa Clara or Brooklyn | Full time | https://oklo.com

Join us in pioneering the next generation of nuclear reactors! You'll leverage your software skills alongside nuclear engineers to model, simulate, design, and deploy advanced fission power technology. You will work at the forefront of the nuclear industry, developing novel techniques to reach new levels of safety, efficiency, and resiliency. Come be a part of powering the future with advanced fission power plants to provide clean, reliable, affordable energy.

We are hiring for:

- Software Engineer: https://job-boards.greenhouse.io/oklo/jobs/4018702004

- Senior Software Engineer: https://job-boards.greenhouse.io/oklo/jobs/5739483004

- Software Engineer (Infrastructure): https://job-boards.greenhouse.io/oklo/jobs/5784826004

- Software Quality Assurance Lead: https://job-boards.greenhouse.io/oklo/jobs/5480416004

See more opportunities here: https://job-boards.greenhouse.io/oklo

Please mention Hacker News in your cover letter!


There is something up with your hiring system. I shared this post with a friend who applied, and they got an instant rejection. This is a data engineer with 4+ years experience in your stack and a degree in nuclear engineering to boot. Maybe not an ultimate hire but clearly not someone you should be auto-rejecting.


Thank you for flagging this, that definitely shouldn't be happening. Possibly we have an over-zealous spam filter. If you and your friend are open to it, please email me at pca@[company].com and I will personally look into it.


This is a classic example of why generic ATS filters and keyword-based AI fail both candidates and EMs. When the screening process is a black box, you lose high-signal candidates before a human even sees their CV.

I'm building Taknut (https://taknut.com) specifically to solve this for Engineering Managers. Instead of auto-rejecting, it uses a framework to generate interview guides rooted in the candidate's actual projects. It identifies specific technical proof points (like that nuclear engineering degree + specific stack experience) to help the EM ask deep questions rather than relying on a "Pass/Fail" bot.

If you're tired of "over-zealous filters" killing your pipeline, it might be worth a look to bring the human evaluation back into focus without losing time.


clean drop


I don't think that product solves this problem. You need to get 3k applications, many spam down to 10-20 or so you want to do round 1 with.


What was their citizenship? My guess is there are security clearances involved.


You need to get in touch with them personally. I feel all hiring happens in circles.


Why would an allocation require an atomic write for a reference count?

Swift routinely optimizes out reference count traffic.


> Why would an allocation require an atomic write for a reference count?

It won't always require it, but it usually will because you have to ensure the memory containing the reference count is correctly set before handing off a pointer to the item. This has to be done almost first thing in the construction of the item.

It's not impossible that a smart compiler could see and remove that initialization and destruction if it can determine that the item never escapes the current scope. But if it does escape it by, for example, being added to a list or returned from a function, then those two atomic writes are required.


That's exactly what affine / linear types do.


JS (when using ints, which v8 does) is the same in this respect.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: