acm-header
Sign In

Communications of the ACM

Blogroll


bg-corner

Round a Direction Vector to an 8-Way Compass
From Daniel Lemire's Blog

Round a Direction Vector to an 8-Way Compass

Modern game controllers can point in a wide range of directions. Game designers sometimes want to convert the joystick direction to get 8-directional movement.Continue...

Science and Technology links (July 23rd 2022)
From Daniel Lemire's Blog

Science and Technology links (July 23rd 2022)

Compared to 1800, we eat less saturated fat and much more processed food and vegetable oils and it does not seem to be good for us: Saturated fats from animal sources...

Negative incentives in academic research
From Daniel Lemire's Blog

Negative incentives in academic research

In the first half of the XXth century, there were relatively few scientists, and these scientists were generally not lavishly funded. Yet it has been convincingly...

How quickly can you convert floats to doubles (and back)?
From Daniel Lemire's Blog

How quickly can you convert floats to doubles (and back)?

Many programming languages have two binary floating-point types: float (32-bit) and double (64-bit). It reflects the fact that most general-purpose processors supports...

Filtering numbers faster with SVE on Graviton 3 processors
From Daniel Lemire's Blog

Filtering numbers faster with SVE on Graviton 3 processors

Processors come, roughly, in two large families x64 processors from Intel and AMD, and ARM processors from Apple, Samsung, and many other vendors. For a long time...

Go generics are not bad
From Daniel Lemire's Blog

Go generics are not bad

When programming, we often need to write ‘generic’ functions where the exact data type is not important. For example, you might want to write a simple functionContinue...

Looking at assembly code with gdb
From Daniel Lemire's Blog

Looking at assembly code with gdb

Most of us write code using higher level languages (Go, C++), but if you want to understand the code that matters to your processor, you need to look at the ‘assembly...

Filtering numbers quickly with SVE on Amazon Graviton 3 processors
From Daniel Lemire's Blog

Filtering numbers quickly with SVE on Amazon Graviton 3 processors

I have had access to Amazon’s latest ARM processors (graviton 3) for a few weeks. To my knowledge, these are the first widely available processors supporting Scalable...

Memory-level parallelism : Intel Ice Lake versus Amazon Graviton 3
From Daniel Lemire's Blog

Memory-level parallelism : Intel Ice Lake versus Amazon Graviton 3

One of the most expensive operation in a processor and memory system is a random memory access. If you try to read a value in memory, it can take tens of nanosecond...

Data structure size and cache-line accesses
From Daniel Lemire's Blog

Data structure size and cache-line accesses

On many systems, memory is accessed in fixed blocks called “cache lines”. On Intel systems, the cache line spans 64 bytes. That is, if you access memory at byte...

Parsing JSON faster with Intel AVX-512
From Daniel Lemire's Blog

Parsing JSON faster with Intel AVX-512

Many recent Intel processors benefit from a new family of instructions called AVX-512. These instructions operate over wide registers (up to 512 bits) and follow...

Avoid exception throwing in performance-sensitive code
From Daniel Lemire's Blog

Avoid exception throwing in performance-sensitive code

There are various ways in software to handle error conditions. In C or Go, one returns error code. Other programming languages like C++ or Java prefer to throwContinue...

Faster bitset decoding using Intel AVX-512
From Daniel Lemire's Blog

Faster bitset decoding using Intel AVX-512

I refer to “bitset decoding” as the action of finding the positions of the 1s in a stream of bits. For example, given the integer value 0b11011 (or 27 in decimal)...

Fast bitset decoding using Intel AVX-512
From Daniel Lemire's Blog

Fast bitset decoding using Intel AVX-512

In software, we often use ‘bitsets’: you work with arrays of bits to represent sets of small integers. It is a concise and fast data structure. Sometimes you want...

Removing characters from strings faster with AVX-512
From Daniel Lemire's Blog

Removing characters from strings faster with AVX-512

In software, it is a common problem to want to remove specific characters from a string. To make the problem precise, let us consider the removal of all ASCII control...

An overview of version control in programming
From Daniel Lemire's Blog

An overview of version control in programming

In practice, computer code is constantly being transformed. At the beginning of a project, the computer code often takes the form of sketches that are gradually...

Floats have 15-digit accuracy in their normal range
From Daniel Lemire's Blog

Floats have 15-digit accuracy in their normal range

In programming languages like JavaScript or Python, numbers are typically represented using 64-bit IEEE number types (binary64). For these numbers, we have 15 digits...

String representations are not unique: learn to normalize!
From Daniel Lemire's Blog

String representations are not unique: learn to normalize!

Most strings in software today are represented using the unicode standard. The unicode standard can represent most human readable strings. Unicode works by representing...

Converting integers to decimal strings faster with AVX-512
From Daniel Lemire's Blog

Converting integers to decimal strings faster with AVX-512

In most systems, integers are stored using a fixed binary representation. It is common to store integers using 32-bit or 64-bit words. You sometimes need to convert...

Writing out large arrays in Go: binary.Write is inefficient for large arrays
From Daniel Lemire's Blog

Writing out large arrays in Go: binary.Write is inefficient for large arrays

Programmers often need to write data structures to disk or to networks. The data structure then needs to be interpreted as a sequence of bytes. Regarding integer...
Sign In for Full Access
» Forgot Password? » Create an ACM Web Account