chacha8rand: new blog post
Change-Id: I751e1cb29f1053665a275fed95dfe3f47798c45c
Reviewed-on: https://go-review.googlesource.com/c/website/+/582795
Auto-Submit: Russ Cox <rsc@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/_content/blog/chacha8rand.md b/_content/blog/chacha8rand.md
new file mode 100644
index 0000000..563ce75
--- /dev/null
+++ b/_content/blog/chacha8rand.md
@@ -0,0 +1,492 @@
+---
+title: "Secure Randomness in Go 1.22"
+date: 2024-05-02
+by:
+- Russ Cox
+- Filippo Valsorda
+summary: ChaCha8Rand is a new cryptographically secure pseudorandom number generator used in Go 1.22.
+---
+
+Computers aren't random.
+On the contrary, hardware designers work very hard to make sure computers run every program the same way every time.
+So when a program does need random numbers, that requires extra effort.
+Traditonally, computer scientists and programming languages
+have distinguished between two different kinds of random numbers:
+statistical and cryptographic randomness.
+In Go, those are provided by [`math/rand`](/pkg/math/rand/)
+and [`crypto/rand`](/pkg/crypto/rand), respectively.
+This post is about how Go 1.22 brings the two closer together,
+by using a cryptographic random number source in `math/rand`
+(as well as `math/rand/v2`, as mentioned in our [previous post](/blog/randv2)).
+The result is better randomness and far less damage when
+developers accidentally use `math/rand` instead of `crypto/rand`.
+
+Before we can explain what Go 1.22 did, let's take a closer look
+at statistical randomness compared to cryptographic randomness.
+
+## Statistical Randomness
+
+Random numbers that pass basic statistical tests
+are usually appropriate for use cases like simulations, sampling,
+numerical analysis, non-cryptographic randomized algorithms,
+[random testing](/doc/security/fuzz/),
+[shuffling inputs](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle),
+and
+[random exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff#Collision_avoidance).
+Very basic, easy to compute mathematical formulas turn out to work
+well enough for these use cases.
+Because the methods are so simple, however, an observer who
+knows what algorithm is being used can typically predict the rest
+of the sequence after seeing enough values.
+
+Essentially all programming environments provide a mechanism for generating
+statistical random numbers
+that traces back through C to
+Research Unix Third Edition (V3), which added a pair of functions: `srand` and `rand`.
+The manual page included
+a note that read:
+
+> _WARNING The author of this routine has been writing
+random-number generators for many years and has never been
+known to write one that worked._
+
+This note was partly a joke but also an acknowledgement that such
+generators are [inherently not random](https://www.tuhs.org/pipermail/tuhs/2024-March/029587.html).
+
+The source code of the generator makes clear how trivial it is.
+Translated from PDP-11 assembly to modern C, it was:
+
+ uint16 ranx;
+
+ void
+ srand(uint16 seed)
+ {
+ ranx = seed;
+ }
+
+ int16
+ rand(void)
+ {
+ ranx = 13077*ranx + 6925;
+ return ranx & ~0x8000;
+ }
+
+Calling `srand` seeds the generator with a single integer seed,
+and `rand` returns the next number from the generator.
+The AND in the return statement clears the sign bit to make sure the result is positive.
+
+This function is an instance of the general class of
+[linear congruential generators (LCGs)](https://en.wikipedia.org/wiki/Linear_congruential_generator),
+which Knuth analyzes in _The Art of Computer Programming_, Volume 2, section 3.2.1.
+The main benefit of LCGs is that constants can be chosen such that they
+emit every possible output value once before repeating,
+as the Unix implementation did for 15-bit outputs.
+A serious problem with LCGs, however, is that the high bits of the state do not affect the low bits at all,
+so every truncation of the sequence to _k_ bits necessarily repeats with a smaller period.
+The low bit must toggle: 0, 1, 0, 1, 0, 1.
+The low two bits must count up or down: 0, 1, 2, 3, 0, 1, 2, 3, or else 0, 3, 2, 1, 0, 3, 2, 1.
+There are four possible three-bit sequences; the original Unix implementation repeats 0, 5, 6, 3, 4, 1, 2, 7.
+(These problems can be avoided by reducing the value modulo a prime,
+but that would have been quite expensive at the time.
+See S. K. Park and K. W. Miller's 1988 CACM paper
+“[Random number generators: good ones are hard to find](https://dl.acm.org/doi/10.1145/63039.63042)”
+for a short analysis
+and the first chapter of Knuth Volume 2 for a longer one.)
+
+Even with these known problems,
+the `srand` and `rand` functions were included in the first C standard,
+and equivalent functionality was included in essentially every language since then.
+LCGs were once the dominant implementation strategy,
+although they've fallen off in popularity due to some important drawbacks.
+One significant remaining use is [`java.util.Random`](https://github.com/openjdk/jdk8u-dev/blob/master/jdk/src/share/classes/java/util/Random.java),
+which powers [`java.lang.Math.random`](https://github.com/openjdk/jdk8u-dev/blob/master/jdk/src/share/classes/java/util/Random.java).
+
+Another thing you can see from the implementation above
+is that the internal state is completely exposed by the result of `rand`.
+An observer who knows the algorithm and sees a single result
+can easily compute all future results.
+If you are running a server that calculates some random values
+that become public and some random values that must stay secret,
+using this kind of generator would be disastrous:
+the secrets wouldn't be secret.
+
+More modern random generators aren't as terrible as the original Unix one,
+but they're still not completely unpredictable.
+To make that point, next we will look at the original `math/rand` generator from Go 1
+and the PCG generator we added in `math/rand/v2`.
+
+## The Go 1 Generator
+
+The generator used in Go 1's `math/rand` is an instance of what is called a
+[linear-feedback shift register](https://en.wikipedia.org/wiki/Linear-feedback_shift_register).
+The algorithm is based on an idea by George Marsaglia,
+tweaked by Don Mitchell and Jim Reeds,
+and further customized by Ken Thompson for Plan 9 and then Go.
+It has no official name, so this post calls it the Go 1 generator.
+
+The Go 1 generator's internal state is a slice `vec` of 607 uint64s.
+In that slice, there are two distinguished elements: `vec[606]`, the last element, is called the “tap”,
+and `vec[334]` is called the “feed”.
+To generate the next random number,
+the generator adds the tap and the feed
+to produce a value `x`,
+stores `x` back into the feed,
+shifts the entire slice one position to the right
+(the tap moves to `vec[0]` and `vec[i]` moves to `vec[i+1]`),
+and returns `x`.
+The generator is called “linear feedback” because the tap is _added_ to the feed;
+the entire state is a “shift register” because each step shifts the slice entries.
+
+Of course, actually moving every slice entry forward would be prohibitively expensive,
+so instead the implementation leaves the slice data in place
+and moves the tap and feed positions backward
+on each step. The code looks like:
+
+{{raw `
+ func (r *rngSource) Uint64() uint64 {
+ r.tap--
+ if r.tap < 0 {
+ r.tap += len(r.vec)
+ }
+
+ r.feed--
+ if r.feed < 0 {
+ r.feed += len(r.vec)
+ }
+
+ x := r.vec[r.feed] + r.vec[r.tap]
+ r.vec[r.feed] = x
+ return uint64(x)
+ }
+`}}
+
+Generating the next number is quite cheap: two subtractions, two conditional adds, two loads, one add, one store.
+
+Unfortunately, because the generator directly returns one slice element from its its internal state vector,
+reading 607 values from the generator completely exposes all its state.
+With those values, you can predict all the future values, by filling in your own `vec`
+and then running the algorithm.
+You can also recover all the previous values, by running the algorithm backward
+(subtracting the tap from the feed and shifting the slice to the left).
+
+As a complete demonstration, here is an [insecure program](/play/p/v0QdGjUAtzC)
+generating pseudorandom authentication
+tokens along with code that predicts the next token given a sequence of earlier tokens.
+As you can see, the Go 1 generator provides no security at all (nor was it meant to).
+The quality of the generated numbers also depends on the initial setting of `vec`.
+
+## The PCG Generator
+
+For `math/rand/v2`, we wanted to provide a more modern statistical random generator
+and settled on Melissa O'Neill's PCG algorithm, published in 2014 in her paper
+“[PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation](https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf)”.
+The exhaustive analysis in the paper can make it hard to notice at first glance how utterly trivial the generators are:
+PCG is a post-processed 128-bit LCG.
+
+If the state `p.x` were a `uint128` (hypothetically), the code to compute the next value would be:
+
+ const (
+ pcgM = 0x2360ed051fc65da44385df649fccf645
+ pcgA = 0x5851f42d4c957f2d14057b7ef767814f
+ )
+
+ type PCG struct {
+ x uint128
+ }
+
+ func (p *PCG) Uint64() uint64 {
+ p.x = p.x * pcgM + pcgA
+ return scramble(p.x)
+ }
+
+The entire state is a single 128-bit number,
+and the update is a 128-bit multiply and add.
+In the return statement, the `scramble` function reduces the 128-bit state
+down to a 64-bit state.
+The orginal PCG used (again using a hypothetical `uint128` type):
+
+ func scramble(x uint128) uint64 {
+ return bits.RotateLeft(uint64(x>>64) ^ uint64(x), -int(x>>122))
+ }
+
+This code XORs the two halves of the 128-bit state together
+and then rotates the result according to the top six bits of the state.
+This version is called PCG-XSL-RR, for “xor shift low, right rotate”.
+
+Based on a [suggestion from O'Neill during proposal discussion](/issue/21835#issuecomment-739065688),
+Go's PCG uses a new scramble function based on multiplication,
+which mixes the bits more aggressively:
+
+ func scramble(x uint128) uint64 {
+ hi, lo := uint64(x>>64), uint64(x)
+ hi ^= hi >> 32
+ hi *= 0xda942042e4dd58b5
+ hi ^= hi >> 48
+ hi *= lo | 1
+ }
+
+O'Neill calls PCG with this scrambler PCG-DXSM, for “double xorshift multiply.”
+Numpy uses this form of PCG as well.
+
+Although PCG uses more computation to generate each value,
+it uses significantly less state: two uint64s instead of 607.
+It is also much less sensitive to the initial values of that state,
+and [it passes many statistical tests that other generators do not](https://www.pcg-random.org/statistical-tests.html).
+In many ways it is an ideal statistical generator.
+
+Even so, PCG is not unpredictable.
+While the scrambling of bits to prepare the result does not
+expose the state directly like in the LCG and Go 1 generators,
+[PCG-XSL-RR can still be be reversed](https://pdfs.semanticscholar.org/4c5e/4a263d92787850edd011d38521966751a179.pdf),
+and it would not be surprising if PCG-DXSM could too.
+For secrets, we need something different.
+
+## Cryptographic Randomness
+
+_Cryptographic random numbers_ need to be utterly unpredictable
+in practice, even to an observer who knows how they are generated
+and has observed any number of previously generated values.
+The safety of cryptographic protocols, secret keys, modern commerce,
+online privacy, and more all critically depend on access to cryptographic
+randomness.
+
+Providing cryptographic randomness is ultimately the job of the
+operating system, which can gather true randomness from physical devices—timings
+of the mouse, keyboard, disks, and network, and more recently
+[electrical noise measured directly by the CPU itself](https://web.archive.org/web/20141230024150/http://www.cryptography.com/public/pdf/Intel_TRNG_Report_20120312.pdf).
+Once the operating system has gathered a meaningful
+amount of randomness—say, at least 256 bits—it can use cryptographic
+hashing or encryption algorithms to stretch that seed into
+an arbitrarily long sequence of random numbers.
+(In practice the operating system is also constantly gathering and
+adding new randomness to the sequence too.)
+
+The exact operating system interfaces have evolved over time.
+A decade ago, most systems provided a device file named
+`/dev/random` or something similar.
+Today, in recognition of how fundamental randomness has become,
+operating systems provide a direct system call instead.
+(This also allows programs to read randomness even
+when cut off from the file system.)
+In Go, the [`crypto/rand`](/pkg/crypto/rand/) package abstracts away those details,
+providing the same interface on every operating system: [`rand.Read`](/pkg/crypto/rand/#Read).
+
+It would not be practical for `math/rand` to ask the operating system for
+randomness each time it needs a `uint64`.
+But we can use cryptographic techniques to define an in-process
+random generator that improves on LCGs, the Go 1 generator, and even PCG.
+
+## The ChaCha8Rand Generator
+
+Our new generator, which we unimaginatively named ChaCha8Rand for specification purposes
+and implemented as `math/rand/v2`'s [`rand.ChaCha8`](/pkg/math/rand/v2/#ChaCha8),
+is a lightly modified version of Daniel J. Bernstein's [ChaCha stream cipher](https://cr.yp.to/chacha.html).
+ChaCha is widely used in a 20-round form called ChaCha20, including in TLS and SSH.
+Jean-Philippe Aumasson's paper “[Too Much Crypto](https://eprint.iacr.org/2019/1492.pdf)”
+argues persuasively that the 8-round form ChaCha8 is secure too (and it's roughly 2.5X faster).
+We used ChaCha8 as the core of ChaCha8Rand.
+
+Most stream ciphers, including ChaCha8, work by defining a function that is given
+a key and a block number and produces a fixed-size block of apparently random data.
+The cryptographic standard these aim for (and usually meet) is for this output to be indistinguishable
+from actual random data in the absence of some kind of exponentially costly brute force search.
+A message is encrypted or decrypted by XOR'ing successive blocks of input data
+with successive randomly generated blocks.
+To use ChaCha8 as a `rand.Source`,
+we use the generated blocks directly instead of XOR'ing them with input data
+(this is equivalent to encrypting or decrypting all zeros).
+
+We changed a few details to make ChaCha8Rand more suitable for generating random numbers. Briefly:
+
+ - ChaCha8Rand takes a 32-byte seed, used as the ChaCha8 key.
+ - ChaCha8 generates 64-byte blocks, with calculations treating a block as 16 `uint32`s.
+ A common implementation is to compute four blocks at a time using [SIMD instructions](https://en.wikipedia.org/wiki/Single_instruction,_multiple_data)
+ on 16 vector registers of four `uint32`s each.
+ This produces four interleaved blocks that must be unshuffled for XOR'ing with the input data.
+ ChaCha8Rand defines that the interleaved blocks are the random data stream,
+ removing the cost of the unshuffle.
+ (For security purposes, this can be viewed as standard ChaCha8 followed by a reshuffle.)
+ - ChaCha8 finishes a block by adding certain values to each `uint32` in the block.
+ Half the values are key material and the other half are known constants.
+ ChaCha8Rand defines that the known constants are not re-added,
+ removing half of the final adds.
+ (For security purposes, this can be viewed as standard ChaCha8 followed by subtracting the known constants.)
+ - Every 16th generated block, ChaCha8Rand takes the final 32 bytes of the block for itself,
+ making them the key for the next 16 blocks.
+ This provides a kind of [forward secrecy](https://en.wikipedia.org/wiki/Forward_secrecy):
+ if a system is compromised by an attack that
+ recovers the entire memory state of the generator, only values generated
+ since the last rekeying can be recovered. The past is inaccessible.
+ ChaCha8Rand as defined so far must generate 4 blocks at a time,
+ but we chose to do this key rotation every 16 blocks to leave open the
+ possibility of faster implementations using 256-bit or 512-bit vectors,
+ which could generate 8 or 16 blocks at a time.
+
+We wrote and published a [C2SP specification for ChaCha8Rand](https://c2sp.org/chacha8rand),
+along with test cases.
+This will enable other implementations to share repeatability with the Go implementation
+for a given seed.
+
+The Go runtime now maintains a per-core ChaCha8Rand state (300 bytes),
+seeded with operating system-supplied cryptographic randomness,
+so that random numbers can be generated quickly without any lock contention.
+Dedicating 300 bytes per core may sound expensive,
+but on a 16-core system, it is about the same as storing a single shared Go 1 generator state (4,872 bytes).
+The speed is worth the memory.
+This per-core ChaCha8Rand generator is now used in three different places in the Go standard library:
+
+ 1. The `math/rand/v2` package functions, such as
+ [`rand.Float64`](/pkg/math/rand/v2/#Float64) and
+ [`rand.N`](/pkg/math/rand/v2/#N), always use ChaCha8Rand.
+
+ 2. The `math/rand` package functions, such as
+ [`rand.Float64`](/pkg/math/rand/#Float64) and
+ [`rand.Intn`](/pkg/math/rand/#Intn),
+ use ChaCha8Rand when
+ [`rand.Seed`](/pkg/math/rand/#Seed) has not been called.
+ Applying ChaCha8Rand in `math/rand` improves the security of programs
+ even before they update to `math/rand/v2`,
+ provided they are not calling `rand.Seed`.
+ (If `rand.Seed` is called, the implementation is required to fall back to the Go 1 generator for compatibility.)
+
+ 3. The runtime chooses the hash seed for each new map
+ using ChaCha8Rand instead of a less secure [wyrand-based generator](https://github.com/wangyi-fudan/wyhash)
+ it previously used.
+ Random seeds are needed because if
+ an attacker knows the specific hash function used by a map implementation,
+ they can prepare input that drives the map into quadratic behavior
+ (see Crosby and Wallach's “[Denial of Service via Algorithmic Complexity Attacks](https://www.usenix.org/conference/12th-usenix-security-symposium/denial-service-algorithmic-complexity-attacks)”).
+ Using a per-map seed, instead of one global seed for all maps,
+ also avoids [other degenerate behaviors](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion).
+ It is not strictly clear that maps need a cryptographically random seed,
+ but it's also not clear that they don't. It seemed prudent and was trivial to switch.
+
+Code that needs its own ChaCha8Rand instances can create its own [`rand.ChaCha8`](/pkg/math/rand/v2/#ChaCha8) directly.
+
+## Fixing Security Mistakes
+
+Go aims to help developers write code that is secure by default.
+When we observe a common mistake with security consequences,
+we look for ways to reduce the risk of that mistake
+or eliminate it entirely.
+In this case, `math/rand`'s global generator was far too predictable,
+leading to serious problems in a variety of contexts.
+
+For example, when Go 1.20 deprecated [`math/rand`’s `Read`](/pkg/math/rand/#Read),
+we heard from developers who discovered (thanks to tooling pointing out
+use of deprecated functionality) they had been
+using it in places where [`crypto/rand`’s `Read`](/pkg/crypto/rand/#Read)
+was definitely needed, like generating key material.
+Using Go 1.20, that mistake
+is a serious security problem that merits a detailed investigation
+to understand the damage.
+Where were the keys used?
+How were the keys exposed?
+Were other random outputs exposed that might allow an attacker to derive the keys?
+And so on.
+Using Go 1.22, that mistake is just a mistake.
+It's still better to use `crypto/rand`,
+because the operating system kernel can do a better job keeping the random values
+secret from various kinds of prying eyes,
+the kernel is continually adding new entropy to its generator,
+and the kernel has had more scrutiny.
+But accidentally using `math/rand` is no longer a security catastrophe.
+
+There are also a variety of use cases that don't seem like “crypto”
+but nonetheless need unpredictable randomness.
+These cases are made more robust by using ChaCha8Rand instead of the Go 1 generator.
+
+For example, consider generating a
+[random UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)).
+Since UUIDs are not secret, using `math/rand` might seem fine.
+But if `math/rand` has been seeded with the current time,
+then running it at the same instant on different computers
+will produce the same value, making them not “universally unique”.
+This is especially likely on systems where the current time
+is only available with millisecond precision.
+Even with auto-seeding using OS-provided entropy,
+as introduced in Go 1.20,
+the Go 1 generator's seed is only a 63-bit integer,
+so a program that generates a UUID at startup
+can only generate 2⁶³ possible UUIDs and is
+likely to see collisions after 2³¹ or so UUIDs.
+Using Go 1.22, the new ChaCha8Rand generator
+is seeded from 256 bits of entropy and can generate
+2²⁵⁶ possible first UUIDs.
+It does not need to worry about collisions.
+
+As another example, consider load balancing in a front-end server
+that randomly assigns incoming requests to back-end servers.
+If an attacker can observe the assignments and knows the
+predictable algorithm generating them,
+then the attacker could send a stream
+of mostly cheap requests but arrange for all the expensive requests
+to land on a single back-end server.
+This is an unlikely but plausible problem using the Go 1 generator.
+Using Go 1.22, it's not a problem at all.
+
+In all these examples, Go 1.22 has eliminated or greatly reduced
+security problems.
+
+## Performance
+
+The security benefits of ChaCha8Rand do have a small cost,
+but ChaCha8Rand is still in the same ballpark as both the Go 1 generator and PCG.
+The following graphs compare the performance of the three generators,
+across a variety of hardware, running two operations:
+the primitive operation “Uint64,” which returns the next `uint64` in the random stream,
+and the higher-level operation “N(1000),” which returns a random value in the range [0, 1000).
+
+<img src="chacha8rand/amd.svg">
+<img src="chacha8rand/intel.svg">
+<img src="chacha8rand/amd32.svg">
+<img src="chacha8rand/intel32.svg">
+<img src="chacha8rand/m1.svg">
+<img src="chacha8rand/m3.svg">
+<img src="chacha8rand/taut2a.svg">
+
+The “running 32-bit code” graphs show modern 64-bit x86 chips
+executing code built with `GOARCH=386`, meaning they are
+running in 32-bit mode.
+In that case, the fact that PCG requires 128-bit multiplications
+makes it slower than ChaCha8Rand, which only uses 32-bit SIMD arithmetic.
+Actual 32-bit systems matter less every year,
+but it is still interesting that ChaCha8Rand is faster than PCG
+on those systems.
+
+On some systems, “Go 1: Uint64” is faster than “PCG: Uint64”,
+but “Go 1: N(1000)” is slower than “PCG: N(1000)”.
+This happens because “Go 1: N(1000)” is using `math/rand`'s algorithm for
+reducing a random `int64` down to a value in the range [0, 1000),
+and that algorithm does two 64-bit integer divide operations.
+In contrast, “PCG: N(1000)” and “ChaCha8: N(1000)” use the [faster `math/rand/v2` algorithm](/blog/randv2#problem.rand),
+which almost always avoids the divisions.
+Removing the 64-bit divisions dominates the algorithm change
+for 32-bit execution and on the Ampere.
+
+Overall, ChaCha8Rand is slower than the Go 1 generator,
+but it is never more than twice as slow, and on typical servers the
+difference is never more than 3ns.
+Very few programs will be bottlenecked by this difference,
+and many programs will enjoy the improved security.
+
+## Conclusion
+
+Go 1.22 makes your programs more secure without any code changes.
+We did this by identifying the common mistake of accidentally using `math/rand`
+instead of `crypto/rand` and then strengthening `math/rand`.
+This is one small step in Go's ongoing journey to keep programs
+safe by default.
+
+These kinds of mistakes are not unique to Go.
+For example, the npm `keypair` package tries to generate an RSA key pair
+using Web Crypto APIs, but if they're not available, it falls back to JavaScript's `Math.random`.
+This is hardly an isolated case,
+and the security of our systems cannot depend on developers not making mistakes.
+Instead, we hope that eventually all programming languages
+will move to cryptographically strong pseudorandom generators
+even for “mathematical” randomness,
+eliminating this kind of mistake, or at least greatly reducing its blast radius.
+Go 1.22's [ChaCha8Rand](https://c2sp.org/chacha8rand) implementation
+proves that this approach is competitive with other generators.
+
diff --git a/_content/blog/chacha8rand/amd.svg b/_content/blog/chacha8rand/amd.svg
new file mode 100644
index 0000000..b405ac9
--- /dev/null
+++ b/_content/blog/chacha8rand/amd.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>AMD Ryzen 9 7950X</tspan></text>
+<rect x='5' y='25' height='20' width='57' fill='#ffaaaa' stroke='black' />
+<text x='59' y='45' text-anchor='end'><tspan dy='-0.5em'>2.3ns</tspan></text>
+<text x='67' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='38' fill='#ccccff' stroke='black' />
+<text x='40' y='65' text-anchor='end'><tspan dy='-0.5em'>1.5ns</tspan></text>
+<text x='48' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='77' fill='#ffffaa' stroke='black' />
+<text x='79' y='85' text-anchor='end'><tspan dy='-0.5em'>3.1ns</tspan></text>
+<text x='87' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='76' fill='#ffaaaa' stroke='black' />
+<text x='78' y='115' text-anchor='end'><tspan dy='-0.5em'>3.0ns</tspan></text>
+<text x='86' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='61' fill='#ccccff' stroke='black' />
+<text x='63' y='135' text-anchor='end'><tspan dy='-0.5em'>2.5ns</tspan></text>
+<text x='71' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='100' fill='#ffffaa' stroke='black' />
+<text x='102' y='155' text-anchor='end'><tspan dy='-0.5em'>4.0ns</tspan></text>
+<text x='110' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/amd.txt b/_content/blog/chacha8rand/amd.txt
new file mode 100644
index 0000000..e7f3d90
--- /dev/null
+++ b/_content/blog/chacha8rand/amd.txt
@@ -0,0 +1,365 @@
+goos: linux
+goarch: amd64
+pkg: randtest
+cpu: AMD Ryzen 9 7950X 16-Core Processor
+BenchmarkUint64/gen=Go1 455279768 2.364 ns/op
+BenchmarkUint64/gen=Go1 519789694 2.293 ns/op
+BenchmarkUint64/gen=Go1 522122683 2.293 ns/op
+BenchmarkUint64/gen=Go1 523472362 2.294 ns/op
+BenchmarkUint64/gen=Go1 485638840 2.303 ns/op
+BenchmarkUint64/gen=Go1 519045819 2.292 ns/op
+BenchmarkUint64/gen=Go1 523431801 2.293 ns/op
+BenchmarkUint64/gen=Go1 523357124 2.293 ns/op
+BenchmarkUint64/gen=Go1 523389828 2.292 ns/op
+BenchmarkUint64/gen=Go1 523398201 2.293 ns/op
+BenchmarkUint64/gen=Go1 523435303 2.293 ns/op
+BenchmarkUint64/gen=Go1 519580422 2.503 ns/op
+BenchmarkUint64/gen=Go1 523382763 2.306 ns/op
+BenchmarkUint64/gen=Go1 523438023 2.293 ns/op
+BenchmarkUint64/gen=Go1 523444336 2.293 ns/op
+BenchmarkUint64/gen=Go1 523370480 2.292 ns/op
+BenchmarkUint64/gen=Go1 521910638 2.308 ns/op
+BenchmarkUint64/gen=Go1 518964924 2.310 ns/op
+BenchmarkUint64/gen=Go1 486476830 2.304 ns/op
+BenchmarkUint64/gen=Go1 523447699 2.293 ns/op
+BenchmarkUint64/gen=PCG 786870627 1.525 ns/op
+BenchmarkUint64/gen=PCG 783935590 1.525 ns/op
+BenchmarkUint64/gen=PCG 784169529 1.534 ns/op
+BenchmarkUint64/gen=PCG 785884291 1.532 ns/op
+BenchmarkUint64/gen=PCG 786318915 1.525 ns/op
+BenchmarkUint64/gen=PCG 786187296 1.525 ns/op
+BenchmarkUint64/gen=PCG 786013018 1.539 ns/op
+BenchmarkUint64/gen=PCG 778637932 1.532 ns/op
+BenchmarkUint64/gen=PCG 786107628 1.526 ns/op
+BenchmarkUint64/gen=PCG 786311377 1.525 ns/op
+BenchmarkUint64/gen=PCG 787032980 1.525 ns/op
+BenchmarkUint64/gen=PCG 782743168 1.525 ns/op
+BenchmarkUint64/gen=PCG 785617480 1.539 ns/op
+BenchmarkUint64/gen=PCG 783361540 1.533 ns/op
+BenchmarkUint64/gen=PCG 780100621 1.541 ns/op
+BenchmarkUint64/gen=PCG 786418195 1.533 ns/op
+BenchmarkUint64/gen=PCG 787006656 1.525 ns/op
+BenchmarkUint64/gen=PCG 786754902 1.525 ns/op
+BenchmarkUint64/gen=PCG 787156088 1.525 ns/op
+BenchmarkUint64/gen=PCG 786777794 1.538 ns/op
+BenchmarkUint64/gen=ChaCha8 386054190 3.106 ns/op
+BenchmarkUint64/gen=ChaCha8 384905343 3.107 ns/op
+BenchmarkUint64/gen=ChaCha8 385285060 3.110 ns/op
+BenchmarkUint64/gen=ChaCha8 385377391 3.105 ns/op
+BenchmarkUint64/gen=ChaCha8 386341707 3.116 ns/op
+BenchmarkUint64/gen=ChaCha8 386078406 3.107 ns/op
+BenchmarkUint64/gen=ChaCha8 385757036 3.112 ns/op
+BenchmarkUint64/gen=ChaCha8 385806292 3.108 ns/op
+BenchmarkUint64/gen=ChaCha8 386117088 3.108 ns/op
+BenchmarkUint64/gen=ChaCha8 386231798 3.101 ns/op
+BenchmarkUint64/gen=ChaCha8 385470673 3.105 ns/op
+BenchmarkUint64/gen=ChaCha8 386601999 3.109 ns/op
+BenchmarkUint64/gen=ChaCha8 385018952 3.110 ns/op
+BenchmarkUint64/gen=ChaCha8 386342428 3.109 ns/op
+BenchmarkUint64/gen=ChaCha8 386414920 3.109 ns/op
+BenchmarkUint64/gen=ChaCha8 387147032 3.108 ns/op
+BenchmarkUint64/gen=ChaCha8 386450503 3.100 ns/op
+BenchmarkUint64/gen=ChaCha8 386103471 3.104 ns/op
+BenchmarkUint64/gen=ChaCha8 386540037 3.113 ns/op
+BenchmarkUint64/gen=ChaCha8 385798424 3.110 ns/op
+BenchmarkN1000/gen=Go1 394725604 3.040 ns/op
+BenchmarkN1000/gen=Go1 394682626 3.040 ns/op
+BenchmarkN1000/gen=Go1 394703554 3.043 ns/op
+BenchmarkN1000/gen=Go1 394712413 3.042 ns/op
+BenchmarkN1000/gen=Go1 394615815 3.041 ns/op
+BenchmarkN1000/gen=Go1 393253173 3.041 ns/op
+BenchmarkN1000/gen=Go1 393223544 3.042 ns/op
+BenchmarkN1000/gen=Go1 394604973 3.044 ns/op
+BenchmarkN1000/gen=Go1 394629051 3.041 ns/op
+BenchmarkN1000/gen=Go1 394585057 3.041 ns/op
+BenchmarkN1000/gen=Go1 394644680 3.041 ns/op
+BenchmarkN1000/gen=Go1 394729832 3.040 ns/op
+BenchmarkN1000/gen=Go1 393461822 3.040 ns/op
+BenchmarkN1000/gen=Go1 394717290 3.040 ns/op
+BenchmarkN1000/gen=Go1 394707823 3.040 ns/op
+BenchmarkN1000/gen=Go1 394748188 3.040 ns/op
+BenchmarkN1000/gen=Go1 394715078 3.040 ns/op
+BenchmarkN1000/gen=Go1 394025218 3.040 ns/op
+BenchmarkN1000/gen=Go1 394610018 3.042 ns/op
+BenchmarkN1000/gen=Go1 394493120 3.041 ns/op
+BenchmarkN1000/gen=PCG 485638623 2.471 ns/op
+BenchmarkN1000/gen=PCG 484805846 2.472 ns/op
+BenchmarkN1000/gen=PCG 485383681 2.477 ns/op
+BenchmarkN1000/gen=PCG 485478981 2.472 ns/op
+BenchmarkN1000/gen=PCG 485563909 2.478 ns/op
+BenchmarkN1000/gen=PCG 485616392 2.479 ns/op
+BenchmarkN1000/gen=PCG 485512890 2.472 ns/op
+BenchmarkN1000/gen=PCG 484879171 2.471 ns/op
+BenchmarkN1000/gen=PCG 484142248 2.475 ns/op
+BenchmarkN1000/gen=PCG 485548515 2.472 ns/op
+BenchmarkN1000/gen=PCG 485556486 2.476 ns/op
+BenchmarkN1000/gen=PCG 485408506 2.477 ns/op
+BenchmarkN1000/gen=PCG 485587806 2.479 ns/op
+BenchmarkN1000/gen=PCG 484682878 2.472 ns/op
+BenchmarkN1000/gen=PCG 485418754 2.472 ns/op
+BenchmarkN1000/gen=PCG 485386789 2.472 ns/op
+BenchmarkN1000/gen=PCG 485533003 2.472 ns/op
+BenchmarkN1000/gen=PCG 485576724 2.472 ns/op
+BenchmarkN1000/gen=PCG 485400006 2.473 ns/op
+BenchmarkN1000/gen=PCG 485233192 2.471 ns/op
+BenchmarkN1000/gen=ChaCha8 298920919 4.033 ns/op
+BenchmarkN1000/gen=ChaCha8 299882438 4.033 ns/op
+BenchmarkN1000/gen=ChaCha8 297629688 4.021 ns/op
+BenchmarkN1000/gen=ChaCha8 297746730 4.031 ns/op
+BenchmarkN1000/gen=ChaCha8 299986351 4.021 ns/op
+BenchmarkN1000/gen=ChaCha8 303398673 4.035 ns/op
+BenchmarkN1000/gen=ChaCha8 302361688 4.034 ns/op
+BenchmarkN1000/gen=ChaCha8 298069573 4.008 ns/op
+BenchmarkN1000/gen=ChaCha8 305390112 4.044 ns/op
+BenchmarkN1000/gen=ChaCha8 297703798 4.027 ns/op
+BenchmarkN1000/gen=ChaCha8 297693808 4.036 ns/op
+BenchmarkN1000/gen=ChaCha8 298934832 4.029 ns/op
+BenchmarkN1000/gen=ChaCha8 303134473 4.030 ns/op
+BenchmarkN1000/gen=ChaCha8 299835459 4.034 ns/op
+BenchmarkN1000/gen=ChaCha8 298504718 4.024 ns/op
+BenchmarkN1000/gen=ChaCha8 297520771 4.034 ns/op
+BenchmarkN1000/gen=ChaCha8 301334641 4.031 ns/op
+BenchmarkN1000/gen=ChaCha8 298170103 4.033 ns/op
+BenchmarkN1000/gen=ChaCha8 300362324 4.027 ns/op
+BenchmarkN1000/gen=ChaCha8 298702628 4.025 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191380134 6.247 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191891608 6.269 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191402508 6.248 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192057276 6.248 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191902225 6.267 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191883615 6.267 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192031549 6.271 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192076852 6.269 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191416588 6.268 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192059349 6.267 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191895012 6.247 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192035383 6.248 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191451019 6.248 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191449336 6.248 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191275525 6.247 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191402721 6.254 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191891896 6.247 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 191882456 6.247 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192030223 6.254 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 192057226 6.248 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 372059919 3.133 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381930554 3.131 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382337580 3.130 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382607620 3.139 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382961703 3.132 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382446148 3.136 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382379312 3.134 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381725266 3.129 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 383008508 3.137 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 383209660 3.220 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381957969 3.136 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 378188480 3.132 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382109911 3.143 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 383336012 3.143 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382250211 3.219 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 371112848 3.135 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382369777 3.141 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381590031 3.128 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382815568 3.136 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381687740 3.131 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 763725463 1.583 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 763096844 1.597 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 753496458 1.579 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 758911014 1.579 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 756655756 1.578 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762561105 1.574 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 761480029 1.575 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 759111294 1.567 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 751930976 1.571 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762415730 1.570 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 753374888 1.574 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762828859 1.569 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762880312 1.570 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 758914182 1.574 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762964579 1.609 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 761252944 1.568 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762997576 1.574 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 757307414 1.662 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 762538045 1.571 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 764273270 1.569 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7968 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7911 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7980 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.8057 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7917 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7978 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7992 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.8006 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7901 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.8035 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7928 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7971 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7911 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7978 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7930 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7989 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7993 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7980 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.8145 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.7969 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207600003 5.779 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207576589 5.778 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207535726 5.796 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207635161 5.777 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207730761 5.773 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207606531 5.819 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207649696 5.775 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207848798 5.776 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207473913 5.779 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207674976 5.775 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207575718 5.779 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207602695 5.777 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207574398 5.777 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207610029 5.777 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 206445784 5.767 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207519394 5.817 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207613056 5.777 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207624410 5.780 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207862191 5.772 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 207608740 5.814 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.99 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.44 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.41 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.92 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.91 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 96827073 10.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.28 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 11.08 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 11.08 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.86 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 96357594 10.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 11.19 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.35 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 96990795 10.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.26 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 11.09 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.73 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 100000000 10.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 61193780 20.67 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 57732120 20.89 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 54749764 20.52 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 55574290 20.06 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 57946466 20.49 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 56479664 21.07 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 61465386 20.92 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 59001804 20.42 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 59676648 20.13 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 55898132 20.18 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 59248426 20.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 60125833 19.64 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 59264377 20.21 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 58351057 20.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 60281220 19.87 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 56473112 20.36 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 58224433 20.58 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 56178170 20.37 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 57537434 19.88 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 60353514 19.78 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 41878318 28.62 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 40712794 27.45 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 42805771 27.78 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 42034758 28.04 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 46106115 28.33 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 45855178 27.94 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 44782388 26.17 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 40100341 27.89 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 43158573 27.71 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 42840740 29.07 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 45136928 27.29 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 41977213 27.63 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 43477683 28.46 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 41311776 27.36 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 41919152 27.94 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 41766370 26.80 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 42900246 28.09 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 41659854 28.99 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 42763422 27.60 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 43039342 27.40 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 266108085 4.530 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274321118 4.533 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 270676252 4.533 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 275348138 4.353 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 264463909 4.389 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 264614869 4.494 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 272282390 4.508 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 275158875 4.376 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 266010374 4.485 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 267979089 4.539 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274197225 4.479 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274594815 4.355 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 272197795 4.372 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274966376 4.350 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 264506719 4.407 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274379982 4.405 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274472146 4.473 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 274511250 4.373 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 266663211 4.543 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 265502694 4.538 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 536130792 2.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 539033419 2.224 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 548117694 2.187 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 547907901 2.239 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 544108652 2.230 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 548122909 2.228 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 536819059 2.242 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 537992276 2.244 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 536595396 2.226 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 536510715 2.233 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 545179281 2.228 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 540398054 2.209 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 535292932 2.245 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 543246008 2.197 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 538528942 2.219 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 532505830 2.254 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 544847184 2.242 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 540084708 2.237 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 545226187 2.259 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 535453359 2.239 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.131 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.144 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.126 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 966306712 1.141 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.129 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.114 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.111 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.115 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.115 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 959424468 1.120 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.128 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 975872718 1.118 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.135 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 994416624 1.139 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.124 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.123 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.135 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.115 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.128 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 1000000000 1.110 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5671 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5696 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5660 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5638 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5680 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5645 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5679 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5665 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5708 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5714 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5748 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5648 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5724 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5669 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5630 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5630 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5689 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5717 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5612 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.5712 ns/op
+PASS
diff --git a/_content/blog/chacha8rand/amd32.svg b/_content/blog/chacha8rand/amd32.svg
new file mode 100644
index 0000000..945e6eb
--- /dev/null
+++ b/_content/blog/chacha8rand/amd32.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>AMD Ryzen 9 7950X running 32-bit code</tspan></text>
+<rect x='5' y='25' height='20' width='80' fill='#ffaaaa' stroke='black' />
+<text x='82' y='45' text-anchor='end'><tspan dy='-0.5em'>3.2ns</tspan></text>
+<text x='90' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='200' fill='#ccccff' stroke='black' />
+<text x='202' y='65' text-anchor='end'><tspan dy='-0.5em'>8.0ns</tspan></text>
+<text x='10' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='149' fill='#ffffaa' stroke='black' />
+<text x='151' y='85' text-anchor='end'><tspan dy='-0.5em'>6.0ns</tspan></text>
+<text x='10' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='359' fill='#ffaaaa' stroke='black' />
+<text x='361' y='115' text-anchor='end'><tspan dy='-0.5em'>14.4ns</tspan></text>
+<text x='10' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='259' fill='#ccccff' stroke='black' />
+<text x='261' y='135' text-anchor='end'><tspan dy='-0.5em'>10.4ns</tspan></text>
+<text x='10' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='209' fill='#ffffaa' stroke='black' />
+<text x='211' y='155' text-anchor='end'><tspan dy='-0.5em'>8.4ns</tspan></text>
+<text x='10' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/amd32.txt b/_content/blog/chacha8rand/amd32.txt
new file mode 100644
index 0000000..a2c09b1
--- /dev/null
+++ b/_content/blog/chacha8rand/amd32.txt
@@ -0,0 +1,365 @@
+goos: linux
+goarch: 386
+pkg: randtest
+cpu: AMD Ryzen 9 7950X 16-Core Processor
+BenchmarkUint64/gen=Go1 348949184 3.304 ns/op
+BenchmarkUint64/gen=Go1 372030274 3.229 ns/op
+BenchmarkUint64/gen=Go1 370813892 3.225 ns/op
+BenchmarkUint64/gen=Go1 370456261 3.253 ns/op
+BenchmarkUint64/gen=Go1 372152829 3.254 ns/op
+BenchmarkUint64/gen=Go1 368208891 3.263 ns/op
+BenchmarkUint64/gen=Go1 371096613 3.227 ns/op
+BenchmarkUint64/gen=Go1 370718185 3.234 ns/op
+BenchmarkUint64/gen=Go1 369716916 3.233 ns/op
+BenchmarkUint64/gen=Go1 369521853 3.235 ns/op
+BenchmarkUint64/gen=Go1 368828361 3.225 ns/op
+BenchmarkUint64/gen=Go1 369677170 3.224 ns/op
+BenchmarkUint64/gen=Go1 370844134 3.227 ns/op
+BenchmarkUint64/gen=Go1 371561290 3.243 ns/op
+BenchmarkUint64/gen=Go1 368840367 3.226 ns/op
+BenchmarkUint64/gen=Go1 372198487 3.228 ns/op
+BenchmarkUint64/gen=Go1 372201597 3.225 ns/op
+BenchmarkUint64/gen=Go1 372244087 3.243 ns/op
+BenchmarkUint64/gen=Go1 369169668 3.229 ns/op
+BenchmarkUint64/gen=Go1 372093981 3.241 ns/op
+BenchmarkUint64/gen=PCG 149353017 8.034 ns/op
+BenchmarkUint64/gen=PCG 149409340 8.030 ns/op
+BenchmarkUint64/gen=PCG 149441238 8.032 ns/op
+BenchmarkUint64/gen=PCG 149391726 8.033 ns/op
+BenchmarkUint64/gen=PCG 149447098 8.030 ns/op
+BenchmarkUint64/gen=PCG 149349818 8.028 ns/op
+BenchmarkUint64/gen=PCG 149371790 8.032 ns/op
+BenchmarkUint64/gen=PCG 149369576 8.035 ns/op
+BenchmarkUint64/gen=PCG 149416461 8.033 ns/op
+BenchmarkUint64/gen=PCG 149371762 8.030 ns/op
+BenchmarkUint64/gen=PCG 149400506 8.034 ns/op
+BenchmarkUint64/gen=PCG 149455407 8.034 ns/op
+BenchmarkUint64/gen=PCG 149325634 8.034 ns/op
+BenchmarkUint64/gen=PCG 149366830 8.029 ns/op
+BenchmarkUint64/gen=PCG 149382729 8.033 ns/op
+BenchmarkUint64/gen=PCG 149438006 8.028 ns/op
+BenchmarkUint64/gen=PCG 149400940 8.035 ns/op
+BenchmarkUint64/gen=PCG 149411772 8.032 ns/op
+BenchmarkUint64/gen=PCG 149415658 8.033 ns/op
+BenchmarkUint64/gen=PCG 149381407 8.033 ns/op
+BenchmarkUint64/gen=ChaCha8 200577669 6.000 ns/op
+BenchmarkUint64/gen=ChaCha8 199992111 5.983 ns/op
+BenchmarkUint64/gen=ChaCha8 199990521 5.993 ns/op
+BenchmarkUint64/gen=ChaCha8 199631865 5.980 ns/op
+BenchmarkUint64/gen=ChaCha8 200478723 6.020 ns/op
+BenchmarkUint64/gen=ChaCha8 200749365 6.016 ns/op
+BenchmarkUint64/gen=ChaCha8 199953696 5.983 ns/op
+BenchmarkUint64/gen=ChaCha8 200691408 6.010 ns/op
+BenchmarkUint64/gen=ChaCha8 200177230 5.980 ns/op
+BenchmarkUint64/gen=ChaCha8 200200404 5.980 ns/op
+BenchmarkUint64/gen=ChaCha8 200362344 5.983 ns/op
+BenchmarkUint64/gen=ChaCha8 200442160 5.997 ns/op
+BenchmarkUint64/gen=ChaCha8 200713618 6.003 ns/op
+BenchmarkUint64/gen=ChaCha8 199752451 5.997 ns/op
+BenchmarkUint64/gen=ChaCha8 200572332 5.984 ns/op
+BenchmarkUint64/gen=ChaCha8 199819304 5.999 ns/op
+BenchmarkUint64/gen=ChaCha8 200263951 5.985 ns/op
+BenchmarkUint64/gen=ChaCha8 200814261 6.003 ns/op
+BenchmarkUint64/gen=ChaCha8 200454280 5.975 ns/op
+BenchmarkUint64/gen=ChaCha8 199673905 5.993 ns/op
+BenchmarkN1000/gen=Go1 83400441 14.36 ns/op
+BenchmarkN1000/gen=Go1 83515930 14.36 ns/op
+BenchmarkN1000/gen=Go1 83428621 14.36 ns/op
+BenchmarkN1000/gen=Go1 83492007 14.36 ns/op
+BenchmarkN1000/gen=Go1 83497887 14.36 ns/op
+BenchmarkN1000/gen=Go1 83443554 14.36 ns/op
+BenchmarkN1000/gen=Go1 83437218 14.36 ns/op
+BenchmarkN1000/gen=Go1 83530674 14.36 ns/op
+BenchmarkN1000/gen=Go1 83473562 14.36 ns/op
+BenchmarkN1000/gen=Go1 83460934 14.36 ns/op
+BenchmarkN1000/gen=Go1 83529801 14.36 ns/op
+BenchmarkN1000/gen=Go1 83469254 14.36 ns/op
+BenchmarkN1000/gen=Go1 83497654 14.36 ns/op
+BenchmarkN1000/gen=Go1 83482285 14.36 ns/op
+BenchmarkN1000/gen=Go1 83478853 14.37 ns/op
+BenchmarkN1000/gen=Go1 83536268 14.36 ns/op
+BenchmarkN1000/gen=Go1 83540048 14.36 ns/op
+BenchmarkN1000/gen=Go1 83432860 14.36 ns/op
+BenchmarkN1000/gen=Go1 83082889 14.36 ns/op
+BenchmarkN1000/gen=Go1 83538826 14.36 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.38 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.38 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.38 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.36 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.38 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.36 ns/op
+BenchmarkN1000/gen=PCG 100000000 10.37 ns/op
+BenchmarkN1000/gen=ChaCha8 143198302 8.372 ns/op
+BenchmarkN1000/gen=ChaCha8 143470443 8.380 ns/op
+BenchmarkN1000/gen=ChaCha8 143361962 8.371 ns/op
+BenchmarkN1000/gen=ChaCha8 143330941 8.373 ns/op
+BenchmarkN1000/gen=ChaCha8 143247370 8.370 ns/op
+BenchmarkN1000/gen=ChaCha8 143326212 8.373 ns/op
+BenchmarkN1000/gen=ChaCha8 143218791 8.372 ns/op
+BenchmarkN1000/gen=ChaCha8 143333646 8.370 ns/op
+BenchmarkN1000/gen=ChaCha8 143298798 8.371 ns/op
+BenchmarkN1000/gen=ChaCha8 143441259 8.378 ns/op
+BenchmarkN1000/gen=ChaCha8 143302407 8.364 ns/op
+BenchmarkN1000/gen=ChaCha8 143364254 8.375 ns/op
+BenchmarkN1000/gen=ChaCha8 143303527 8.368 ns/op
+BenchmarkN1000/gen=ChaCha8 143288781 8.374 ns/op
+BenchmarkN1000/gen=ChaCha8 143247045 8.371 ns/op
+BenchmarkN1000/gen=ChaCha8 143374738 8.373 ns/op
+BenchmarkN1000/gen=ChaCha8 143524699 8.375 ns/op
+BenchmarkN1000/gen=ChaCha8 143349778 8.377 ns/op
+BenchmarkN1000/gen=ChaCha8 143404096 8.370 ns/op
+BenchmarkN1000/gen=ChaCha8 143369899 8.369 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54283470 22.13 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54195709 22.17 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 53993539 22.18 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54094010 22.20 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54191685 22.23 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54155834 22.17 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54193672 22.18 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54060094 22.15 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54276430 22.21 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54260673 22.18 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54093836 22.21 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54166075 22.18 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54211479 22.15 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54107127 22.11 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54266840 22.10 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54214569 22.22 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54153266 22.09 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54213073 22.21 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54210178 22.15 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 54070245 22.22 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.05 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.11 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.10 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.09 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.06 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.06 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.09 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.09 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 100000000 11.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 213589239 5.570 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 215726096 5.589 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216012300 5.547 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216579532 5.549 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216359286 5.545 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216779208 5.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216562724 5.555 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 211874968 5.556 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216541128 5.552 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216959552 5.602 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 214148059 5.574 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216070479 5.566 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 211184593 5.558 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216068038 5.563 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216591391 5.559 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216970545 5.557 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216575773 5.571 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 215282755 5.581 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216774338 5.555 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 216467674 5.556 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 422375577 2.794 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 430524553 2.802 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 420156876 2.803 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 428463091 2.801 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 427142161 2.815 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 429419977 2.800 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 429720081 2.812 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 428804748 2.804 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 418233612 2.813 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 410259130 2.818 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 415574484 2.815 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 425925901 2.800 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 426972046 2.812 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 426460935 2.826 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 428352288 2.813 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 419073002 2.833 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 416611096 2.811 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 419319380 2.815 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 426964832 2.798 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 429853714 2.798 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55527889 21.68 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55575062 21.66 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55555087 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55630068 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55606388 21.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55552226 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55628856 21.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55613385 21.54 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55618110 21.54 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55635031 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55558489 21.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55637356 21.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55620512 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55572844 21.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55581794 21.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55619713 21.54 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55599418 21.57 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55609458 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55596913 21.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 55618368 21.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 38068642 29.77 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42381316 30.63 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42481038 29.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42936603 30.35 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42987412 33.54 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42413119 30.24 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 39944634 29.66 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 40173698 30.07 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 35704620 29.51 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 41603233 29.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 40767129 29.41 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 40778844 30.21 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 44780362 30.63 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 41221465 30.38 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 39867688 29.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 44539323 30.12 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 34867881 30.17 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42950690 29.77 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 43601059 29.30 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 42884702 29.13 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21418263 56.05 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 19959469 56.43 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 22390783 55.04 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20835304 57.16 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20873750 57.83 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21230052 56.67 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20766681 56.68 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 22698384 56.95 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20828822 56.60 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20443060 56.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21371070 57.37 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21865934 57.52 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21294220 56.34 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21161474 56.92 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21146062 57.29 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20870292 52.00 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 23146081 54.76 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 21047216 53.32 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 19870755 57.46 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 20774079 54.13 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14426322 85.82 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13922346 85.85 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14152882 84.10 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13707800 85.70 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13832228 84.87 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13983607 85.37 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13705869 84.71 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14112175 85.76 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13753612 85.38 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13878420 85.30 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14093458 84.94 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14453456 83.22 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 19682448 72.88 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13160859 85.91 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13626559 86.40 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13010709 85.76 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14009092 85.06 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14098152 86.07 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 13618712 83.80 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 14046798 86.09 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.62 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.65 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.67 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.65 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.65 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.70 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.68 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.68 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.65 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.65 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.67 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 100000000 10.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225286105 5.353 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224269934 5.342 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225259950 5.341 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225585070 5.345 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225525536 5.326 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225306049 5.340 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224585113 5.339 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224946104 5.351 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224430330 5.338 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224824210 5.346 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225213012 5.344 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224816686 5.343 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224602834 5.326 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224801547 5.353 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224424290 5.337 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225141699 5.345 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 225308749 5.334 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224974623 5.343 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224700372 5.341 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 224813598 5.341 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 450437491 2.666 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448269469 2.678 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 430499469 2.671 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 426820728 2.673 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448204987 2.702 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 449522893 2.692 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 449964199 2.724 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 429150966 2.672 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 446759997 2.703 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448888323 2.682 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448785386 2.675 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 449956492 2.672 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448619509 2.677 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 447485872 2.673 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448265174 2.680 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 449962070 2.674 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 448678986 2.679 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 447329626 2.683 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 450132916 2.681 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 449477042 2.787 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 894135829 1.349 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 851244721 1.348 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 881763650 1.347 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 820856227 1.348 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 892103878 1.350 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 853730787 1.359 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 892365624 1.348 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 887357164 1.349 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 892706485 1.350 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 833732042 1.348 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 890371144 1.356 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 890587430 1.351 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 892021827 1.348 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 851409852 1.348 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 848138221 1.355 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 883129353 1.347 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 891411186 1.351 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 848816944 1.352 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 885292789 1.353 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 892320806 1.347 ns/op
+PASS
diff --git a/_content/blog/chacha8rand/intel.svg b/_content/blog/chacha8rand/intel.svg
new file mode 100644
index 0000000..e5bff68
--- /dev/null
+++ b/_content/blog/chacha8rand/intel.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>11th Gen Intel Core i7-1185G7</tspan></text>
+<rect x='5' y='25' height='20' width='66' fill='#ffaaaa' stroke='black' />
+<text x='68' y='45' text-anchor='end'><tspan dy='-0.5em'>2.7ns</tspan></text>
+<text x='76' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='61' fill='#ccccff' stroke='black' />
+<text x='63' y='65' text-anchor='end'><tspan dy='-0.5em'>2.5ns</tspan></text>
+<text x='71' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='105' fill='#ffffaa' stroke='black' />
+<text x='107' y='85' text-anchor='end'><tspan dy='-0.5em'>4.2ns</tspan></text>
+<text x='115' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='121' fill='#ffaaaa' stroke='black' />
+<text x='123' y='115' text-anchor='end'><tspan dy='-0.5em'>4.8ns</tspan></text>
+<text x='131' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='97' fill='#ccccff' stroke='black' />
+<text x='99' y='135' text-anchor='end'><tspan dy='-0.5em'>3.9ns</tspan></text>
+<text x='107' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='143' fill='#ffffaa' stroke='black' />
+<text x='145' y='155' text-anchor='end'><tspan dy='-0.5em'>5.7ns</tspan></text>
+<text x='10' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/intel.txt b/_content/blog/chacha8rand/intel.txt
new file mode 100644
index 0000000..476409f
--- /dev/null
+++ b/_content/blog/chacha8rand/intel.txt
@@ -0,0 +1,365 @@
+goos: linux
+goarch: amd64
+pkg: randtest
+cpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
+BenchmarkUint64/gen=Go1 436149261 2.656 ns/op
+BenchmarkUint64/gen=Go1 480019663 2.698 ns/op
+BenchmarkUint64/gen=Go1 475358106 2.503 ns/op
+BenchmarkUint64/gen=Go1 442996598 2.633 ns/op
+BenchmarkUint64/gen=Go1 432835921 2.524 ns/op
+BenchmarkUint64/gen=Go1 438325593 2.527 ns/op
+BenchmarkUint64/gen=Go1 456904735 2.591 ns/op
+BenchmarkUint64/gen=Go1 470741092 2.819 ns/op
+BenchmarkUint64/gen=Go1 460721596 2.627 ns/op
+BenchmarkUint64/gen=Go1 454786354 2.900 ns/op
+BenchmarkUint64/gen=Go1 417437716 2.600 ns/op
+BenchmarkUint64/gen=Go1 452856316 2.609 ns/op
+BenchmarkUint64/gen=Go1 454681638 2.921 ns/op
+BenchmarkUint64/gen=Go1 464961704 2.720 ns/op
+BenchmarkUint64/gen=Go1 453813470 2.614 ns/op
+BenchmarkUint64/gen=Go1 415833876 2.625 ns/op
+BenchmarkUint64/gen=Go1 455540632 2.718 ns/op
+BenchmarkUint64/gen=Go1 455852592 2.754 ns/op
+BenchmarkUint64/gen=Go1 459402710 2.748 ns/op
+BenchmarkUint64/gen=Go1 458785825 2.751 ns/op
+BenchmarkUint64/gen=PCG 530420930 2.387 ns/op
+BenchmarkUint64/gen=PCG 518263710 2.307 ns/op
+BenchmarkUint64/gen=PCG 518141296 2.578 ns/op
+BenchmarkUint64/gen=PCG 470295622 2.342 ns/op
+BenchmarkUint64/gen=PCG 505848078 2.424 ns/op
+BenchmarkUint64/gen=PCG 492352374 2.578 ns/op
+BenchmarkUint64/gen=PCG 486658026 2.426 ns/op
+BenchmarkUint64/gen=PCG 484925206 2.589 ns/op
+BenchmarkUint64/gen=PCG 491887735 2.457 ns/op
+BenchmarkUint64/gen=PCG 467795222 2.446 ns/op
+BenchmarkUint64/gen=PCG 467133160 2.435 ns/op
+BenchmarkUint64/gen=PCG 459490864 2.455 ns/op
+BenchmarkUint64/gen=PCG 488564179 2.441 ns/op
+BenchmarkUint64/gen=PCG 465279416 2.430 ns/op
+BenchmarkUint64/gen=PCG 491153704 2.440 ns/op
+BenchmarkUint64/gen=PCG 479651137 2.436 ns/op
+BenchmarkUint64/gen=PCG 489214768 2.469 ns/op
+BenchmarkUint64/gen=PCG 487564098 2.625 ns/op
+BenchmarkUint64/gen=PCG 516585642 2.646 ns/op
+BenchmarkUint64/gen=PCG 498106208 2.453 ns/op
+BenchmarkUint64/gen=ChaCha8 282307276 4.166 ns/op
+BenchmarkUint64/gen=ChaCha8 286550301 4.464 ns/op
+BenchmarkUint64/gen=ChaCha8 287614020 4.437 ns/op
+BenchmarkUint64/gen=ChaCha8 301871100 4.223 ns/op
+BenchmarkUint64/gen=ChaCha8 283068900 4.341 ns/op
+BenchmarkUint64/gen=ChaCha8 295987352 4.311 ns/op
+BenchmarkUint64/gen=ChaCha8 278071357 4.103 ns/op
+BenchmarkUint64/gen=ChaCha8 290765349 4.290 ns/op
+BenchmarkUint64/gen=ChaCha8 290488887 4.262 ns/op
+BenchmarkUint64/gen=ChaCha8 289824722 4.252 ns/op
+BenchmarkUint64/gen=ChaCha8 279374494 4.261 ns/op
+BenchmarkUint64/gen=ChaCha8 289523083 4.128 ns/op
+BenchmarkUint64/gen=ChaCha8 288982600 4.116 ns/op
+BenchmarkUint64/gen=ChaCha8 282574383 4.130 ns/op
+BenchmarkUint64/gen=ChaCha8 287740537 4.222 ns/op
+BenchmarkUint64/gen=ChaCha8 290783871 4.211 ns/op
+BenchmarkUint64/gen=ChaCha8 287406134 4.097 ns/op
+BenchmarkUint64/gen=ChaCha8 290829266 4.099 ns/op
+BenchmarkUint64/gen=ChaCha8 290004253 4.190 ns/op
+BenchmarkUint64/gen=ChaCha8 288885505 4.100 ns/op
+BenchmarkN1000/gen=Go1 251183932 4.931 ns/op
+BenchmarkN1000/gen=Go1 250341096 4.762 ns/op
+BenchmarkN1000/gen=Go1 242935207 4.800 ns/op
+BenchmarkN1000/gen=Go1 250998847 4.944 ns/op
+BenchmarkN1000/gen=Go1 243694027 4.960 ns/op
+BenchmarkN1000/gen=Go1 248946848 4.936 ns/op
+BenchmarkN1000/gen=Go1 246924204 4.780 ns/op
+BenchmarkN1000/gen=Go1 249599152 4.986 ns/op
+BenchmarkN1000/gen=Go1 247641769 4.810 ns/op
+BenchmarkN1000/gen=Go1 248824848 4.899 ns/op
+BenchmarkN1000/gen=Go1 242688060 4.788 ns/op
+BenchmarkN1000/gen=Go1 251056945 4.933 ns/op
+BenchmarkN1000/gen=Go1 246579579 4.781 ns/op
+BenchmarkN1000/gen=Go1 251057044 4.778 ns/op
+BenchmarkN1000/gen=Go1 251118888 4.777 ns/op
+BenchmarkN1000/gen=Go1 247406551 4.754 ns/op
+BenchmarkN1000/gen=Go1 251010050 4.767 ns/op
+BenchmarkN1000/gen=Go1 251778279 4.859 ns/op
+BenchmarkN1000/gen=Go1 251145460 4.768 ns/op
+BenchmarkN1000/gen=Go1 249336576 4.834 ns/op
+BenchmarkN1000/gen=PCG 305766882 3.847 ns/op
+BenchmarkN1000/gen=PCG 306649372 3.823 ns/op
+BenchmarkN1000/gen=PCG 312522561 3.980 ns/op
+BenchmarkN1000/gen=PCG 312156991 3.850 ns/op
+BenchmarkN1000/gen=PCG 308484327 3.995 ns/op
+BenchmarkN1000/gen=PCG 298843122 3.836 ns/op
+BenchmarkN1000/gen=PCG 307939028 4.039 ns/op
+BenchmarkN1000/gen=PCG 299383348 3.880 ns/op
+BenchmarkN1000/gen=PCG 313467501 3.822 ns/op
+BenchmarkN1000/gen=PCG 311956076 3.830 ns/op
+BenchmarkN1000/gen=PCG 309709939 3.854 ns/op
+BenchmarkN1000/gen=PCG 298318993 3.829 ns/op
+BenchmarkN1000/gen=PCG 309628544 4.001 ns/op
+BenchmarkN1000/gen=PCG 311175416 3.828 ns/op
+BenchmarkN1000/gen=PCG 312210010 3.829 ns/op
+BenchmarkN1000/gen=PCG 301387156 3.826 ns/op
+BenchmarkN1000/gen=PCG 307595546 3.994 ns/op
+BenchmarkN1000/gen=PCG 295382478 3.869 ns/op
+BenchmarkN1000/gen=PCG 308788447 3.859 ns/op
+BenchmarkN1000/gen=PCG 305520110 3.840 ns/op
+BenchmarkN1000/gen=ChaCha8 207213154 5.813 ns/op
+BenchmarkN1000/gen=ChaCha8 209254837 5.829 ns/op
+BenchmarkN1000/gen=ChaCha8 206958278 5.818 ns/op
+BenchmarkN1000/gen=ChaCha8 208763868 5.695 ns/op
+BenchmarkN1000/gen=ChaCha8 207762112 5.687 ns/op
+BenchmarkN1000/gen=ChaCha8 208399297 5.691 ns/op
+BenchmarkN1000/gen=ChaCha8 209910385 5.690 ns/op
+BenchmarkN1000/gen=ChaCha8 208681747 5.695 ns/op
+BenchmarkN1000/gen=ChaCha8 208997820 5.829 ns/op
+BenchmarkN1000/gen=ChaCha8 209400973 5.666 ns/op
+BenchmarkN1000/gen=ChaCha8 210770055 5.690 ns/op
+BenchmarkN1000/gen=ChaCha8 206244123 5.681 ns/op
+BenchmarkN1000/gen=ChaCha8 210359781 5.691 ns/op
+BenchmarkN1000/gen=ChaCha8 209800567 5.829 ns/op
+BenchmarkN1000/gen=ChaCha8 209054086 5.839 ns/op
+BenchmarkN1000/gen=ChaCha8 209088144 5.895 ns/op
+BenchmarkN1000/gen=ChaCha8 209122225 5.677 ns/op
+BenchmarkN1000/gen=ChaCha8 209745876 5.815 ns/op
+BenchmarkN1000/gen=ChaCha8 206339786 5.719 ns/op
+BenchmarkN1000/gen=ChaCha8 207038253 5.715 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.05 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.26 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.28 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.26 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 121564122 10.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 122184573 9.896 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 120571216 10.35 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.12 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.12 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.43 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.13 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.15 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 122038940 10.12 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.31 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.17 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.42 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 100000000 10.12 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 121020603 9.832 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 121232760 10.06 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 121695771 9.909 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 208181632 6.145 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 196336346 5.998 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 193921022 5.904 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 196289947 5.889 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 198445891 5.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 199377480 6.035 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 193679656 5.968 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 196101483 6.077 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 198346352 6.074 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 200462896 5.955 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 200280913 6.024 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 200052454 6.019 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 201810616 6.019 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 196724046 6.197 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 184044386 5.941 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 198800257 6.176 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 189896362 7.028 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 166573485 7.091 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 162222580 7.506 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 193160742 6.012 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 330348711 4.022 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 295452715 4.105 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 287366962 4.077 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 266847720 4.071 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 286092572 4.160 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 286074561 4.070 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 288181815 4.030 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 285736814 4.214 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 286982382 4.054 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 282569384 4.082 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 278115906 4.187 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 277827867 4.051 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 283946516 4.125 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 281099088 4.023 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 286738914 4.047 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 287893564 4.012 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 277413362 4.076 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 291286927 4.129 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 296759478 4.044 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 287062783 4.146 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 335993431 3.721 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 299661964 3.867 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 288584877 3.791 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 292066426 3.807 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 321131377 4.079 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 282122676 4.512 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 258482367 4.246 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 281636467 4.347 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 274872669 4.613 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 242648113 4.788 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 277057204 4.504 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 257256415 4.387 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 301910164 3.851 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 332125892 3.862 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 302637520 3.993 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 286173775 4.049 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 309899122 3.964 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 291456481 4.075 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 321424089 3.818 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 331866571 3.925 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 69992695 14.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 82836612 14.00 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 86443946 14.06 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 83061727 14.15 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 84331656 14.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 85312117 13.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 84069754 14.67 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 84674769 13.95 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 83299122 14.02 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 84512397 14.67 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 81926982 17.52 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 67629800 17.62 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 75415392 17.70 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 60223032 16.67 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 80757907 14.70 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 81841867 14.76 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 80905788 14.35 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 81388834 14.49 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 80360582 14.40 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 82666495 14.75 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 52425314 23.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 53200629 23.13 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 56018210 22.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 53731107 21.58 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 56007361 22.38 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 53647406 23.22 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 54940868 22.60 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 56118441 22.98 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 49541262 23.26 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 54630172 21.88 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 52945526 22.73 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 52012628 22.57 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 47678624 22.99 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 51436125 23.25 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 47517085 22.90 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 52566636 23.41 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 54926089 22.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 51202389 24.34 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 47801845 23.19 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 51243265 22.13 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 27191900 46.27 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25877389 47.48 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25154056 47.31 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25394958 46.57 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25165254 46.87 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25746432 47.31 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25688688 45.97 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 24878947 47.03 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25528429 46.74 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25463002 46.43 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25014998 46.16 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25451460 46.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25794714 47.29 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 24384193 46.39 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25067740 45.75 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25728037 46.60 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25372083 46.86 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25673646 46.28 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 24918680 47.72 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 25188308 45.73 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 18573051 67.78 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17463746 68.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17262318 69.06 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17344612 68.85 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17626209 68.38 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17472211 68.36 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17502484 68.44 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17265894 68.32 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17863947 68.22 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17711840 68.16 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17516298 68.46 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17482797 68.97 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17604813 68.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17769931 68.86 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17424687 67.85 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17239839 68.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17299294 67.94 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17721722 68.42 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17245218 68.86 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 17462570 69.45 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 172652553 6.539 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 178868865 6.547 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 179347862 6.667 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 181307997 6.653 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 177279594 6.539 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 177842702 6.689 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 177756927 6.914 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 176360196 6.988 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 171004682 6.606 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 172775119 6.580 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 177865905 6.677 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 180889674 6.560 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 173072374 6.552 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 182286099 6.687 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 178229449 6.515 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 173255811 6.553 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 171345114 6.551 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 181195952 6.538 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 181431156 6.986 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 171530257 6.495 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 307798735 4.202 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 289693838 4.130 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 288219416 4.202 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 285232530 4.139 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 289161440 4.165 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 286150276 4.169 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 293759308 4.057 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 294583316 4.123 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 284896767 4.124 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 293408432 4.124 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 286848164 4.068 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 287498232 4.093 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 288040803 4.197 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 284439566 4.204 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 283953016 4.116 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 289504767 4.135 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 283681508 4.164 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 292501617 4.173 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 271325784 4.067 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 287534554 4.105 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 468755899 2.728 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 429521190 2.855 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 413872390 2.807 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 400241012 2.818 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 390194790 2.759 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 415233708 2.819 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 421127184 2.762 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 384497576 2.738 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 402970855 2.788 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 397371697 2.752 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 411855042 2.776 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 404868033 2.779 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 416062484 2.751 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 399339963 2.769 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 425195881 2.768 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 425327466 2.759 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 415325266 2.795 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 398750366 2.787 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 424328752 2.775 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 399354784 2.815 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 473677053 2.560 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 460510476 2.564 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 455714691 2.552 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 457948490 2.585 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 460344309 2.554 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 460172287 2.562 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 458867004 2.570 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 458878399 2.558 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 454679448 2.635 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 461848224 2.566 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 457160178 2.600 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 458290054 2.598 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 458549030 2.570 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 435960618 2.602 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 459965470 2.571 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 459527672 2.599 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 461059579 2.550 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 440442795 2.548 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 458244168 2.596 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 462100503 2.557 ns/op
+PASS
diff --git a/_content/blog/chacha8rand/intel32.svg b/_content/blog/chacha8rand/intel32.svg
new file mode 100644
index 0000000..23367fa
--- /dev/null
+++ b/_content/blog/chacha8rand/intel32.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>11th Gen Intel Core i7-1185G7 running 32-bit code</tspan></text>
+<rect x='5' y='25' height='20' width='96' fill='#ffaaaa' stroke='black' />
+<text x='98' y='45' text-anchor='end'><tspan dy='-0.5em'>3.8ns</tspan></text>
+<text x='106' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='284' fill='#ccccff' stroke='black' />
+<text x='286' y='65' text-anchor='end'><tspan dy='-0.5em'>11.4ns</tspan></text>
+<text x='10' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='213' fill='#ffffaa' stroke='black' />
+<text x='215' y='85' text-anchor='end'><tspan dy='-0.5em'>8.5ns</tspan></text>
+<text x='10' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='625' fill='#ffaaaa' stroke='black' />
+<text x='392' y='115' text-anchor='end'><tspan dy='-0.5em'>25.0ns</tspan></text>
+<text x='10' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='373' fill='#ccccff' stroke='black' />
+<text x='375' y='135' text-anchor='end'><tspan dy='-0.5em'>14.9ns</tspan></text>
+<text x='10' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='294' fill='#ffffaa' stroke='black' />
+<text x='296' y='155' text-anchor='end'><tspan dy='-0.5em'>11.8ns</tspan></text>
+<text x='10' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/intel32.txt b/_content/blog/chacha8rand/intel32.txt
new file mode 100644
index 0000000..9ef67c3
--- /dev/null
+++ b/_content/blog/chacha8rand/intel32.txt
@@ -0,0 +1,365 @@
+goos: linux
+goarch: 386
+pkg: randtest
+cpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
+BenchmarkUint64/gen=Go1 310236878 3.585 ns/op
+BenchmarkUint64/gen=Go1 332838411 3.984 ns/op
+BenchmarkUint64/gen=Go1 298234956 3.628 ns/op
+BenchmarkUint64/gen=Go1 325387472 4.022 ns/op
+BenchmarkUint64/gen=Go1 328728834 3.727 ns/op
+BenchmarkUint64/gen=Go1 299209365 3.736 ns/op
+BenchmarkUint64/gen=Go1 298636105 3.849 ns/op
+BenchmarkUint64/gen=Go1 289409551 3.696 ns/op
+BenchmarkUint64/gen=Go1 314631790 3.730 ns/op
+BenchmarkUint64/gen=Go1 293297967 3.730 ns/op
+BenchmarkUint64/gen=Go1 291562651 3.841 ns/op
+BenchmarkUint64/gen=Go1 285489534 3.901 ns/op
+BenchmarkUint64/gen=Go1 318144854 4.201 ns/op
+BenchmarkUint64/gen=Go1 315131691 4.220 ns/op
+BenchmarkUint64/gen=Go1 280163476 3.967 ns/op
+BenchmarkUint64/gen=Go1 322733989 3.808 ns/op
+BenchmarkUint64/gen=Go1 314619548 3.918 ns/op
+BenchmarkUint64/gen=Go1 304683948 3.816 ns/op
+BenchmarkUint64/gen=Go1 284080200 3.826 ns/op
+BenchmarkUint64/gen=Go1 305939929 3.777 ns/op
+BenchmarkUint64/gen=PCG 100000000 10.70 ns/op
+BenchmarkUint64/gen=PCG 100000000 10.84 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.04 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.50 ns/op
+BenchmarkUint64/gen=PCG 99620388 11.91 ns/op
+BenchmarkUint64/gen=PCG 96077053 11.94 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.45 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.38 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.96 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.32 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.40 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.37 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.43 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.27 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.26 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.27 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.74 ns/op
+BenchmarkUint64/gen=PCG 97159076 11.21 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.44 ns/op
+BenchmarkUint64/gen=PCG 100000000 11.37 ns/op
+BenchmarkUint64/gen=ChaCha8 145370481 8.235 ns/op
+BenchmarkUint64/gen=ChaCha8 144173784 8.591 ns/op
+BenchmarkUint64/gen=ChaCha8 145116001 8.550 ns/op
+BenchmarkUint64/gen=ChaCha8 144956100 8.928 ns/op
+BenchmarkUint64/gen=ChaCha8 120997957 10.16 ns/op
+BenchmarkUint64/gen=ChaCha8 129174708 8.908 ns/op
+BenchmarkUint64/gen=ChaCha8 122256921 9.903 ns/op
+BenchmarkUint64/gen=ChaCha8 100000000 10.41 ns/op
+BenchmarkUint64/gen=ChaCha8 126693458 9.067 ns/op
+BenchmarkUint64/gen=ChaCha8 137775050 8.623 ns/op
+BenchmarkUint64/gen=ChaCha8 145022503 8.521 ns/op
+BenchmarkUint64/gen=ChaCha8 145810646 8.225 ns/op
+BenchmarkUint64/gen=ChaCha8 143206749 8.208 ns/op
+BenchmarkUint64/gen=ChaCha8 144909116 8.265 ns/op
+BenchmarkUint64/gen=ChaCha8 145124754 8.482 ns/op
+BenchmarkUint64/gen=ChaCha8 145989057 8.491 ns/op
+BenchmarkUint64/gen=ChaCha8 145955394 8.180 ns/op
+BenchmarkUint64/gen=ChaCha8 145562198 8.164 ns/op
+BenchmarkUint64/gen=ChaCha8 141988984 8.227 ns/op
+BenchmarkUint64/gen=ChaCha8 141963452 8.222 ns/op
+BenchmarkN1000/gen=Go1 48584952 25.61 ns/op
+BenchmarkN1000/gen=Go1 48423482 25.95 ns/op
+BenchmarkN1000/gen=Go1 44306685 25.62 ns/op
+BenchmarkN1000/gen=Go1 47266676 24.63 ns/op
+BenchmarkN1000/gen=Go1 47772160 24.79 ns/op
+BenchmarkN1000/gen=Go1 47288994 25.34 ns/op
+BenchmarkN1000/gen=Go1 47288532 24.69 ns/op
+BenchmarkN1000/gen=Go1 48337402 24.70 ns/op
+BenchmarkN1000/gen=Go1 48092163 24.76 ns/op
+BenchmarkN1000/gen=Go1 44913772 24.87 ns/op
+BenchmarkN1000/gen=Go1 48338854 24.64 ns/op
+BenchmarkN1000/gen=Go1 48386048 25.37 ns/op
+BenchmarkN1000/gen=Go1 47017272 24.90 ns/op
+BenchmarkN1000/gen=Go1 49023552 24.71 ns/op
+BenchmarkN1000/gen=Go1 47845981 25.47 ns/op
+BenchmarkN1000/gen=Go1 46227170 24.82 ns/op
+BenchmarkN1000/gen=Go1 48264859 25.42 ns/op
+BenchmarkN1000/gen=Go1 42327210 24.71 ns/op
+BenchmarkN1000/gen=Go1 47693900 24.78 ns/op
+BenchmarkN1000/gen=Go1 49452092 24.79 ns/op
+BenchmarkN1000/gen=PCG 81561084 14.77 ns/op
+BenchmarkN1000/gen=PCG 80696214 14.66 ns/op
+BenchmarkN1000/gen=PCG 81502321 15.04 ns/op
+BenchmarkN1000/gen=PCG 82148899 15.32 ns/op
+BenchmarkN1000/gen=PCG 84353749 15.02 ns/op
+BenchmarkN1000/gen=PCG 76504855 14.84 ns/op
+BenchmarkN1000/gen=PCG 83091495 14.77 ns/op
+BenchmarkN1000/gen=PCG 79429915 14.65 ns/op
+BenchmarkN1000/gen=PCG 80501642 14.62 ns/op
+BenchmarkN1000/gen=PCG 79837689 15.20 ns/op
+BenchmarkN1000/gen=PCG 83213920 15.28 ns/op
+BenchmarkN1000/gen=PCG 80503575 15.31 ns/op
+BenchmarkN1000/gen=PCG 86721286 14.58 ns/op
+BenchmarkN1000/gen=PCG 80817805 14.68 ns/op
+BenchmarkN1000/gen=PCG 82144165 14.81 ns/op
+BenchmarkN1000/gen=PCG 80560041 14.72 ns/op
+BenchmarkN1000/gen=PCG 81508952 15.33 ns/op
+BenchmarkN1000/gen=PCG 80639514 14.65 ns/op
+BenchmarkN1000/gen=PCG 77295781 15.28 ns/op
+BenchmarkN1000/gen=PCG 78675909 14.90 ns/op
+BenchmarkN1000/gen=ChaCha8 94723138 11.73 ns/op
+BenchmarkN1000/gen=ChaCha8 97491613 11.76 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.84 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.86 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.72 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.73 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.77 ns/op
+BenchmarkN1000/gen=ChaCha8 96885658 11.85 ns/op
+BenchmarkN1000/gen=ChaCha8 95480881 11.85 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 12.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.97 ns/op
+BenchmarkN1000/gen=ChaCha8 97590236 12.08 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.73 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.70 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.83 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.72 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.86 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 12.18 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.79 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 11.80 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34605146 34.34 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34371721 34.42 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 30572155 35.30 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 30952399 34.16 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34831476 37.19 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34737337 34.43 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34285664 34.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34861201 34.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34436208 34.41 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 31700251 34.19 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34710444 37.10 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 35439583 37.18 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 31005135 35.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 35115408 34.43 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 31837101 34.14 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 34710212 37.06 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 30980521 35.18 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 35037562 36.98 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 35637962 34.22 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 31685060 34.51 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 67285170 20.74 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 38967609 30.15 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 33469290 36.28 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 34680200 37.06 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 31080394 34.88 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 36370231 34.69 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 39625000 31.96 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 39915202 30.15 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 40351436 32.08 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 38677950 31.98 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 38259876 30.55 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 37308992 31.20 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 40759838 32.03 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 43437604 30.07 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 36932040 30.36 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 41241576 33.49 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 36862412 29.86 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 39473557 31.86 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 39979826 32.63 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 39818918 32.16 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 89662188 14.00 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 51155270 23.13 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 48610194 25.60 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 55177682 24.32 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 46398068 24.96 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 53389734 25.79 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 52422652 22.69 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 45450752 25.46 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 50887880 25.47 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 55617460 22.42 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 52629279 25.70 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 54341308 25.72 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 53303504 25.43 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 51042235 25.06 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 50315660 25.03 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 50930179 25.19 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 46704860 25.54 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 49754622 25.34 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 49340294 24.92 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 57639752 25.68 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 97543346 14.38 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 57515425 20.41 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 64057261 18.73 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 62823592 19.96 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 63790854 19.77 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 58974756 19.43 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 60772142 19.75 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 72013694 19.49 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 69831114 19.59 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 63929118 18.66 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 60770690 18.42 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 61501707 19.90 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 57937930 19.63 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 63205144 19.76 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 63493940 19.17 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 60817940 19.80 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 62512162 19.73 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 61127630 18.57 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 60885651 19.35 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 61723339 19.11 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 31106632 33.36 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 33283273 34.45 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34666820 34.73 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35340022 34.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35236844 34.64 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 36078363 33.54 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35470927 33.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34271374 35.90 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34912861 33.65 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35448723 35.08 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35981607 34.79 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34228774 34.89 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35958483 34.84 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 30411904 34.88 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35487165 34.77 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35399636 33.66 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34027130 33.66 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 35189541 33.70 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34158829 33.55 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 34678452 33.66 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 26136361 46.73 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 28723123 50.19 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 28173121 59.34 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 20898032 59.00 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 26800491 49.84 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25544940 51.81 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 24609952 47.43 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 26505705 47.11 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25555818 46.86 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 26275183 46.50 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25823550 47.31 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25116286 46.98 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25270855 46.42 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 31144814 47.26 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25738870 47.29 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 24756081 45.44 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25108598 46.98 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 26063348 47.58 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 26066718 45.17 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 25200764 47.69 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14573840 83.94 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14367390 86.99 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14112140 84.72 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13976674 86.58 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13601058 86.48 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14097874 86.63 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13739510 84.12 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14301259 84.81 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13498388 88.46 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13712292 84.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14012499 88.02 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13649610 84.70 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14406957 85.87 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13782291 84.00 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13952542 84.40 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13744520 85.23 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13883787 86.50 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13938579 85.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 14463885 86.31 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 13672564 86.82 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9804578 126.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9186406 126.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9090817 127.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9167095 126.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9109807 127.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9303398 126.9 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9146719 127.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9213652 127.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9152467 130.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9345219 126.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9088300 126.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9138619 127.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9288307 127.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9043153 127.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9161022 127.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9242600 125.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9113726 125.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9074158 126.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9389074 124.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9057013 128.6 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 67041633 15.85 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 82876618 15.09 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 81386775 14.53 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 82439024 14.52 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 77389516 14.71 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 79736968 15.15 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 79758019 15.10 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 81269874 14.66 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 81569888 15.11 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 81475764 15.05 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 80117510 14.49 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 78953809 15.12 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 74897487 15.68 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 79045951 14.54 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 81997401 14.59 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 78276496 15.22 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 78723560 15.02 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 81254977 15.23 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 78370602 14.60 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 78456411 15.13 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 133938334 9.185 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 128570914 9.221 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 131604526 9.087 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 127791061 9.131 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 129711400 9.073 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 129251612 9.047 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 132549811 9.082 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 131153866 9.002 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 131594293 9.143 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 130231526 9.521 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 100000000 10.88 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 116732770 10.64 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 120354512 10.05 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 114667270 9.687 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 129849452 9.073 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 131152192 9.013 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 131397604 9.059 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 129757438 9.187 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 130947172 9.070 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 131493350 9.314 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 212878635 6.222 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 186772015 6.241 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 185844243 6.153 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 192012954 6.188 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 184259464 6.200 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 190187030 6.174 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 186216925 6.178 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 192033686 6.233 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 175487704 7.191 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 191504306 7.106 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 136051830 7.576 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 160376085 6.278 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 192779596 6.141 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 193848541 6.117 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 192747231 6.126 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 190696910 6.130 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 191304439 6.131 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 188803216 6.254 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 191598518 6.127 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 189429398 6.135 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 201420337 6.121 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 196082745 6.171 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 194678050 6.174 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 194667609 6.152 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 193297408 6.085 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 195313484 6.048 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 194530964 6.172 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 195553826 6.051 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 192203902 6.145 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 192922167 6.096 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 193670862 6.012 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 192735021 6.162 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 194118482 6.142 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 195283214 6.079 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 194807191 6.055 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 191894031 6.231 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 193931673 6.034 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 195550431 6.088 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 193361000 6.058 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 197297300 6.129 ns/op
+PASS
diff --git a/_content/blog/chacha8rand/m1.svg b/_content/blog/chacha8rand/m1.svg
new file mode 100644
index 0000000..bca92a5
--- /dev/null
+++ b/_content/blog/chacha8rand/m1.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>Apple M1</tspan></text>
+<rect x='5' y='25' height='20' width='62' fill='#ffaaaa' stroke='black' />
+<text x='64' y='45' text-anchor='end'><tspan dy='-0.5em'>2.5ns</tspan></text>
+<text x='72' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='104' fill='#ccccff' stroke='black' />
+<text x='106' y='65' text-anchor='end'><tspan dy='-0.5em'>4.2ns</tspan></text>
+<text x='114' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='116' fill='#ffffaa' stroke='black' />
+<text x='118' y='85' text-anchor='end'><tspan dy='-0.5em'>4.6ns</tspan></text>
+<text x='126' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='76' fill='#ffaaaa' stroke='black' />
+<text x='78' y='115' text-anchor='end'><tspan dy='-0.5em'>3.1ns</tspan></text>
+<text x='86' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='102' fill='#ccccff' stroke='black' />
+<text x='104' y='135' text-anchor='end'><tspan dy='-0.5em'>4.1ns</tspan></text>
+<text x='112' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='121' fill='#ffffaa' stroke='black' />
+<text x='123' y='155' text-anchor='end'><tspan dy='-0.5em'>4.9ns</tspan></text>
+<text x='131' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/m1.txt b/_content/blog/chacha8rand/m1.txt
new file mode 100644
index 0000000..1fd84c1
--- /dev/null
+++ b/_content/blog/chacha8rand/m1.txt
@@ -0,0 +1,365 @@
+goos: darwin
+goarch: arm64
+pkg: randtest
+cpu: Apple M1 Pro
+BenchmarkUint64/gen=Go1 459038247 2.480 ns/op
+BenchmarkUint64/gen=Go1 482946537 2.451 ns/op
+BenchmarkUint64/gen=Go1 482933336 2.570 ns/op
+BenchmarkUint64/gen=Go1 474254720 2.523 ns/op
+BenchmarkUint64/gen=Go1 473248634 2.526 ns/op
+BenchmarkUint64/gen=Go1 477388762 2.505 ns/op
+BenchmarkUint64/gen=Go1 480948832 2.522 ns/op
+BenchmarkUint64/gen=Go1 476743602 2.531 ns/op
+BenchmarkUint64/gen=Go1 474830520 2.565 ns/op
+BenchmarkUint64/gen=Go1 468395500 2.522 ns/op
+BenchmarkUint64/gen=Go1 481696213 2.461 ns/op
+BenchmarkUint64/gen=Go1 484085194 2.468 ns/op
+BenchmarkUint64/gen=Go1 482813432 2.445 ns/op
+BenchmarkUint64/gen=Go1 477989494 2.508 ns/op
+BenchmarkUint64/gen=Go1 483186049 2.527 ns/op
+BenchmarkUint64/gen=Go1 469008778 2.523 ns/op
+BenchmarkUint64/gen=Go1 471916772 2.538 ns/op
+BenchmarkUint64/gen=Go1 473054535 2.554 ns/op
+BenchmarkUint64/gen=Go1 471814101 2.527 ns/op
+BenchmarkUint64/gen=Go1 476288836 2.518 ns/op
+BenchmarkUint64/gen=PCG 285597580 4.187 ns/op
+BenchmarkUint64/gen=PCG 287637058 4.170 ns/op
+BenchmarkUint64/gen=PCG 287512665 4.160 ns/op
+BenchmarkUint64/gen=PCG 285601347 4.201 ns/op
+BenchmarkUint64/gen=PCG 284428599 4.203 ns/op
+BenchmarkUint64/gen=PCG 285354506 4.205 ns/op
+BenchmarkUint64/gen=PCG 285786639 4.186 ns/op
+BenchmarkUint64/gen=PCG 285428488 4.183 ns/op
+BenchmarkUint64/gen=PCG 287914431 4.171 ns/op
+BenchmarkUint64/gen=PCG 285900858 4.190 ns/op
+BenchmarkUint64/gen=PCG 286465119 4.203 ns/op
+BenchmarkUint64/gen=PCG 284216425 4.218 ns/op
+BenchmarkUint64/gen=PCG 286007443 4.177 ns/op
+BenchmarkUint64/gen=PCG 288256028 4.182 ns/op
+BenchmarkUint64/gen=PCG 284846013 4.211 ns/op
+BenchmarkUint64/gen=PCG 285176269 4.205 ns/op
+BenchmarkUint64/gen=PCG 284892111 4.210 ns/op
+BenchmarkUint64/gen=PCG 287306155 4.197 ns/op
+BenchmarkUint64/gen=PCG 283381057 4.205 ns/op
+BenchmarkUint64/gen=PCG 284846774 4.194 ns/op
+BenchmarkUint64/gen=ChaCha8 256325908 4.737 ns/op
+BenchmarkUint64/gen=ChaCha8 259835448 4.776 ns/op
+BenchmarkUint64/gen=ChaCha8 256105742 4.742 ns/op
+BenchmarkUint64/gen=ChaCha8 256777612 4.728 ns/op
+BenchmarkUint64/gen=ChaCha8 250844029 4.700 ns/op
+BenchmarkUint64/gen=ChaCha8 254119470 4.659 ns/op
+BenchmarkUint64/gen=ChaCha8 257531751 4.741 ns/op
+BenchmarkUint64/gen=ChaCha8 245294330 4.801 ns/op
+BenchmarkUint64/gen=ChaCha8 261129937 4.547 ns/op
+BenchmarkUint64/gen=ChaCha8 264982798 4.610 ns/op
+BenchmarkUint64/gen=ChaCha8 265796208 4.602 ns/op
+BenchmarkUint64/gen=ChaCha8 265899987 4.598 ns/op
+BenchmarkUint64/gen=ChaCha8 265069353 4.586 ns/op
+BenchmarkUint64/gen=ChaCha8 269105559 4.581 ns/op
+BenchmarkUint64/gen=ChaCha8 260925388 4.554 ns/op
+BenchmarkUint64/gen=ChaCha8 269689788 4.582 ns/op
+BenchmarkUint64/gen=ChaCha8 263342937 4.587 ns/op
+BenchmarkUint64/gen=ChaCha8 261144926 4.604 ns/op
+BenchmarkUint64/gen=ChaCha8 261922141 4.564 ns/op
+BenchmarkUint64/gen=ChaCha8 264669903 4.611 ns/op
+BenchmarkN1000/gen=Go1 390983274 3.074 ns/op
+BenchmarkN1000/gen=Go1 391178277 3.066 ns/op
+BenchmarkN1000/gen=Go1 391096736 3.065 ns/op
+BenchmarkN1000/gen=Go1 391588675 3.065 ns/op
+BenchmarkN1000/gen=Go1 391422146 3.056 ns/op
+BenchmarkN1000/gen=Go1 392373832 3.056 ns/op
+BenchmarkN1000/gen=Go1 392431843 3.056 ns/op
+BenchmarkN1000/gen=Go1 392376398 3.056 ns/op
+BenchmarkN1000/gen=Go1 392487889 3.055 ns/op
+BenchmarkN1000/gen=Go1 392313274 3.056 ns/op
+BenchmarkN1000/gen=Go1 392376612 3.056 ns/op
+BenchmarkN1000/gen=Go1 392393612 3.057 ns/op
+BenchmarkN1000/gen=Go1 392387251 3.060 ns/op
+BenchmarkN1000/gen=Go1 392651793 3.056 ns/op
+BenchmarkN1000/gen=Go1 392628722 3.057 ns/op
+BenchmarkN1000/gen=Go1 392380942 3.057 ns/op
+BenchmarkN1000/gen=Go1 392305899 3.056 ns/op
+BenchmarkN1000/gen=Go1 392567068 3.058 ns/op
+BenchmarkN1000/gen=Go1 392429757 3.054 ns/op
+BenchmarkN1000/gen=Go1 392176194 3.056 ns/op
+BenchmarkN1000/gen=PCG 290826982 4.097 ns/op
+BenchmarkN1000/gen=PCG 292672426 4.099 ns/op
+BenchmarkN1000/gen=PCG 292839195 4.101 ns/op
+BenchmarkN1000/gen=PCG 292147144 4.091 ns/op
+BenchmarkN1000/gen=PCG 292650092 4.195 ns/op
+BenchmarkN1000/gen=PCG 285833240 4.153 ns/op
+BenchmarkN1000/gen=PCG 293108112 4.088 ns/op
+BenchmarkN1000/gen=PCG 292472162 4.096 ns/op
+BenchmarkN1000/gen=PCG 292788764 4.098 ns/op
+BenchmarkN1000/gen=PCG 293642936 4.093 ns/op
+BenchmarkN1000/gen=PCG 292720260 4.112 ns/op
+BenchmarkN1000/gen=PCG 292064722 4.099 ns/op
+BenchmarkN1000/gen=PCG 292080362 4.103 ns/op
+BenchmarkN1000/gen=PCG 293372559 4.112 ns/op
+BenchmarkN1000/gen=PCG 292461291 4.085 ns/op
+BenchmarkN1000/gen=PCG 295208640 4.091 ns/op
+BenchmarkN1000/gen=PCG 292404458 4.092 ns/op
+BenchmarkN1000/gen=PCG 293202376 4.076 ns/op
+BenchmarkN1000/gen=PCG 293512695 4.117 ns/op
+BenchmarkN1000/gen=PCG 292903080 4.086 ns/op
+BenchmarkN1000/gen=ChaCha8 248263640 4.840 ns/op
+BenchmarkN1000/gen=ChaCha8 246836126 4.864 ns/op
+BenchmarkN1000/gen=ChaCha8 247393519 4.872 ns/op
+BenchmarkN1000/gen=ChaCha8 246721410 4.858 ns/op
+BenchmarkN1000/gen=ChaCha8 249500781 4.852 ns/op
+BenchmarkN1000/gen=ChaCha8 246665371 4.860 ns/op
+BenchmarkN1000/gen=ChaCha8 247126743 4.847 ns/op
+BenchmarkN1000/gen=ChaCha8 248777040 4.859 ns/op
+BenchmarkN1000/gen=ChaCha8 246865747 4.864 ns/op
+BenchmarkN1000/gen=ChaCha8 246694254 4.856 ns/op
+BenchmarkN1000/gen=ChaCha8 248074407 4.871 ns/op
+BenchmarkN1000/gen=ChaCha8 247867201 4.866 ns/op
+BenchmarkN1000/gen=ChaCha8 245732509 4.847 ns/op
+BenchmarkN1000/gen=ChaCha8 247628718 4.846 ns/op
+BenchmarkN1000/gen=ChaCha8 246361336 4.871 ns/op
+BenchmarkN1000/gen=ChaCha8 246545748 4.849 ns/op
+BenchmarkN1000/gen=ChaCha8 246687745 4.874 ns/op
+BenchmarkN1000/gen=ChaCha8 246491306 4.864 ns/op
+BenchmarkN1000/gen=ChaCha8 247932730 4.830 ns/op
+BenchmarkN1000/gen=ChaCha8 247311963 4.844 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163058200 7.520 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 157818794 7.361 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163052108 7.337 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162890473 7.358 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162959682 7.337 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163469058 7.338 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162988870 7.359 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163007414 7.360 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163511295 7.361 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162939500 7.358 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162973911 7.362 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163119044 7.338 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162911628 7.374 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162971632 7.335 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162725194 7.342 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162896876 7.360 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162914052 7.360 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 162786175 7.391 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163023284 7.396 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 163574929 7.361 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316812687 3.782 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317096034 3.781 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316665580 3.787 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 315912894 3.785 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316529151 3.786 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316540598 3.787 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316988538 3.788 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316978734 3.788 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317154418 3.781 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316827535 3.784 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316822551 3.788 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317197034 3.787 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317228200 3.780 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316974303 3.786 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317105146 3.902 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 309943202 3.787 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317034180 3.787 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316623178 3.782 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 317401958 3.783 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 316715762 3.786 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615878372 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615361341 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615565338 1.951 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615509162 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615813448 1.951 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615920781 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 616366850 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615702070 1.951 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 616956934 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615079834 1.953 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615723129 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615809103 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 616305121 1.951 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 616277822 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 616275448 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615993633 1.950 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615604678 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615374882 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615895359 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 615701542 1.952 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9796 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9781 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9815 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9784 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9786 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9785 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9782 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9788 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9787 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9789 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9863 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 1.005 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9893 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9857 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9825 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 1.011 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9988 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 1.003 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 1.011 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 978171818 1.424 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 82977027 13.99 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 86612368 13.85 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 88555441 13.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 88971817 13.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 87148082 13.69 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 87714219 13.72 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 86631908 13.62 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 87639748 13.59 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 88389376 13.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 85418115 14.21 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 83680549 14.26 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 85006653 14.30 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 83413705 14.18 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 85415331 14.04 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 82551529 14.10 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 84229239 13.97 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 84632948 13.97 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 82077237 14.02 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 83804488 14.01 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 87770355 13.79 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14132734 85.36 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14276486 84.54 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 13970761 84.95 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14009485 85.60 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14117853 84.72 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 13923812 85.94 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 13954684 86.22 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14015880 84.96 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14148565 79.26 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 16004320 83.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14414796 83.14 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14442489 84.31 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14043525 84.53 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14152681 85.00 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14027608 85.75 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14041615 84.61 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 13931193 85.05 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 13964421 85.62 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 14157823 84.02 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 13932872 85.51 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10097602 119.9 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9911041 119.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10043570 120.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9927853 120.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9948169 119.9 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10044820 121.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10040786 121.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9907219 120.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 12120682 87.56 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 12306582 121.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10010701 120.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10015456 120.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10178896 119.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10045255 118.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9913920 119.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10056834 120.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10043676 120.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10037046 119.9 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9947144 120.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 10037322 121.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9838749 125.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9286296 123.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 10046257 122.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 10149354 128.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 10057302 120.9 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 10126492 123.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9655664 124.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9702921 129.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9376473 130.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9970227 129.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9333805 129.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9360452 131.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9215156 130.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9658808 130.9 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9354256 128.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9148702 129.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 10252042 130.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9620613 130.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9244712 131.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 9591232 130.8 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 212508218 5.600 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 216176096 5.602 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 216166945 5.556 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215924878 5.582 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 214792408 5.559 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215859658 5.541 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215409110 5.560 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215852701 5.560 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 212943724 5.542 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 209487148 5.767 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215235938 5.557 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215773152 5.598 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215754206 5.576 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215834001 5.559 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215648083 5.562 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 213682791 5.559 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215727508 5.551 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 215882634 5.555 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 216227742 5.538 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 216714447 5.557 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419280252 2.861 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418658320 2.860 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419158512 2.862 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419339532 2.871 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418589258 2.864 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418568208 2.858 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418826360 2.860 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419379222 2.860 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419585186 2.859 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419506773 2.857 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419311873 2.867 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419539466 2.858 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 420321553 2.858 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419179315 2.857 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418854622 2.852 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 419359987 2.872 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418090849 2.862 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418923470 2.862 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 417750873 2.859 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 418921825 2.858 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814932043 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 818622291 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814397875 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813803230 1.476 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813231729 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813505089 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813966994 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814432647 1.477 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813681141 1.479 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 819511894 1.473 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814585605 1.477 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813746206 1.477 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813332553 1.476 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 812936529 1.478 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 812301405 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814794400 1.473 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813647349 1.476 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814575934 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 814735395 1.474 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 813770349 1.475 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7399 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7399 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7406 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7413 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7403 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7449 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7404 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7402 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7417 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7401 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7403 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7403 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7403 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7406 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7402 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7400 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7401 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7402 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7405 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7401 ns/op
+PASS
diff --git a/_content/blog/chacha8rand/m3.svg b/_content/blog/chacha8rand/m3.svg
new file mode 100644
index 0000000..88849b7
--- /dev/null
+++ b/_content/blog/chacha8rand/m3.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>Apple M3</tspan></text>
+<rect x='5' y='25' height='20' width='46' fill='#ffaaaa' stroke='black' />
+<text x='48' y='45' text-anchor='end'><tspan dy='-0.5em'>1.9ns</tspan></text>
+<text x='56' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='55' fill='#ccccff' stroke='black' />
+<text x='57' y='65' text-anchor='end'><tspan dy='-0.5em'>2.2ns</tspan></text>
+<text x='65' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='88' fill='#ffffaa' stroke='black' />
+<text x='90' y='85' text-anchor='end'><tspan dy='-0.5em'>3.5ns</tspan></text>
+<text x='98' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='60' fill='#ffaaaa' stroke='black' />
+<text x='62' y='115' text-anchor='end'><tspan dy='-0.5em'>2.4ns</tspan></text>
+<text x='70' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='57' fill='#ccccff' stroke='black' />
+<text x='59' y='135' text-anchor='end'><tspan dy='-0.5em'>2.3ns</tspan></text>
+<text x='67' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='99' fill='#ffffaa' stroke='black' />
+<text x='101' y='155' text-anchor='end'><tspan dy='-0.5em'>4.0ns</tspan></text>
+<text x='109' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/m3.txt b/_content/blog/chacha8rand/m3.txt
new file mode 100644
index 0000000..9510931
--- /dev/null
+++ b/_content/blog/chacha8rand/m3.txt
@@ -0,0 +1,366 @@
+goos: darwin
+goarch: arm64
+pkg: randtest
+cpu: Apple M3 Pro
+BenchmarkUint64/gen=Go1 588151683 1.874 ns/op
+BenchmarkUint64/gen=Go1 640135424 1.884 ns/op
+BenchmarkUint64/gen=Go1 639421393 1.874 ns/op
+BenchmarkUint64/gen=Go1 642835617 1.874 ns/op
+BenchmarkUint64/gen=Go1 640547310 1.888 ns/op
+BenchmarkUint64/gen=Go1 639977530 1.878 ns/op
+BenchmarkUint64/gen=Go1 638120097 1.924 ns/op
+BenchmarkUint64/gen=Go1 639626596 1.878 ns/op
+BenchmarkUint64/gen=Go1 640062441 1.875 ns/op
+BenchmarkUint64/gen=Go1 640857038 1.877 ns/op
+BenchmarkUint64/gen=Go1 640631374 1.871 ns/op
+BenchmarkUint64/gen=Go1 640370560 1.876 ns/op
+BenchmarkUint64/gen=Go1 641268144 1.874 ns/op
+BenchmarkUint64/gen=Go1 637875448 1.874 ns/op
+BenchmarkUint64/gen=Go1 637106124 1.890 ns/op
+BenchmarkUint64/gen=Go1 639245976 1.874 ns/op
+BenchmarkUint64/gen=Go1 638462581 1.874 ns/op
+BenchmarkUint64/gen=Go1 639468670 1.878 ns/op
+BenchmarkUint64/gen=Go1 639649471 1.871 ns/op
+BenchmarkUint64/gen=Go1 639592791 1.879 ns/op
+BenchmarkUint64/gen=PCG 539659642 2.218 ns/op
+BenchmarkUint64/gen=PCG 540414667 2.196 ns/op
+BenchmarkUint64/gen=PCG 544046311 2.214 ns/op
+BenchmarkUint64/gen=PCG 547169630 2.210 ns/op
+BenchmarkUint64/gen=PCG 541873050 2.209 ns/op
+BenchmarkUint64/gen=PCG 541893849 2.208 ns/op
+BenchmarkUint64/gen=PCG 544426218 2.216 ns/op
+BenchmarkUint64/gen=PCG 545805907 2.246 ns/op
+BenchmarkUint64/gen=PCG 516163165 2.210 ns/op
+BenchmarkUint64/gen=PCG 545104047 2.212 ns/op
+BenchmarkUint64/gen=PCG 540983234 2.215 ns/op
+BenchmarkUint64/gen=PCG 539559349 2.215 ns/op
+BenchmarkUint64/gen=PCG 548356682 2.209 ns/op
+BenchmarkUint64/gen=PCG 542390859 2.207 ns/op
+BenchmarkUint64/gen=PCG 543712914 2.210 ns/op
+BenchmarkUint64/gen=PCG 544397197 2.227 ns/op
+BenchmarkUint64/gen=PCG 539149054 2.209 ns/op
+BenchmarkUint64/gen=PCG 543288080 2.210 ns/op
+BenchmarkUint64/gen=PCG 541908738 2.209 ns/op
+BenchmarkUint64/gen=PCG 539534888 2.215 ns/op
+BenchmarkUint64/gen=ChaCha8 350188038 3.422 ns/op
+BenchmarkUint64/gen=ChaCha8 351745198 3.605 ns/op
+BenchmarkUint64/gen=ChaCha8 349773496 3.440 ns/op
+BenchmarkUint64/gen=ChaCha8 349836718 3.437 ns/op
+BenchmarkUint64/gen=ChaCha8 331235622 3.415 ns/op
+BenchmarkUint64/gen=ChaCha8 350673273 3.414 ns/op
+BenchmarkUint64/gen=ChaCha8 350975326 3.426 ns/op
+BenchmarkUint64/gen=ChaCha8 351101464 3.445 ns/op
+BenchmarkUint64/gen=ChaCha8 348933909 3.724 ns/op
+BenchmarkUint64/gen=ChaCha8 350254645 3.658 ns/op
+BenchmarkUint64/gen=ChaCha8 329316848 3.437 ns/op
+BenchmarkUint64/gen=ChaCha8 329477454 3.660 ns/op
+BenchmarkUint64/gen=ChaCha8 349263381 3.658 ns/op
+BenchmarkUint64/gen=ChaCha8 327268004 3.669 ns/op
+BenchmarkUint64/gen=ChaCha8 349705500 3.416 ns/op
+BenchmarkUint64/gen=ChaCha8 350063618 3.673 ns/op
+BenchmarkUint64/gen=ChaCha8 345125644 3.660 ns/op
+BenchmarkUint64/gen=ChaCha8 348763494 3.690 ns/op
+BenchmarkUint64/gen=ChaCha8 350788426 3.454 ns/op
+BenchmarkUint64/gen=ChaCha8 344573611 3.676 ns/op
+BenchmarkN1000/gen=Go1 495535364 2.408 ns/op
+BenchmarkN1000/gen=Go1 496756764 2.409 ns/op
+BenchmarkN1000/gen=Go1 496932561 2.409 ns/op
+BenchmarkN1000/gen=Go1 496825062 2.410 ns/op
+BenchmarkN1000/gen=Go1 497275860 2.408 ns/op
+BenchmarkN1000/gen=Go1 496973295 2.411 ns/op
+BenchmarkN1000/gen=Go1 498218954 2.414 ns/op
+BenchmarkN1000/gen=Go1 496496766 2.462 ns/op
+BenchmarkN1000/gen=Go1 482962248 2.419 ns/op
+BenchmarkN1000/gen=Go1 495566486 2.418 ns/op
+BenchmarkN1000/gen=Go1 491456672 2.411 ns/op
+BenchmarkN1000/gen=Go1 496965234 2.408 ns/op
+BenchmarkN1000/gen=Go1 497384328 2.409 ns/op
+BenchmarkN1000/gen=Go1 497102478 2.412 ns/op
+BenchmarkN1000/gen=Go1 498071616 2.441 ns/op
+BenchmarkN1000/gen=Go1 482348716 2.431 ns/op
+BenchmarkN1000/gen=Go1 496911213 2.415 ns/op
+BenchmarkN1000/gen=Go1 497939773 2.420 ns/op
+BenchmarkN1000/gen=Go1 497968011 2.421 ns/op
+BenchmarkN1000/gen=Go1 495025083 2.418 ns/op
+BenchmarkN1000/gen=PCG 518970068 2.320 ns/op
+BenchmarkN1000/gen=PCG 520583850 2.312 ns/op
+BenchmarkN1000/gen=PCG 516404538 2.315 ns/op
+BenchmarkN1000/gen=PCG 518211721 2.315 ns/op
+BenchmarkN1000/gen=PCG 517871977 2.316 ns/op
+BenchmarkN1000/gen=PCG 518692188 2.314 ns/op
+BenchmarkN1000/gen=PCG 518238577 2.311 ns/op
+BenchmarkN1000/gen=PCG 516232740 2.538 ns/op
+BenchmarkN1000/gen=PCG 502993947 3.166 ns/op
+BenchmarkN1000/gen=PCG 518136112 2.313 ns/op
+BenchmarkN1000/gen=PCG 517561602 2.332 ns/op
+BenchmarkN1000/gen=PCG 519391051 2.313 ns/op
+BenchmarkN1000/gen=PCG 519250021 2.316 ns/op
+BenchmarkN1000/gen=PCG 518102371 2.323 ns/op
+BenchmarkN1000/gen=PCG 515259370 2.310 ns/op
+BenchmarkN1000/gen=PCG 519085867 2.311 ns/op
+BenchmarkN1000/gen=PCG 517250575 2.332 ns/op
+BenchmarkN1000/gen=PCG 518274297 2.313 ns/op
+BenchmarkN1000/gen=PCG 519781567 2.310 ns/op
+BenchmarkN1000/gen=PCG 519736168 2.312 ns/op
+BenchmarkN1000/gen=ChaCha8 299263562 4.013 ns/op
+BenchmarkN1000/gen=ChaCha8 296974600 4.016 ns/op
+BenchmarkN1000/gen=ChaCha8 298851631 4.004 ns/op
+BenchmarkN1000/gen=ChaCha8 301673312 4.011 ns/op
+BenchmarkN1000/gen=ChaCha8 298759276 4.018 ns/op
+BenchmarkN1000/gen=ChaCha8 300455847 3.967 ns/op
+BenchmarkN1000/gen=ChaCha8 299169057 3.977 ns/op
+BenchmarkN1000/gen=ChaCha8 298156028 3.988 ns/op
+BenchmarkN1000/gen=ChaCha8 301252834 4.152 ns/op
+BenchmarkN1000/gen=ChaCha8 301323027 4.019 ns/op
+BenchmarkN1000/gen=ChaCha8 298605636 4.014 ns/op
+BenchmarkN1000/gen=ChaCha8 298887360 4.016 ns/op
+BenchmarkN1000/gen=ChaCha8 299381714 3.972 ns/op
+BenchmarkN1000/gen=ChaCha8 301971273 4.019 ns/op
+BenchmarkN1000/gen=ChaCha8 300170409 4.008 ns/op
+BenchmarkN1000/gen=ChaCha8 300776473 3.989 ns/op
+BenchmarkN1000/gen=ChaCha8 298564650 3.973 ns/op
+BenchmarkN1000/gen=ChaCha8 298000107 3.996 ns/op
+BenchmarkN1000/gen=ChaCha8 299978625 4.017 ns/op
+BenchmarkN1000/gen=ChaCha8 300143630 3.977 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194807882 6.153 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195020582 6.150 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195114256 6.157 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195062850 6.149 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194959735 6.153 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194946710 6.163 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 185521884 6.217 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195006597 6.154 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194938093 6.153 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195256434 6.156 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194900811 6.152 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195182978 6.176 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195007377 6.160 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 193752308 6.153 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194721202 6.158 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194737594 6.155 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194360848 6.147 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195079881 6.154 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 195021783 6.164 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=1 194707576 6.157 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381616878 3.138 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381170847 3.138 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381281360 3.152 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381432550 3.221 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380702253 3.144 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381439069 3.145 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380752736 3.148 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380639208 3.144 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381237552 3.144 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 382294558 3.145 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 379619394 3.142 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380253237 3.157 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381576631 3.141 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380722838 3.143 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381046886 3.139 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380962358 3.139 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 379558106 3.144 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 380242393 3.144 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381083592 3.152 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=2 381829172 3.139 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 743668554 1.609 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 744373965 1.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 744696364 1.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 745078602 1.619 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 743813751 1.607 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 746688129 1.606 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 742987668 1.607 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 745624308 1.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 743148136 1.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 744160470 1.605 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 743826818 1.606 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 743181697 1.606 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 747356808 1.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 738289082 1.604 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 745605970 1.603 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 745053931 1.604 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 747052642 1.608 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 748207416 1.606 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 744057998 1.604 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=4 745299373 1.603 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9694 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9681 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9681 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9662 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9675 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9671 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9760 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 1.002 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9684 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9668 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9766 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9682 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9679 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9679 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9676 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9692 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9685 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9673 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9670 ns/op
+BenchmarkN1000Parallel/gen=Go1/proc=8 1000000000 0.9689 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214553458 5.582 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214624818 5.585 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214368988 5.585 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214802534 5.583 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214893026 5.583 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214976373 5.583 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 215001714 5.583 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214621090 5.582 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214710390 5.596 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 210008860 5.665 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214802822 5.585 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214900146 5.585 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214842049 5.585 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214797007 5.586 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214922373 5.583 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214906560 5.582 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214968222 5.595 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 213579471 5.582 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214563896 5.652 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=1 214393261 5.582 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33432585 37.19 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33374161 38.48 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33651031 35.83 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33970354 40.33 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33511790 37.35 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 34011596 36.33 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 35102686 36.21 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 34478217 35.11 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33896229 37.09 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33591998 36.39 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33714849 37.42 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 32085704 37.25 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 32870484 38.79 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 32684634 35.13 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 32194814 35.02 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33738506 35.08 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 35718802 35.80 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 33377952 35.85 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 34108228 36.22 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=2 34461302 35.26 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9627457 124.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9586106 124.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9616539 124.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9612781 124.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9692002 124.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9657752 124.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9588177 124.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9630145 125.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9657904 124.3 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9636493 124.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9679708 124.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9685591 124.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9790699 124.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9643272 124.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9667638 124.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9610587 123.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9977566 121.2 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9902637 121.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9875780 121.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=4 9835903 121.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8419065 141.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8519761 140.5 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8451224 139.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8450619 142.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8456139 142.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8515942 141.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8466001 141.4 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8462304 141.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8500870 141.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8463513 140.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8509232 141.8 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8473962 141.7 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8432258 141.1 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8459630 142.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8475969 138.0 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8423197 140.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8519053 141.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8488460 142.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8479678 141.6 ns/op
+BenchmarkN1000Parallel/gen=Go1Locked/proc=8 8407258 141.6 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255565628 4.696 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255533180 4.698 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255622542 4.695 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255140752 4.702 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 254722198 4.710 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255716552 4.694 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255612649 4.695 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255190647 4.700 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255567330 4.698 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255645549 4.695 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 256041672 4.695 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255426232 4.697 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255372373 4.707 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 254148285 4.834 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255463344 4.697 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255556014 4.663 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255665226 4.696 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255143962 4.697 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255265198 4.694 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=1 255439802 4.662 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 501435446 2.395 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 501707634 2.393 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 500148741 2.395 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 500187830 2.394 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 499939850 2.392 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 502864054 2.392 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 501174889 2.396 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 501224520 2.394 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 499463511 2.392 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 499633688 2.397 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 501915294 2.396 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 501656074 2.392 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 499712317 2.398 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 498630757 2.437 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 500850836 2.386 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 502092837 2.392 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 500993374 2.388 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 502481350 2.385 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 500188090 2.395 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=2 499170648 2.398 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 978017690 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 981178405 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 974994771 1.221 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 977840368 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 978689380 1.226 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 981369316 1.222 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 976904018 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 978946530 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 978944206 1.225 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 978089108 1.225 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 979479567 1.222 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 979527531 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 979617825 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 980790138 1.224 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 980478604 1.222 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 977088296 1.232 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 981021990 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 979373974 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 979359651 1.223 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=4 980739702 1.222 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7165 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7147 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7158 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7152 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7162 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7150 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7162 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7161 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7159 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7158 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7153 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7156 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7164 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7162 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7157 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7159 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7148 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7162 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7173 ns/op
+BenchmarkN1000Parallel/gen=ChaCha8/proc=8 1000000000 0.7163 ns/op
+PASS
+ok randtest 512.356s
diff --git a/_content/blog/chacha8rand/mksvg.go b/_content/blog/chacha8rand/mksvg.go
new file mode 100644
index 0000000..4f4a079
--- /dev/null
+++ b/_content/blog/chacha8rand/mksvg.go
@@ -0,0 +1,126 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "log"
+ "os"
+)
+
+type Benchmark struct {
+ Name string
+ Data []float64
+}
+
+var perf = []Benchmark{
+ {Name: "Go 1: Uint64", Data: []float64{2.29656e+00, 3.23495e+00, 2.67690e+00, 3.84810e+00, 2.51320e+00, 1.87559e+00, 4.83222e+00}},
+ {Name: "PCG: Uint64", Data: []float64{1.52985e+00, 8.03210e+00, 2.46820e+00, 1.13633e+01, 4.19290e+00, 2.21153e+00, 6.86715e+00}},
+ {Name: "ChaCha8: Uint64", Data: []float64{3.10785e+00, 5.99320e+00, 4.22015e+00, 8.54389e+00, 4.64550e+00, 3.54895e+00, 7.48717e+00}},
+ {Name: "Go 1: N(1000)", Data: []float64{3.04079e+00, 1.43600e+01, 4.84235e+00, 2.50285e+01, 3.05638e+00, 2.41394e+00, 1.27050e+01}},
+ {Name: "PCG: N(1000)", Data: []float64{2.47375e+00, 1.03700e+01, 3.88155e+00, 1.49215e+01, 4.09644e+00, 2.31600e+00, 9.82755e+00}},
+ {Name: "ChaCha8: N(1000)", Data: []float64{4.03063e+00, 8.37230e+00, 5.74820e+00, 1.17947e+01, 4.85670e+00, 3.99968e+00, 1.01725e+01}},
+}
+
+var columns = []string{
+ "amd",
+ "amd32",
+ "intel",
+ "intel32",
+ "m1",
+ "m3",
+ "taut2a",
+}
+
+var descs = []string{
+ "AMD Ryzen 9 7950X",
+ "AMD Ryzen 9 7950X running 32-bit code",
+ "11th Gen Intel Core i7-1185G7",
+ "11th Gen Intel Core i7-1185G7 running 32-bit code",
+ "Apple M1",
+ "Apple M3",
+ "Google Cloud Tau T2A (Ampere Altra)",
+}
+
+var svghdr = `<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+`
+
+func writeSVG(col int) {
+ var buf bytes.Buffer
+ buf.WriteString(svghdr)
+
+ y := 5
+ height := 20
+ skip := 20
+ scale := 50.
+ for _, bench := range perf {
+ if true || bench.Data[col] > 10 {
+ scale = 25
+ break
+ }
+ }
+ fills := []string{
+ "#ffaaaa",
+ "#ccccff",
+ "#ffffaa",
+ "#ffaaaa",
+ "#ccccff",
+ "#ffffaa",
+ }
+ y += skip
+ fmt.Fprintf(&buf, "<text x='%d' y='%d' class='head'><tspan dx='5' dy='-0.5em'>%s</tspan></text>\n",
+ 0, y, descs[col])
+ for i, bench := range perf {
+ val := bench.Data[col]
+ fill := fills[i]
+ barx := int(val * scale)
+ fmt.Fprintf(&buf, "<rect x='5' y='%d' height='%d' width='%d' fill='%s' stroke='black' />\n", y+(skip-height)/2, height, barx, fill)
+ labelx := 5 + barx
+ if labelx > 395 {
+ labelx = 395
+ }
+ fmt.Fprintf(&buf, "<text x='%d' y='%d' text-anchor='end'><tspan dy='-0.5em'>%.1fns</tspan></text>\n",
+ labelx-3, y+skip-(skip-height)/2, val)
+ textx := 10
+ if labelx < 130 {
+ textx = labelx + 5
+ }
+ fmt.Fprintf(&buf, "<text x='%d' y='%d'><tspan dy='-0.5em'>%s</tspan></text>\n",
+ textx, y+skip-(skip-height)/2, bench.Name)
+ y += skip
+ if i == 2 {
+ y += skip / 2
+ }
+ }
+ y += 5
+
+ buf.WriteString("</svg>\n")
+ if err := os.WriteFile(columns[col]+".svg", buf.Bytes(), 0666); err != nil {
+ log.Fatal(err)
+ }
+}
+
+func main() {
+ for i := range perf[0].Data {
+ writeSVG(i)
+ }
+}
diff --git a/_content/blog/chacha8rand/taut2a.svg b/_content/blog/chacha8rand/taut2a.svg
new file mode 100644
index 0000000..b1575e6
--- /dev/null
+++ b/_content/blog/chacha8rand/taut2a.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg height="170" width="400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <style type="text/css"><![CDATA[
+ text {
+ font-family: sans-serif, Arial;
+ font-size: 12px;
+ }
+ text.head {
+ font-weight: bold;
+ font-size: 14px;
+ }
+ ]]></style>
+ </defs>
+<text x='0' y='25' class='head'><tspan dx='5' dy='-0.5em'>Google Cloud Tau T2A (Ampere Altra)</tspan></text>
+<rect x='5' y='25' height='20' width='120' fill='#ffaaaa' stroke='black' />
+<text x='122' y='45' text-anchor='end'><tspan dy='-0.5em'>4.8ns</tspan></text>
+<text x='130' y='45'><tspan dy='-0.5em'>Go 1: Uint64</tspan></text>
+<rect x='5' y='45' height='20' width='171' fill='#ccccff' stroke='black' />
+<text x='173' y='65' text-anchor='end'><tspan dy='-0.5em'>6.9ns</tspan></text>
+<text x='10' y='65'><tspan dy='-0.5em'>PCG: Uint64</tspan></text>
+<rect x='5' y='65' height='20' width='187' fill='#ffffaa' stroke='black' />
+<text x='189' y='85' text-anchor='end'><tspan dy='-0.5em'>7.5ns</tspan></text>
+<text x='10' y='85'><tspan dy='-0.5em'>ChaCha8: Uint64</tspan></text>
+<rect x='5' y='95' height='20' width='317' fill='#ffaaaa' stroke='black' />
+<text x='319' y='115' text-anchor='end'><tspan dy='-0.5em'>12.7ns</tspan></text>
+<text x='10' y='115'><tspan dy='-0.5em'>Go 1: N(1000)</tspan></text>
+<rect x='5' y='115' height='20' width='245' fill='#ccccff' stroke='black' />
+<text x='247' y='135' text-anchor='end'><tspan dy='-0.5em'>9.8ns</tspan></text>
+<text x='10' y='135'><tspan dy='-0.5em'>PCG: N(1000)</tspan></text>
+<rect x='5' y='135' height='20' width='254' fill='#ffffaa' stroke='black' />
+<text x='256' y='155' text-anchor='end'><tspan dy='-0.5em'>10.2ns</tspan></text>
+<text x='10' y='155'><tspan dy='-0.5em'>ChaCha8: N(1000)</tspan></text>
+</svg>
diff --git a/_content/blog/chacha8rand/taut2a.txt b/_content/blog/chacha8rand/taut2a.txt
new file mode 100644
index 0000000..fdc45de
--- /dev/null
+++ b/_content/blog/chacha8rand/taut2a.txt
@@ -0,0 +1,123 @@
+goos: linux
+goarch: arm64
+pkg: randtest
+BenchmarkUint64/gen=Go1 248455749 4.835 ns/op
+BenchmarkUint64/gen=Go1 248415836 4.834 ns/op
+BenchmarkUint64/gen=Go1 248458609 4.839 ns/op
+BenchmarkUint64/gen=Go1 247975328 4.833 ns/op
+BenchmarkUint64/gen=Go1 248109145 4.833 ns/op
+BenchmarkUint64/gen=Go1 247891726 4.836 ns/op
+BenchmarkUint64/gen=Go1 247919977 4.840 ns/op
+BenchmarkUint64/gen=Go1 248480607 4.828 ns/op
+BenchmarkUint64/gen=Go1 248193528 4.833 ns/op
+BenchmarkUint64/gen=Go1 248681330 4.825 ns/op
+BenchmarkUint64/gen=Go1 248321024 4.830 ns/op
+BenchmarkUint64/gen=Go1 249019573 4.830 ns/op
+BenchmarkUint64/gen=Go1 248422831 4.826 ns/op
+BenchmarkUint64/gen=Go1 248359096 4.830 ns/op
+BenchmarkUint64/gen=Go1 248294286 4.834 ns/op
+BenchmarkUint64/gen=Go1 248199319 4.816 ns/op
+BenchmarkUint64/gen=Go1 248525256 4.831 ns/op
+BenchmarkUint64/gen=Go1 248464021 4.832 ns/op
+BenchmarkUint64/gen=Go1 248238936 4.831 ns/op
+BenchmarkUint64/gen=Go1 248839789 4.820 ns/op
+BenchmarkUint64/gen=PCG 174242110 6.846 ns/op
+BenchmarkUint64/gen=PCG 174132589 6.850 ns/op
+BenchmarkUint64/gen=PCG 174330180 6.846 ns/op
+BenchmarkUint64/gen=PCG 174183909 6.852 ns/op
+BenchmarkUint64/gen=PCG 174288889 6.851 ns/op
+BenchmarkUint64/gen=PCG 174298448 6.845 ns/op
+BenchmarkUint64/gen=PCG 174253972 6.847 ns/op
+BenchmarkUint64/gen=PCG 174323828 6.853 ns/op
+BenchmarkUint64/gen=PCG 174412629 6.851 ns/op
+BenchmarkUint64/gen=PCG 174345062 6.850 ns/op
+BenchmarkUint64/gen=PCG 175188483 6.884 ns/op
+BenchmarkUint64/gen=PCG 175045111 6.888 ns/op
+BenchmarkUint64/gen=PCG 175182530 6.880 ns/op
+BenchmarkUint64/gen=PCG 175134198 6.888 ns/op
+BenchmarkUint64/gen=PCG 175087416 6.882 ns/op
+BenchmarkUint64/gen=PCG 175099728 6.885 ns/op
+BenchmarkUint64/gen=PCG 175137080 6.895 ns/op
+BenchmarkUint64/gen=PCG 175264096 6.883 ns/op
+BenchmarkUint64/gen=PCG 175209273 6.883 ns/op
+BenchmarkUint64/gen=PCG 175299583 6.884 ns/op
+BenchmarkUint64/gen=ChaCha8 160415494 7.487 ns/op
+BenchmarkUint64/gen=ChaCha8 160310059 7.484 ns/op
+BenchmarkUint64/gen=ChaCha8 160346799 7.485 ns/op
+BenchmarkUint64/gen=ChaCha8 160084292 7.487 ns/op
+BenchmarkUint64/gen=ChaCha8 160183503 7.487 ns/op
+BenchmarkUint64/gen=ChaCha8 160564818 7.491 ns/op
+BenchmarkUint64/gen=ChaCha8 160267632 7.486 ns/op
+BenchmarkUint64/gen=ChaCha8 160390923 7.483 ns/op
+BenchmarkUint64/gen=ChaCha8 160358782 7.510 ns/op
+BenchmarkUint64/gen=ChaCha8 160233528 7.484 ns/op
+BenchmarkUint64/gen=ChaCha8 160454979 7.566 ns/op
+BenchmarkUint64/gen=ChaCha8 160211536 7.614 ns/op
+BenchmarkUint64/gen=ChaCha8 160381500 7.470 ns/op
+BenchmarkUint64/gen=ChaCha8 160164750 7.483 ns/op
+BenchmarkUint64/gen=ChaCha8 160193640 7.483 ns/op
+BenchmarkUint64/gen=ChaCha8 160313425 7.485 ns/op
+BenchmarkUint64/gen=ChaCha8 160840632 7.479 ns/op
+BenchmarkUint64/gen=ChaCha8 160098883 7.504 ns/op
+BenchmarkUint64/gen=ChaCha8 160316475 7.484 ns/op
+BenchmarkUint64/gen=ChaCha8 160388248 7.497 ns/op
+BenchmarkN1000/gen=Go1 94417130 12.70 ns/op
+BenchmarkN1000/gen=Go1 92825816 12.71 ns/op
+BenchmarkN1000/gen=Go1 93598202 12.70 ns/op
+BenchmarkN1000/gen=Go1 94296928 12.70 ns/op
+BenchmarkN1000/gen=Go1 94392168 12.71 ns/op
+BenchmarkN1000/gen=Go1 93693498 12.70 ns/op
+BenchmarkN1000/gen=Go1 94365742 12.70 ns/op
+BenchmarkN1000/gen=Go1 94346156 12.70 ns/op
+BenchmarkN1000/gen=Go1 94417419 12.71 ns/op
+BenchmarkN1000/gen=Go1 94188572 12.71 ns/op
+BenchmarkN1000/gen=Go1 94309972 12.70 ns/op
+BenchmarkN1000/gen=Go1 94102892 12.71 ns/op
+BenchmarkN1000/gen=Go1 94131246 12.71 ns/op
+BenchmarkN1000/gen=Go1 94228510 12.71 ns/op
+BenchmarkN1000/gen=Go1 94168172 12.71 ns/op
+BenchmarkN1000/gen=Go1 94298410 12.71 ns/op
+BenchmarkN1000/gen=Go1 94409991 12.70 ns/op
+BenchmarkN1000/gen=Go1 94384447 12.70 ns/op
+BenchmarkN1000/gen=Go1 93541591 12.70 ns/op
+BenchmarkN1000/gen=Go1 93939949 12.71 ns/op
+BenchmarkN1000/gen=PCG 122041834 9.836 ns/op
+BenchmarkN1000/gen=PCG 122153306 9.827 ns/op
+BenchmarkN1000/gen=PCG 122044854 9.825 ns/op
+BenchmarkN1000/gen=PCG 122039968 9.824 ns/op
+BenchmarkN1000/gen=PCG 122041954 9.835 ns/op
+BenchmarkN1000/gen=PCG 122118037 9.833 ns/op
+BenchmarkN1000/gen=PCG 122101366 9.824 ns/op
+BenchmarkN1000/gen=PCG 122055967 9.828 ns/op
+BenchmarkN1000/gen=PCG 122215968 9.829 ns/op
+BenchmarkN1000/gen=PCG 122143722 9.822 ns/op
+BenchmarkN1000/gen=PCG 122141121 9.821 ns/op
+BenchmarkN1000/gen=PCG 122168040 9.830 ns/op
+BenchmarkN1000/gen=PCG 122198320 9.832 ns/op
+BenchmarkN1000/gen=PCG 122079390 9.832 ns/op
+BenchmarkN1000/gen=PCG 122125956 9.826 ns/op
+BenchmarkN1000/gen=PCG 121595718 9.823 ns/op
+BenchmarkN1000/gen=PCG 122144493 9.828 ns/op
+BenchmarkN1000/gen=PCG 122103364 9.824 ns/op
+BenchmarkN1000/gen=PCG 122108936 9.829 ns/op
+BenchmarkN1000/gen=PCG 122057089 9.823 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.15 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.12 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.19 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.19 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.19 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.16 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.21 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.17 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.18 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.20 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.20 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.19 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.17 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.14 ns/op
+BenchmarkN1000/gen=ChaCha8 100000000 10.19 ns/op