LOPC is an efficient CPU and GPU implementation of the local-order-preserving compression approach described in the following paper:
ADD CITATION HERE WHEN PUBLISHED (https://arxiv.org/abs/2603.26968 for now)
If you use LOPC in your research, please cite this publication.
The code can be compiled as follows:
make {serial, openmp, gpu, all}
This will make both f32 and f64 versions of LOPC for the target.
To target a specific GPU architecture, replace NV_SM in the Makefile with the appropriate Compute Capability.
To compress (both 2D and 3D, 3rd dimension is optional):
./topo_compress_{ser, omp, gpu}_f{32, 64} input_file_name compressed_output ABS_error_bound dim1 dim2 [dim3]
To decompress (both 2D and 3D, 3rd dimension is optional):
./topo_decompress_{ser, omp, gpu}_f{32, 64} compressed_input decompressed_output ABS_error_bound dim1 dim2 [dim3]
Example using the SDRBench Isabel file from the paper:
./topo_compress_gpu_f32 SDRBench_ISABEL_500_500_90.f32 ISABEL.compressed 0.001 90 500 500
./topo_decompress_gpu_f32 ISABEL.compressed ISABEL.reconstructed 0.001 90 500 500
Note: The serial, OpenMP, and GPU versions of a compressor/decompressor are interchangeable. Hence, a file can be compressed on a CPU and decompressed on a GPU or vice versa.
LOPC expects IEEE 754-formatted single-precision (f32) or double-precision (f64) floating-point data as input. For the experiments in our paper, we used a subset of the scientific inputs from the SDRBench repository.
This work was supported by the U.S. Department of Energy, Office of Science, Office of Advanced Scientific Research (ASCR), under Awards DE-SC0022223 and DE-SC0021015. Additional support was provided by the U.S. National Science Foundation (NSF) under Awards CCF-2403380, CCF-2403379, CCF-2346394, CCF-2217154, and OAC-2313124.