acm-header
Sign In

Communications of the ACM

Blogroll


bg-corner

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...

Enforcement by software
From Daniel Lemire's Blog

Enforcement by software

At my university, one of our internal software systems allows a professor to submit a revision to a course. The professor might change the content or the objectives...

The Canadian Common CV and the captured academy
From Daniel Lemire's Blog

The Canadian Common CV and the captured academy

Most Canadian academics have to write their resumes using a government online tool called the Common CV. When it was first introduced, it was described as a time...

How many digits in a product?
From Daniel Lemire's Blog

How many digits in a product?

We often represent integers with digits. E.g., the integer 1234 has 4 digits. By extension, we use ‘binary’ digits, called bits, within computers. Thus the integer...

The end of the monopolistic web era?
From Daniel Lemire's Blog

The end of the monopolistic web era?

Except maybe in totalitarian states, you cannot ever have a single publisher. Most large cities had multiple independent newspapers. In recent years, we saw a surge...

SWAR explained: parsing eight digits
From Daniel Lemire's Blog

SWAR explained: parsing eight digits

It is common to want to parse long strings of digits into integer values. Because it is a common task, we want to optimize it as much as possible. In the blog post...

What is the ‘range’ of a number type?
From Daniel Lemire's Blog

What is the ‘range’ of a number type?

In programming, we often represent numbers using types that have specific ranges. For example, 64-bit signed integer types can represent all integers between -9223372036854775808...
Sign In for Full Access
» Forgot Password? » Create an ACM Web Account