The Green Lossless Sparse Matrix-Vector Multiplication (SpMV) project focuses on lossless compression techniques optimizing space, time, and energy for multiplications between binary or ternary matrix formats and real-valued vectors.
- Python version 3.8 or later
sudo apt install clang g++ gcc cmake-
sdsl-lite (
git clone https://github.com/simongog/sdsl-lite.git+cd sdsl-lite+./install.sh) -
psutil (
pip install psutil)
sudo apt install libgtest-dev libgmock-dev sudo apt install linux-tools-common linux-tools-generic linux-tools-`uname -r`Visit this link and download all relevant datasets in Matrix Market format. Extract the files with the .mtx extension with the tar -xzf command.
To build the project, follow these steps.
First load the submodules:
git submodule update --init --recursiveThen, compile all targets:
mkdir build && cd build && cmake .. && make -j 12 && cd ..The mm-repair library does not use cmake; hence, one has to compile it separately:
cd mm-repair && make -j 12 && cd ..To prepare the compressed matrix formats, run the following command where the arguments represent the parallelism degree:
python3 prepare_data.py 1 8 16In the above example, we prepare matrix formats for 1, 8, and 16 threads.
By default the script compresses the matrix cnr-2000.mtx in the example directory. To define a different dataset create a datasets.py file containing the appropriate definition of the directory DATA_PATH and of the list of .mtx files. See sample_datasets.py for an example.
Run pagerank.py passing as arguments the number of threads:
[sudo] python3 pagerank.py 1 8 16 &> out.logNote: In the background, pagerank.py utilizes the perf tool to monitor cache accesses, clock cycles, instructions, and more. Typically, this requires executing the script with superuser privileges. To eliminate the need to run pagerank.py as a superuser, ask your system administrator to adjusti the /proc/sys/kernel/perf_event_paranoid setting to 0 with the command
sudo sh -c 'echo 0 > /proc/sys/kernel/perf_event_paranoid'to permit access to performance monitoring and observability operations to unprivileged users; see this guide for further information. Additionally, please verify the available energy events for RAPL on your machine. You can check the energy events by running either:
ls /sys/bus/event_source/devices/power/eventsor
sudo perf list | grep energyBy default, the script reports power/energy-pkg/ (energy consumption at the package level) and power/energy-ram/ (energy used by the RAM). These events were measurable on our machine. However, on other machines, you may find power/energy-cpu/ (energy consumption at cores level) available. If this is the case, we recommend modifying the PREAMBLE global variable in the pagerank.py script accordingly.
To extract statistics from the PageRank log, run extract_stats.py passing the name of the log file as parameter:
python3 extract_stats.py out.logthis will produce a CSV file out.csv with metrics extracted from out.log.
The out.csv file contains the following columns:
DATASET: The name of the dataset.START: The timestamp indicating when the algorithm commenced.ALGO: The compression algorithm used.PARDEGREE: The degree of parallelism, i.e., the number of active threads.MAXITER: The total number of PageRank iterations performed.DAMPF: The damping factor used in PageRank.TOPK: The number of highest-scoring vertices included in the PageRank output.NNODES: The total number of vertices in the input graph.NDANGLING: The number of dangling nodes in the input graph.NEDGES: The total number of edges in the input graph.SUM: The sum of PageRank values (should equal 1).L1DCL: The number of L1 data cache loads (including both hits and misses).L1DCLM: The number of L1 data cache load misses.L1DCS: The number of L1 data cache stores.LLCL: The number of last-level cache loads (including both hits and misses).LLCLM: The number of last-level cache load misses.LLCS: The number of last-level cache stores.CYCLES: The total number of clock cycles.INSTR: The total number of instructions executed.ENERGY_PKG: The energy consumption at the socket level, as measured by RAPL.ENERGY_CORES: The energy consumption at the core level, as measured by RAPL.ENERGY_RAM: The energy consumption at the RAM level, as measured by RAPL.ELAPSED: The total completion time.PMU: The peak memory usage in kilobytes.DISK: The disk space used, measured in bytes.
This project is licensed under the terms of the Apache License 2.0.
The logo logo.svg is a derivative work based on the file File:Betelblatt.svg, uploaded by the user Furfur on Wikimedia Commons and licensed under CC BY-SA 4.0.
If you use the library please cite the following paper:
F. Tosoni, P. Bille, V. Brunacci, A. d. Angelis, P. Ferragina and G. Manzini, "Toward Greener Matrix Operations by Lossless Compressed Formats," in IEEE Access, vol. 13, pp. 56756-56779, 2025, doi: 10.1109/ACCESS.2025.3555119. keywords: {Sparse matrices;Energy consumption;Energy efficiency;Software;Vectors;Servers;Internet of Things;Big Data;Meters;Machine learning algorithms;Green computing;lossless compression techniques;compressed matrix formats;matrix-to-vector multiplications;computation-friendly compression;PageRank},
@ARTICLE{tosoni2024greenermatrixoperationslossless,
author={Tosoni, Francesco and Bille, Philip and Brunacci, Valerio and Angelis, Alessio de and Ferragina, Paolo and Manzini, Giovanni},
journal={IEEE Access},
title={Toward Greener Matrix Operations by Lossless Compressed Formats},
year={2025},
volume={13},
number={},
pages={56756-56779},
keywords={Sparse matrices;Energy consumption;Energy efficiency;Software;Vectors;Servers;Internet of Things;Big Data;Meters;Machine learning algorithms;Green computing;lossless compression techniques;compressed matrix formats;matrix-to-vector multiplications;computation-friendly compression;PageRank},
doi={10.1109/ACCESS.2025.3555119}}- Thanks to the contributors and the open-source community.
- Special thanks to the LAW group and the SuiteSparse Matrix Collection for providing the datasets.