From ce163981e275a05f9ff13cd273a0106ceadfaa5e Mon Sep 17 00:00:00 2001 From: oumaima-ech-chdig Date: Wed, 28 Aug 2024 13:56:25 +0200 Subject: [PATCH] Add new figures for Blosc2 and NumPy operation --- files/images/ndim-reduction/Blosc2-NumPy.png | Bin 0 -> 30202 bytes .../images/ndim-reduction/Blosc2-decompress.png | Bin 0 -> 41508 bytes posts/ndim-reductions.rst | 11 ++++++++--- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 files/images/ndim-reduction/Blosc2-NumPy.png create mode 100644 files/images/ndim-reduction/Blosc2-decompress.png diff --git a/files/images/ndim-reduction/Blosc2-NumPy.png b/files/images/ndim-reduction/Blosc2-NumPy.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1eea4b9e1b4451abdb2cd53c1e86f318f24a8e GIT binary patch literal 30202 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 literal 0 HcmV?d00001 diff --git a/files/images/ndim-reduction/Blosc2-decompress.png b/files/images/ndim-reduction/Blosc2-decompress.png new file mode 100644 index 0000000000000000000000000000000000000000..127e2d4add9b286bcfffb98f3bdf1d8e29f96af5 GIT binary patch literal 41508 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 literal 0 HcmV?d00001 diff --git a/posts/ndim-reductions.rst b/posts/ndim-reductions.rst index 6679cda..d2a7b03 100644 --- a/posts/ndim-reductions.rst +++ b/posts/ndim-reductions.rst @@ -103,9 +103,15 @@ We could proceed further and try to fine tune the chunk size to get even better Why Blosc2 can be faster than NumPy? ------------------------------------ -Blosc2 splits data into chunks and blocks to compress and decompress data efficiently. When accessing data, a full chunk is fetched from memory and decompressed by the CPU. If the chunk size is small enough to fit in the CPU cache, the CPU can write the data faster, as it does not need to travel back to the main memory. Later, when NumPy is called to perform the reduction on the decompressed data, it can access the data faster, as it is already in the CPU cache. So, it is not that Blosc2 is faster than NumPy, but rather that it is allowing NumPy to leverage the CPU cache more efficiently, and hence, the overall performance is better. +Blosc2 splits data into chunks and blocks to compress and decompress data efficiently. When accessing data, a full chunk is fetched from memory and decompressed by the CPU (as seen in the image below, left side). If the chunk size is small enough to fit in the CPU cache, the CPU can write the data faster, as it does not need to travel back to the main memory. Later, when NumPy is called to perform the reduction on the decompressed data, it can access the data faster, as it is already in the CPU cache (image below, right side). So, it is not that Blosc2 is faster than NumPy, but rather that it is allowing NumPy to leverage the CPU cache more efficiently. -To achieve Blosc2 and NumPy working in parallel, Blosc2 needs to decompress several chunks prior to NumPy performing the reduction operation. The decompressed chunks are stored on a queue, waiting for furthre processing; this is why Blosc2 needs to handle several (3 or 4) chunks simultaneously, so using a chunk size that is a fraction (1/3, 1/4) of L3 is normally a good thing for performance. In the case above, Blosc2 has chosen 8 MB for the chunk size, which is a good compromise for the L3 cache size (36 MB) of the Intel 13900K CPU. Also, when we have chosen the chunk size to be (100, 100, 100), the chunk size continued to be 8 MB, which is near to 1/4 of the L3 cache size, and hence, optimal for performance. ++---------------------------------------------------------+----------------------------------------------------+ +| .. image:: images/ndim-reductions/Blosc2-decompress.png | .. image:: images/ndim-reductions/Blosc2-NumPy.png | +| :width: 50% | :width: 50% | +| :align: center | :align: center | ++---------------------------------------------------------+----------------------------------------------------+ + +To achieve Blosc2 and NumPy working in parallel, Blosc2 needs to decompress several chunks prior to NumPy performing the reduction operation. The decompressed chunks are stored on a queue, waiting for further processing; this is why Blosc2 needs to handle several (3 or 4) chunks simultaneously, so using a chunk size that is a fraction (1/3, 1/4) of L3 is normally a good thing for performance. In the case above, Blosc2 has chosen 8 MB for the chunk size, which is near to 1/4 of the L3 cache size and hence, a good compromise for the L3 cache size (36 MB) of our CPU (Intel 13900K). Also, when we have chosen the chunk size to be (100, 100, 100), the chunk size continued to be 8 MB, so size is still optimal for the L3 cache. Having said this, we still need some explanation on why the performance can be so different along the X, Y, and Z axes. Let's see this in the next section. @@ -135,7 +141,6 @@ Tweaking the chunk size .. image:: /images/ndim-reductions/3D-cube.png :width: 40% - However, when Blosc2 is instructed to create chunks that are the same size for all the axes (chunks=(100, 100, 100)), the situation changes. In this case, an accumulator is needed for each subcube, but it is smaller (`100 * 100 * 8 = 80 KB`) and fits in L2, which is faster than L3 (scenario above); as the same size is used for all the axes hence the performance is similar for all of them. It is interesting to stress out that, in this case, and when using compression, performance is similar than NumPy in *all* axes, except for the X axis, where performance is up to 1.5x better. This fact is even more interesting when you know that Blosc2 is using the very same NumPy reduction machinery behind the scenes. This is a nice side effect of compression; see below.