From 90e2a3e209b1cbf634208c26d7cf6057d6dbd80a Mon Sep 17 00:00:00 2001 From: Wenxuan Xie Date: Wed, 3 Jun 2026 08:07:37 +0000 Subject: [PATCH] code and model for the paper Ultra-Fast Neural Video Compression in CVPR 2026. --- .gitignore | 3 +- DCVC-family/DCVC-RT/README.md | 157 + .../DCVC-RT/assets}/RD-Curve.png | Bin DCVC-family/DCVC-RT/assets/bd_rate_speed.png | Bin 0 -> 142109 bytes DCVC-family/DCVC-RT/assets/complexity.png | Bin 0 -> 268846 bytes DCVC-family/DCVC-RT/assets/intra_compare.png | Bin 0 -> 151574 bytes .../DCVC-RT/assets/practical_performance.png | Bin 0 -> 173943 bytes DCVC-family/DCVC-RT/checkpoints/.gitkeep | 0 .../dataset_config_example_yuv420.json | 0 DCVC-family/DCVC-RT/requirements.txt | 7 + .../DCVC-RT/src/cpp/py_rans/py_rans.cpp | 393 + DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.h | 71 + DCVC-family/DCVC-RT/src/cpp/py_rans/rans.cpp | 534 + DCVC-family/DCVC-RT/src/cpp/py_rans/rans.h | 201 + .../DCVC-RT/src}/cpp/py_rans/rans_byte.h | 0 DCVC-family/DCVC-RT/src/cpp/setup.py | 31 + .../DCVC-RT/src}/layers/cuda_inference.py | 0 .../src/layers/extensions/inference/bind.cpp | 36 + .../src}/layers/extensions/inference/common.h | 0 .../src}/layers/extensions/inference/def.h | 0 .../src}/layers/extensions/inference/impl.cpp | 0 .../layers/extensions/inference/kernel.cu | 0 .../src/layers/extensions/inference/setup.py | 32 + DCVC-family/DCVC-RT/src/layers/layers.py | 156 + .../DCVC-RT/src/models/common_model.py | 296 + .../DCVC-RT/src/models/entropy_models.py | 341 + DCVC-family/DCVC-RT/src/models/image_model.py | 209 + .../DCVC-RT/src}/models/video_model.py | 0 DCVC-family/DCVC-RT/src/utils/common.py | 177 + DCVC-family/DCVC-RT/src/utils/metrics.py | 96 + .../DCVC-RT/src/utils/stream_helper.py | 217 + DCVC-family/DCVC-RT/src/utils/transforms.py | 63 + DCVC-family/DCVC-RT/src/utils/video_reader.py | 90 + DCVC-family/DCVC-RT/src/utils/video_writer.py | 52 + DCVC-family/DCVC-RT/test_video.py | 541 + DCVC-family/README.md | 28 +- .../assets}/RGB_different_settings.png | Bin .../assets}/test_pipeline.png | Bin .../test_conditions.md | 0 NOTICE .txt => NOTICE.txt | 0 README.md | 252 +- anchors/vtm_17.0_yuv420_LB_allf_ip0.json | 19200 ++++++++++++++++ assets/bd_rate_speed.png | Bin 142109 -> 241364 bytes assets/complexity.png | Bin 268846 -> 332440 bytes assets/intra_compare.png | Bin 151574 -> 182233 bytes assets/practical_performance.png | Bin 173943 -> 280348 bytes assets/rd_curve.png | Bin 0 -> 534403 bytes checkpoints/.gitkeep | 0 compare_bd_rate.py | 417 + requirements.txt | 11 +- src/cpp/install.sh | 7 + src/cpp/py_rans/bind.cpp | 40 + src/cpp/py_rans/py_rans.cpp | 655 +- src/cpp/py_rans/py_rans.h | 61 +- src/cpp/py_rans/rans.cpp | 679 +- src/cpp/py_rans/rans.h | 204 +- src/cpp/pyproject.toml | 3 + src/cpp/setup.py | 8 +- src/datasets/image_dataset.py | 72 + src/datasets/video_dataset.py | 123 + src/layers/extensions/inference/bind.cpp | 51 +- src/layers/extensions/inference/common_cpp.h | 41 + src/layers/extensions/inference/common_cu.h | 184 + .../extensions/inference/common_cutlass.h | 289 + src/layers/extensions/inference/cuda_check.h | 17 + .../inference/cutlass/conv1x1_bias.cu | 540 + .../cutlass/conv1x1_bias_shortcut.cu | 247 + .../cutlass/conv1x1_bias_shortcut2.cu | 100 + .../conv1x1_bias_shortcut_with_quant.cu | 70 + .../cutlass/conv1x1_bias_with_quant.cu | 48 + .../inference/cutlass/conv1x1_bias_wsilu.cu | 248 + .../cutlass/conv1x1_bias_wsilu_chunk_add.cu | 390 + .../conv1x1_bias_wsilu_chunk_add_kernel.h | 170 + .../inference/cutlass/conv1x1_kernel.h | 435 + .../extensions/inference/cutlass/conv_bias.cu | 151 + .../inference/cutlass/conv_kernel.h | 89 + .../inference/cutlass/cutlass_epilogue.h | 234 + .../inference/cutlass/cutlass_helper_d3x3.h | 264 + .../inference/cutlass/cutlass_kernel.h | 249 + .../extensions/inference/cutlass/d3x3.cu | 446 + .../inference/cutlass/d3x3_kernel.h | 596 + .../sm90_quad_gemm/sm90_builder_epilogue.h | 126 + .../sm90_quad_gemm/sm90_builder_mainloop.h | 112 + .../sm90_epilogue_tma_warpspecialized_quad.h | 992 + ...emm_tma_warpspecialized_cooperative_quad.h | 828 + ...m90_mma_tma_gmma_ss_warpspecialized_quad.h | 729 + .../inference/cutlass/transposed_conv.cu | 119 + .../cutlass/transposed_conv_kernel.h | 86 + .../inference/cutlass_helper_gemm.h | 450 + .../inference/cutlass_helper_implicit_gemm.h | 503 + src/layers/extensions/inference/def_const.h | 18 + src/layers/extensions/inference/def_cutlass.h | 40 + .../extensions/inference/def_elementwise.h | 78 + .../extensions/inference/dmc_common.cpp | 134 + src/layers/extensions/inference/dmc_common.h | 67 + .../extensions/inference/dmc_htl_proxy.cpp | 1178 + .../extensions/inference/dmc_htl_proxy.h | 375 + .../extensions/inference/dmc_hts_proxy.cpp | 1000 + .../extensions/inference/dmc_hts_proxy.h | 355 + .../extensions/inference/dmc_ld_proxy.cpp | 862 + .../extensions/inference/dmc_ld_proxy.h | 330 + .../extensions/inference/dmci_proxy.cpp | 882 + src/layers/extensions/inference/dmci_proxy.h | 254 + .../inference/elementwise/cat_and_pad.cu | 110 + .../inference/elementwise/shuffle.cu | 185 + .../inference/elementwise/stream.cu | 962 + src/layers/extensions/inference/install.sh | 7 + .../extensions/inference/layers_proxy.cpp | 324 + .../extensions/inference/layers_proxy.h | 129 + .../extensions/inference/memory_pool.cpp | 6 + src/layers/extensions/inference/memory_pool.h | 127 + .../extensions/inference/pyproject.toml | 3 + src/layers/extensions/inference/setup.py | 64 +- src/layers/layers.py | 222 +- src/models/common_model.py | 458 +- src/models/entropy_models.py | 410 +- src/models/image_model.py | 314 +- src/models/video_model_ht.py | 526 + src/models/video_model_ld.py | 376 + src/utils/common.py | 377 +- src/utils/metrics.py | 47 +- src/utils/stream_helper.py | 229 +- src/utils/transforms.py | 63 +- src/utils/video_reader.py | 21 +- src/utils/video_writer.py | 19 +- test_cfg/all_RGB.json | 100 + test_cfg/all_yuv420.json | 100 + test_cfg/runtime_avg.json | 17 + test_compress_time.py | 73 + test_video.py | 568 +- third_party/.gitkeep | 0 train_image.py | 140 + train_video.py | 249 + training.md | 378 + 134 files changed, 44215 insertions(+), 2229 deletions(-) create mode 100644 DCVC-family/DCVC-RT/README.md rename {assets => DCVC-family/DCVC-RT/assets}/RD-Curve.png (100%) create mode 100644 DCVC-family/DCVC-RT/assets/bd_rate_speed.png create mode 100644 DCVC-family/DCVC-RT/assets/complexity.png create mode 100644 DCVC-family/DCVC-RT/assets/intra_compare.png create mode 100644 DCVC-family/DCVC-RT/assets/practical_performance.png create mode 100644 DCVC-family/DCVC-RT/checkpoints/.gitkeep rename dataset_config_example_yuv420.json => DCVC-family/DCVC-RT/dataset_config_example_yuv420.json (100%) create mode 100644 DCVC-family/DCVC-RT/requirements.txt create mode 100644 DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.cpp create mode 100644 DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.h create mode 100644 DCVC-family/DCVC-RT/src/cpp/py_rans/rans.cpp create mode 100644 DCVC-family/DCVC-RT/src/cpp/py_rans/rans.h rename {src => DCVC-family/DCVC-RT/src}/cpp/py_rans/rans_byte.h (100%) create mode 100644 DCVC-family/DCVC-RT/src/cpp/setup.py rename {src => DCVC-family/DCVC-RT/src}/layers/cuda_inference.py (100%) create mode 100644 DCVC-family/DCVC-RT/src/layers/extensions/inference/bind.cpp rename {src => DCVC-family/DCVC-RT/src}/layers/extensions/inference/common.h (100%) rename {src => DCVC-family/DCVC-RT/src}/layers/extensions/inference/def.h (100%) rename {src => DCVC-family/DCVC-RT/src}/layers/extensions/inference/impl.cpp (100%) rename {src => DCVC-family/DCVC-RT/src}/layers/extensions/inference/kernel.cu (100%) create mode 100644 DCVC-family/DCVC-RT/src/layers/extensions/inference/setup.py create mode 100644 DCVC-family/DCVC-RT/src/layers/layers.py create mode 100644 DCVC-family/DCVC-RT/src/models/common_model.py create mode 100644 DCVC-family/DCVC-RT/src/models/entropy_models.py create mode 100644 DCVC-family/DCVC-RT/src/models/image_model.py rename {src => DCVC-family/DCVC-RT/src}/models/video_model.py (100%) create mode 100644 DCVC-family/DCVC-RT/src/utils/common.py create mode 100644 DCVC-family/DCVC-RT/src/utils/metrics.py create mode 100644 DCVC-family/DCVC-RT/src/utils/stream_helper.py create mode 100644 DCVC-family/DCVC-RT/src/utils/transforms.py create mode 100644 DCVC-family/DCVC-RT/src/utils/video_reader.py create mode 100644 DCVC-family/DCVC-RT/src/utils/video_writer.py create mode 100644 DCVC-family/DCVC-RT/test_video.py rename {assets => DCVC-family/assets}/RGB_different_settings.png (100%) rename {assets => DCVC-family/assets}/test_pipeline.png (100%) rename test_conditions.md => DCVC-family/test_conditions.md (100%) rename NOTICE .txt => NOTICE.txt (100%) create mode 100644 anchors/vtm_17.0_yuv420_LB_allf_ip0.json create mode 100644 assets/rd_curve.png create mode 100644 checkpoints/.gitkeep create mode 100644 compare_bd_rate.py create mode 100644 src/cpp/install.sh create mode 100644 src/cpp/py_rans/bind.cpp create mode 100644 src/cpp/pyproject.toml create mode 100644 src/datasets/image_dataset.py create mode 100644 src/datasets/video_dataset.py create mode 100644 src/layers/extensions/inference/common_cpp.h create mode 100644 src/layers/extensions/inference/common_cu.h create mode 100644 src/layers/extensions/inference/common_cutlass.h create mode 100644 src/layers/extensions/inference/cuda_check.h create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut2.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut_with_quant.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_with_quant.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add.cu create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add_kernel.h create mode 100644 src/layers/extensions/inference/cutlass/conv1x1_kernel.h create mode 100644 src/layers/extensions/inference/cutlass/conv_bias.cu create mode 100644 src/layers/extensions/inference/cutlass/conv_kernel.h create mode 100644 src/layers/extensions/inference/cutlass/cutlass_epilogue.h create mode 100644 src/layers/extensions/inference/cutlass/cutlass_helper_d3x3.h create mode 100644 src/layers/extensions/inference/cutlass/cutlass_kernel.h create mode 100644 src/layers/extensions/inference/cutlass/d3x3.cu create mode 100644 src/layers/extensions/inference/cutlass/d3x3_kernel.h create mode 100644 src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_epilogue.h create mode 100644 src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_mainloop.h create mode 100644 src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_epilogue_tma_warpspecialized_quad.h create mode 100644 src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_gemm_tma_warpspecialized_cooperative_quad.h create mode 100644 src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_mma_tma_gmma_ss_warpspecialized_quad.h create mode 100644 src/layers/extensions/inference/cutlass/transposed_conv.cu create mode 100644 src/layers/extensions/inference/cutlass/transposed_conv_kernel.h create mode 100644 src/layers/extensions/inference/cutlass_helper_gemm.h create mode 100644 src/layers/extensions/inference/cutlass_helper_implicit_gemm.h create mode 100644 src/layers/extensions/inference/def_const.h create mode 100644 src/layers/extensions/inference/def_cutlass.h create mode 100644 src/layers/extensions/inference/def_elementwise.h create mode 100644 src/layers/extensions/inference/dmc_common.cpp create mode 100644 src/layers/extensions/inference/dmc_common.h create mode 100644 src/layers/extensions/inference/dmc_htl_proxy.cpp create mode 100644 src/layers/extensions/inference/dmc_htl_proxy.h create mode 100644 src/layers/extensions/inference/dmc_hts_proxy.cpp create mode 100644 src/layers/extensions/inference/dmc_hts_proxy.h create mode 100644 src/layers/extensions/inference/dmc_ld_proxy.cpp create mode 100644 src/layers/extensions/inference/dmc_ld_proxy.h create mode 100644 src/layers/extensions/inference/dmci_proxy.cpp create mode 100644 src/layers/extensions/inference/dmci_proxy.h create mode 100644 src/layers/extensions/inference/elementwise/cat_and_pad.cu create mode 100644 src/layers/extensions/inference/elementwise/shuffle.cu create mode 100644 src/layers/extensions/inference/elementwise/stream.cu create mode 100644 src/layers/extensions/inference/install.sh create mode 100644 src/layers/extensions/inference/layers_proxy.cpp create mode 100644 src/layers/extensions/inference/layers_proxy.h create mode 100644 src/layers/extensions/inference/memory_pool.cpp create mode 100644 src/layers/extensions/inference/memory_pool.h create mode 100644 src/layers/extensions/inference/pyproject.toml create mode 100644 src/models/video_model_ht.py create mode 100644 src/models/video_model_ld.py create mode 100644 test_cfg/all_RGB.json create mode 100644 test_cfg/all_yuv420.json create mode 100644 test_cfg/runtime_avg.json create mode 100644 test_compress_time.py create mode 100644 third_party/.gitkeep create mode 100644 train_image.py create mode 100644 train_video.py create mode 100644 training.md diff --git a/.gitignore b/.gitignore index 9f4392f..708346d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ build/ *.tar *.pyd -*.egg-info \ No newline at end of file +*.egg-info +*.json \ No newline at end of file diff --git a/DCVC-family/DCVC-RT/README.md b/DCVC-family/DCVC-RT/README.md new file mode 100644 index 0000000..118e80a --- /dev/null +++ b/DCVC-family/DCVC-RT/README.md @@ -0,0 +1,157 @@ +# Introduction + +Official Pytorch implementation for DCVC-RT: [Towards Practical **R**eal-**T**ime Neural Video Compression](https://arxiv.org/abs/2502.20762), in CVPR 2025. Project page: https://dcvccodec.github.io/. + +- The first end-to-end neural video codec achieving 100+ FPS 1080p coding and 4K real-time coding with a comparable compression ratio with ECM. + +Beyond this, DCVC-RT pursues a more practical neural video codec solution and supports various practical features: +- **Wide bitrate range in single model**: A single model enables continuous and controllable bitrate adjustments. DCVC-RT can compress at a wide bitrate range for different coding scenarios. +- **Rate control**: By adjusting quantization parameters, DCVC-RT effectively supports dynamic and various network conditions during real communication scenario. +- **Unified YUV and RGB coding**: While DCVC-RT is primarily optimized for the widely adopted YUV format, it can seamlessly adapt to RGB content coding. + +We are continuously exploring additional practical functionalities and will provide further NVC solutions in this repository. + + + +## Abstract + +We introduce a practical real-time neural video codec (NVC) designed to deliver high compression ratio, low latency and broad versatility. In practice, the coding speed of NVCs depends on 1) computational costs, and 2) non-computational operational costs, such as memory I/O and the number of function calls. While most efficient NVCs prioritize reducing computational cost, we identify operational cost as the primary bottleneck to achieving higher coding speed. Leveraging this insight, we introduce a set of efficiency-driven design improvements focused on minimizing operational costs. Specifically, we employ implicit temporal modeling to eliminate complex explicit motion modules, and use single low-resolution latent representations rather than progressive downsampling. These innovations significantly accelerate NVC without sacrificing compression quality. Additionally, we implement model integerization for consistent cross-device coding and a module-bank-based rate control scheme to improve practical adaptability. Experiments show our proposed DCVC-RT achieves an impressive average encoding/decoding speed at 125.2/112.8 fps (frames per second) for 1080p video, while saving an average of 21\% in bitrate compared to H.266/VTM. + +# Prerequisites +* Python 3.12 and conda, get [Conda](https://www.anaconda.com/) +* CUDA 12.6 (other versions may also work. Make sure the CUDA version matches with pytorch.) +* pytorch (We have tested that pytorch-2.6 works. Other versions may also work.) +* Environment + ``` + conda create -n $YOUR_PY_ENV_NAME python=3.12 + conda activate $YOUR_PY_ENV_NAME + + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126 + pip install -r requirements.txt + ``` + +# Test dataset + +We support arbitrary original resolution. The input video resolution will be padded automatically. The reconstructed video will be cropped back to the original size. The distortion (PSNR) is calculated at original resolution. + +## YUV 420 content + +Put *.yuv in the folder structure similar to the following structure. + + /media/data/HEVC_B/ + - BQTerrace_1920x1080_60.yuv + - BasketballDrive_1920x1080_50.yuv + - ... + /media/data/HEVC_D/ + /media/data/HEVC_C/ + ... + +The dataset structure can be seen in dataset_config_example_yuv420.json. + +## RGB content + +We highly suggest testing YUV420 content. To test RGB content, please refer to the DCVC-FM folder. + +# Build the project + +Please build the C++ code to support bitstream writing and customized CUDA kernels to fuse operations. + +```bash +sudo apt-get install cmake g++ ninja-build +conda activate $YOUR_PY_ENV_NAME +cd ./src/cpp/ +pip install . +cd ../layers/extensions/inference/ +pip install . +``` + +If the CUDA kernels fail to load successfully in inference, the standard output will display: ```cannot import cuda implementation for inference, fallback to pytorch.``` + +## CPU performance scaling + +Note that the arithmetic coding runs on the CPU, please make sure your CPU runs at high performance while writing the actual bitstream. Otherwise, the arithmetic coding may take a long time. + +Check the CPU frequency by +``` +grep -E '^model name|^cpu MHz' /proc/cpuinfo +``` + +Run the following command to maximum CPU frequency +``` +echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor +``` + +Run the following command to recover the default frequency +``` +echo ondemand | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor +``` + +# Pretrained models + +* Download [our pretrained models](https://1drv.ms/f/c/2866592d5c55df8c/Esu0KJ-I2kxCjEP565ARx_YB88i0UnR6XnODqFcvZs4LcA?e=by8CO8) and put them into ./checkpoints folder. +* There are 2 models, one for image coding and the other for video coding. + +# Test the models + +Example to test pretrained model with four rate points: +```bash +python test_video.py --model_path_i ./checkpoints/cvpr2025_image.pth.tar --model_path_p ./checkpoints/cvpr2025_video.pth.tar --rate_num 4 --test_config ./dataset_config_example_yuv420.json --cuda 1 -w 1 --write_stream 1 --force_zero_thres 0.12 --output_path output.json --force_intra_period -1 --reset_interval 64 --force_frame_num -1 --check_existing 0 --verbose 0 +``` + +It is recommended that the ```-w``` number is equal to your GPU number. + +You can also specify different ```--rate_num``` values (2~64) to test finer bitrate adjustment. + +To measure coding speed, you can set ```--verbose``` value to `1` (sequence-level measuring) or `2` (frame-level measuring). This will automatically measure encoding and decoding speeds, print them in the terminal, and record the average speeds in ```avg_frame_encoding_time``` and ```avg_frame_decoding_time``` in the output JSON file. +- Note that ```test_time``` is the total testing time for the entire sequence, which includes I/O time, encoding time, decoding time, and distortion calculation time. The overhead from I/O and distortion calculation is much larger than the encoding/decoding time itself, so we exclude these overheads to measure the precise coding time. +- Additionally, please make sure ```time.time()``` provides sufficient precision on the tested platform. For instance, our experience is that the precision is adequate on our Ubuntu device, but insufficient on our Windows device. + +# Comparing with other method + +Bit saving over VTM-17.0 (UVG all frames with single intra-frame setting (i.e. intra-period = –1) and YUV420 colorspace.) + + + +The BD-Rate and 1080p encoding/decoding speed on NVIDIA A100 GPU + + + +The complexity analysis and encoding/decoding speed evaluation across various resolutions and devices. + + + +## Image compression performance + +Notably, the intra-frame codec in DCVC-RT also delivers impressive performance. On Kodak, DCVC-RT-Intra achieves an 11.1% bitrate reduction compared to VTM, with a over 10× faster decoding speed than previous state-of-the-art learned image codecs. For encoding, DCVC-RT-Intra also offers a similar speed advantage. For 1080p content, DCVC-RT-Intra achieves an impressive encoding/decoding speed of 40.7 FPS / 44.2 FPS on an NVIDIA A100 GPU. + + + +## On the comparison + +Please note that different methods may use different configurations to test different models, such as +* Source video may be different, e.g., cropped or padded to the desired resolution. +* Intra period may be different, e.g., 96, 32, 12, or 10. +* Number of encoded frames may be different. + +So, it does not make sense to compare the numbers in different methods directly, unless making sure they are using same test conditions. + +Please find more details on the [test conditions](../test_conditions.md). + +# Acknowledgement +The implementation of DCVC-RT is based on [CompressAI](https://github.com/InterDigitalInc/CompressAI). + +# Citation +If you find this work useful for your research, please cite: + +``` +@inproceedings{jia2025towards, + title={Towards Practical Real-Time Neural Video Compression}, + author={Jia, Zhaoyang and Li, Bin and Li, Jiahao and Xie, Wenxuan and Qi, Linfeng and Li, Houqiang and Lu, Yan}, + booktitle={{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2025, Nashville, TN, USA, June 11-25, 2024}, + year={2025} +} +``` + +# Trademarks +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies. diff --git a/assets/RD-Curve.png b/DCVC-family/DCVC-RT/assets/RD-Curve.png similarity index 100% rename from assets/RD-Curve.png rename to DCVC-family/DCVC-RT/assets/RD-Curve.png diff --git a/DCVC-family/DCVC-RT/assets/bd_rate_speed.png b/DCVC-family/DCVC-RT/assets/bd_rate_speed.png new file mode 100644 index 0000000000000000000000000000000000000000..3773a1dabc771e53456cf0131e64c371665da9c8 GIT binary patch literal 142109 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%0A$|{ajw|KHz=EP1*>n_W-Q}Z%LR>AloFK<qX_uv8 zhQ;EL#P9DP05Du?!+8D}Kq)bZkEf_m%636)#)+vS#-Qs}4_-R|Uo$I)>qj&Ff`Y73 zOYQleh>ub{sKotLsFTx6WnX7p0# zBl#uk*`Z7qteJs7rJ9cR_s12M*p>@9FDb3Rzi{EgroaE*N<4jGm!tP@n3C8$0-VM4 zKmmNhG@LM#Q@BNAVBzgwoa|YfXzO3VUp^cK@&2M*BipqQ_lM8F%UX2$ni<=ukoowhqFCM6E7N zSGkZ#6qAXOw)Jz&hvzqCdiY&VZf-EO$|SB^q91xH3>-I#wu9dVSWU6k5KZ&S$K>A1 zya6322>tftxAF1Rqh*lxY?N@OzUJIeLCFk~h5IVjHKf#@EM#+*M|t*w8t+3W>C*32 z!IpJ|jGTmKaHO4;IkXCBRpx&DxQ)oleQ*)ooT&a}nMbQhMMdD!<2||AeosH%+t@iqQg|xa<4Zh)exZH8DqzPge zpu&diGz-ZHikc1R6OICGnV6cOr>8eqp7H*T4Z44|5uc@lXkd1NIlbfnJfVm=_`}O01%I)+gRO=hk_E5+D%yy*}gbcFsVj*H>akqR`Q zFrW!j0Gm6bYQ{I>bYmdSxRy|P%lt6s9T{>XCL$e9g~mTtRLA2ae3sg1 z=Fz<%#siYImwS48;6}lNU@X07xejt%jp$8CQcjlru~F?zAHXlKa^s~$C7i|j1!IOY zXI7w;qQg5sHPvu?TbcKfP&_Ut{3N+Q|6c({JPt%@wRAJ8-gU$CEQ zF|e~w;1GfR;^YLCaV+7?Yr`cwODik2wMsMdwx0S*%0L%DTb~ZAMs9V693~lfYu-ab zu;w#{B%)-6wub{%KkT6xzt|Jz&uu{qKwQn!YD5%06F5TaoIij}7#)oR*Z4;?+Fy;) z%&1IxkU2msLP~&V34U7lCZb&%IsD|;JeHOgykkwJuImuR^n$;KF8^ZFD;~etbObSr zWw~qPa1X{zy}O*}JK=4Sf69{xa|94pz_h88v-A9TyWxxut9FTI!M6n{xG~lXNc$*8 zH_q@{SWLnR;DiAdc*)xl#SkYkqR9`J{5*|j{U=|ZIGhnB2L$%^CH7By!$X$ADEk(4f`W+Zv;H?SRh^pxcDG( zPXmAgbMd2Fh7|%+m36oO|_Vc?5Yz3LBt+iF(Ax?GccQ8S?@rlE-Y5QqG z!5f-_$^bcG1I0LeF@%#ez!8tiK`VI}WCH5ceKMpq{?7tj6Zu?s&~S*yB*+>XU}!f% zJvS^HLfX#gJ5h->Q}u z7a^}yHaGJozbwSe%iG${Ar8MdQFaV@AT-R8nd1{);<-sBB_;S0I;kK;&okRi7~aL? zA0Cxf&d5L$T74J}EJ+cP)SI;Y7kCC{jbtPx^X(?DVq|gVfjj2(9^g2ZLa8Q1bERB*vdrrTA&V{75YRO5_!{`wt$ZtG;@H#hK!SJ8*rWm$WnM0<)z5 z8H=tn;}!>*gGbOFYClEQOxx)bHM) z>#xUXQhy?*tKleS zF>egsHvS>;^$l&?dtu*jh=7wOh2S2O= zJ~SA(plhc>v5Bi~p9V>*%C^T40>-g$;Z_1uIPiqNW1;4sgNNk+LAS|z;9(TKq^Tg( z#M7ISEnLxpLEXO8!g1-@8$j;h(aUJ}sJke|DauBiR?wwSLUF2&5^DeWk*>Xw4nv|P zP#s^@03ni0u?4HAwyf7)!q4RxZD5BakIn>?OiaV#g&4zK5yC&3DkhEb-e_-0Zpi@p zMrmeA;G-NFhH8Re2UWd==`)x?fI={#Gc$(Fh*mNRv)RMm9^_GYI~=C^ByZndKw*K3 zBDI=+=guAESyhKS{0H$wGSKfMeCFu?S9f-H*4Cz@Ujm!Zm-WHo6jeO`X~y|M2RHmh zju!Gyl!U#+M-OkaE@!CsEc)2wdU;QneK~+MLK$`oo4?xP@O3MQi4Ttv@lXH}Fyip>&@NJyyPo419;5 z#V?G3pYXcogk+_G#}|;j!_h_ihu_2zj2J}`KEE&nBm7D^$Df}KZ|j`Cp59g(AX4z$ zI9Fo)f>7R&t?7>t(^XSD{&<$bV}iO(+2T-QX@krH0f%bC`LNoy+y>P~aI7&&Y$00F z=U{1L6C&i1-!Ba-=&b~VOGuC|w6(Rxsl&Xk3LYPZWU2sJm_`huJ~A{0TJUMPxGE@E zTWN^4tbXNw>D`q0oZLSj_Y^nV{buV*O2tN=azEAs0@fPU>yK7QFHNWxo9V);HNG zXxSKp!(jvSLDgZvnCnkGr4B0vXC~?_Cj9W=B1viAJ$TFi{%qq{LFE5l1%9~Zc9d1< zKY#H?35U&Typ8vStt#f1LtM^J6r+IQkSsN!AuJN?sD`+CLv_v-l3!3l9W{WyOQ8WYE3OGP{joVKkt=VO~wt6OL8@o^TV-@=$D# z5~2z#l&=T3JPuOJ%XsBvJgW`#rx?u}K**|o00_h@@i3DHf00b>7X0(stDFx| zCvF4HjS(T4-^_7I)X#p2urd=YUrc%fYBSs-8PbZ-T241k`zaXxVqqxRv}cIez@Y{9GMWbDg)qq#8lQ7#oi4hst5l3 zb!t)#P-A$)`#OQ!v5l%X&%oRDU(^3pNa2X4M8kdz-{h#LDqzCo|Df(opn7iC_U~|; zhazJM85@jgHixJPO)8a8Xi`!U!hM@5V?`-bB}qktG?>RqQPChWHK=4LA)@zlb?^P` zd++D@@4eo4t^fPJf9qM#+S?|--}if6=Wrayd7R&1)fjNudQVDL_D56Wn%d*7Y-Gd?LT_p5!^g%+otCf-{mWOB@CZ_M$fL&bD8xYH1+$VwMkqsQ z`G}hg&j=zb)~c9U<-)>bN-;WfoQ}^Ozc&{~_44XvWS?g(zl3uFse}XvdS7~Z^^k@0 zI;yYui~6-@l{*QZkg)KaNe06^;J4r+m~e9R5XGTqA2y@a_3u&li&2#R?P_hJczqAV zJdyzq2fEG#m-1Jy#?h&v=$ZB-mtu%pR7*)s_k&i-XbB1i;s8$yoGmGT2pxSQt)ri6 zHy3cHAQgN4*|TSp7ns&JhC~5k{rol;$!=Bqt3)ksX%3lj?Ueh{@IPL!Z+G+-x_(;8 zOotI5Y*%pEb^pqp3M%lWswdl0RfdFy5}qxgnIAoR1bxU%ynZjDMG_?%bG~mi`^$Hd z@cv`^7t_CgD~T;lj(lpQoI3nP|%+~e@^G$rCkiy zrhG(DNaD0G)6&D3lZF=rdL#u9VhgG?#yi4yBBmmK!~;9X-{$8*w5@%4y%o`L$mGRk z!e-BCcsq{$CmxWX_@AH=dqisElao6InvSa22x;Senk2-Tqqcnm`9R(R-j$2hfaAbj zQf;?P-1Zl5_AL+K;q4g|vzR2q=&X#)dcGRffpQi#;A6yV{P@WMK-z5P*Ao zDh@UUbm-QpQ|7r6#0Vp;E|$QTS8jq?hwd$&iK%lW7xEmmUWFm_=UeAE+TK_8 zjrT9&xne*PKC<}YvRTBSfMLvvya22Leu}e7IsM7&0C!ak%^bNz>>q7)c|O`W`?fkg zCF*(y_7JLsmS0mR4;!`4e*-}WO*B(G2fPS8TFBRG9XS<;rMEI+u9~-dn-qYA@bZ?r zSz7u_)YjE*O#2A0&_rtnu$E11Q`EZF{u;MCAPpS7ILYZqiw|Saa!3@)$q^&kQRbk! zYAR-`Z?lsdA}Ng zgvvRM@8N$@w{6Lw%8(31YVbsdM@WgO6eyaV#nhtE6iyrYfW zz=JU9;I08++Zd7&Yx|A59{zRi}6@=QD&nKY5Ym9(PM!FXu90IdDsDFt1* zb{0uxS<;!aXV3CogzW?TQIOev_1ZQCw_f(Cq3?!)f-wy63JnQCLc4#C^y+`6bA0Cf zGo52FY@32a*~}KU^3RhoXz?zj8us;kL?)}TmryD+IrJ89cp-*xS}~K6__--*)cE}0 z74XWm6XMZ3RKtMqihTk?*cwhOg&;9z2R4$2HtC9o~MR}Pu<|4!fe|!<_ zwCPW>vZ8pL>a?MAobKMc_q8g21tlznDK;Ob>I=+999%d3DfN-GeOu2n{{XAFN z*L12SK7a)u2`!-R2xOaY@nxbtfh9>m%0|In)7XE>G?K9CdjP8Hv**pCDU?9B-;h$W zZm{$rjFSSsxp3Akbdrv9hO1H>Kvg?4gaGwMjg4C-PzEY^FDf7WSBoid0FTTpPKdaE zPyUC}pD%&`KeaTO5iP$%w9B-&PaZyem^1otNfjdn^ai4E=aLO1@QyCDne~oCocSCC z#9n&~U9eK2wHPn+3dIkris#HoNT4t!VuVP5#l6d38cVl>URjjt?4qk)8HX z^Q}wN~Vz2KQHhef0>Kn)n8;DkwF|(F~ z1y@yBoSiSP*nTjV0+0g;g$90T_=`&WU93&~k5;4**aOwhaw=K=b7 zn6*V0hbSm0h>^<$?c29U8b_-F9tDy`m~=8h4Lu*u>7Ji#;i>8E1N0-BS5qGq5>IGl ziYSVeB_;PeFG4=( zT6964$V&VY!;!Z%5B8xL{~tgxjAe5cjNmDmYyGteuMR{TWcsF%JlPq1TXFQnyH#T_vZ+H^-Z{+<~OT)>(3?oIsH`%+6 z*~=>!{b0~cOL6h@$piN&2MDciNrZS)MltWxeZ%m{t**y|UD);~O-zO?oUA5vBsc<| zAAq{_J4LC7>W4=t-nQNXgrFsIpQs-y=0H&o-oJkz%*Wm|5+5+q_rvnv$r#^Iex4r? zgSpU&6N^Vn9*n{Rj>c{y6b8xmNu}$1f-?wfU$>KRG3h_Ql(bWQ{1IYrF;lc)4hV5K zFhP%OhsuvWSqz_{vZ}bc`T8G5#>S-52KL@ygo^V8^*=D}1kIygB**XV-?R6MsKU^7 zTNiwE=vXsN_2yHl!xsk381lgPK$fKQyJPS8E;d+b(n`qM9|*!M>ox3$D6+^0_qQ|i z3rHZwrQj9ku6^4y9P1Ml%|#TRG~Yx=P!kJz@g3y=JD0d7vFN|26alO7_(!8J(uGz>zE`qvJl?8 zF%SHC%m<_a@Dk+}GswBU#@I~EZ-q75d7wzDg@<#SE#&YIzk~gPf482PUe1dKLGJ4{ z9Bp)PRx8${Y@*Z0GEqwBTVtaSGoG|+!9Z_79oqyE%2!~wQ%3m$iM{Nc`0+MuKTm}b zT{0=4M7+#24%Wbve+tv6qfY)F-M9ouR0s3ntj>6*(f?NP9G<+h;i?v20u z`5eYXDwr_~DdAUhSMEX{?Gg4GpxPi*RXp2GfG7a>brDag#Dm{IYRu+ow@BhlSL3Km zO;TO_gbL2{!98OLCiEy-;SXmr(0Aqxc0DoJB<4*6euGzGq-fNe0o%X*CZQ}kvSoYr z?d#U1%i~|uFOlGkboT$^2Uom*Kly;Kg64Yg}HQyr5}t<^640-#_LVm`k4SUa;fnwuV76 zOO|i5+GK0+!VZ?M5tJmW@GPIq>D_|n{S*?N5kYmI zKO;g^TUP|8;@%|6=KNS)-@fvuEAzrT*0+0FV6e6Da=99@7a3aKDcU&yV#Be% zs`ZC&GwcIA1M*n#t9Ggi+D18R0Y6xtKgrF;Ok7YW%sZhY5))P?=gk)s&tuFAmc#d# z75s(&+8L~nF#b{5D{K&9`y4pU^>1{Qk)N^!DBSLIK2o8mMn)l{KOOiSxdw;^f!#re zMLs>Y4&{uDLOLLI8o|iZ{h3+{`arBIFRPfaz}95NcT@SHLvLT`mf#L#2WQ7ge#0=b z7H1h)jZ->e+)651qjFl1jSPR#723oeZd%%P;N*!KLz*#KiP*$M3h>AHnEKauI%|d2 zY?YjRKl_zLf;YlGVxH7#PPz8EE10;gcs>(yMadA@l_gw5L5U3G6n4m;mIw}aF4 zIXBl!`HdZ~GkVH}-(BPDJXDkd&M_iIFNwA$e&Ud;yL)U!oHVFGC=Q(_eujmGl{rc4 zK%`K=bE-Z7rge5@3c*)qVV&@aLzwOt{S)~#=_flenkh$o^!er3Tz1MVn%R6IV|!Q4 zkJEU+W;a`z7A42_j~4bgiUs2iNS%HOp?8*TpFMNeftb8g}BTq@rtEu^}Pj!jvO?ywTgvqCV2yNfX)b^O@-| z-Hb@5r!BqHsr*&^+%Ee1`bxqNM`t?=YFsDnFT(RYsvd1o--++YcVffR388PBl`Y!U z7d9Z9wjaB^-{b3fsn>)Swe`&haJ3cFjXJx)0+ySuAiUT4 zoj=4doW125;#+BHDST)4xoCg?p5?)9P^ajw>(*QY_s4Lnd!-n*Us@@%Yo5dfb^4~U zyBV;WoiHPlS&Ktq18C!?M7^TvRU5D#n=z@=G*jBal?vnDqS51x^E#hOimeAayLkD# zn}zR<)_QHnByCP+pA_5?%#t0iHm(>*0uLeMg`vg_B6h7jUPU@ z3(l8Yj~_8QD9c6dqcbO1Rc~z)O}d_U+ft?(erPwsp^*#6hbqt3JAM)f9VX;_KOeA| zvfA2FUz?sRT--0BEyJn{=>LXEjren;3ysC>3YHZqdz^O0NN%c z#w8oZHt)n(1h^w&mD=pZ-4Okaid(PD(B~#Y)Z-b4(D~8F>D9M$7i`8H3{_go>`(HB zud61NP@R$Z4Fy-g{;X+!vw%9mj}|4X-yPdL3k_}fssxo~ce|9o7ZNrhFKFf;K=a)) zBFOd$0UEG!~Uf@F+eRQ zH4F&!s?}oE5`b0lfJAEdI=`!#0oUBc4gsK#Lzf_V>d4r#5r2Iy(1R!<6b$fMY(J?) zEUFWffS5h1on_#!uo_7}Tvqv}1M!57IAoNwwuA5xmGroYdSdwb&Fj~QQka)s^-?PP zEQ$B~ye8@H-Not@`5A;GT-aBBoCYp7!WC2f@g?6gwcVHZu-#4o8nn2B0z!mK4d@V* zU4{-HuJ0O~?*5-1M0ic**eI4Gp(dv;W=JEm-_~tXPg7T%&uhueMhyh`dZE?#dP=G%2oO!-;g+gt7;Y7F}gmD{>y zx;}1EK{o_=qCVTq`0G~5u16nJsFb_-#H!NM%qg9`_Px~rZH19JMsX89wF`Th-%{8n z$qyHG?$LhoM+SbJTVR`7d96@Bzu$gxIPW+-D_yIXwDdCb={3MkJK>UgqHH*kNkGlC z)(RRKxv#(0U>E-}i#PG+c6binyL3Sh+$BNJn>^F8WCt}>-OO4^z7-u-~@3Io#j&)GBjRXUjDBEW|y-I2On;LO393)Shp1j7vVlT(lm}#^t#fpnA|w4VP+`GfLYYCJ$$Og=_d8Ep zw>y9>+x$`-T~}Ueu(q}?ucc?J{LjytXNJrs?^4L`^4m1wcE4)AdM9c z5$_TnhCBTbDQV~KJ^;#fUNCN57k#p2BF2Ftz^S@IDP5lG+WWgenio-Iqc z!1fX0h=6_tB@l(>F;$1xFAqd7_FE%!;!Fp_X&YNl?cMUwIU?_|+h{_7;h+IQgr^}; zsl}6d`ug9QR1Dv7#=u&mh<9Boj88y4OAcl<% znqqz{{MnNc<3ML|e~xI)o!5N*eK*5-iuBsw*~{RyHvMhK+TkYf2Y-F`DaL@ z0!yVPP5dc#QV>AWeo=v}U{Yh!OB5#*<_3o^gAuSw245LPWg$D|m`-vp+vQd87ZhQR(2?CdBt3*bB8B0>!Fbig?CWSZBIx$PqTpegniyci){-Ex=S~I zov`)Wwd9v}cW&I6mXey_K1}8MIfXb?#kj%tGrgU1sE)e+IOBNmKg5W+=V;D(420Ls z$mZgku;bzR+~@nV;8oa>Qd2NdKX1xUlb|7Im*7MyNTO468O$6Qm5xg8}hRvRx9LJ%0i%iOetbg+Ew9fY^SlgLzS@ZhDw({mS1VbC(SieYg>81wwd9=NhI%4|5G zw)e4Aj8?q%ppDtgej#37#m!X_tJU;p4Ub5Y`**n3x8Y7kDA-W?QyL}rE%&F^9~0O9qQ4)KWV|f@r>10=-C-5!rTO+n-If!We!CI4b z;3>ueYlIUQeJ%fNX8FH7!urpj`%m6@IlfHz>cnWNLdj3my5!yinS{x(J zL`2wI3d#AKwoBqP9jGi8&)8lTSK4 z29L;4{tvZl@XnS+%`{HDt;ewigi4B11;mRMr^OcK9f_-10FOZI`Bwc1nQ=>JOb$6{ z&uKJD)uT*D7uDdt<7C$UJAv+7Y=5{eNJ6 zph?S49F&Th9F!DGXXkgI5Kfl{X_&cndMz#Cfm~sW7R$^nyx-ix0jKP>I1b)F_*=GR8CPnklD6$v?_zgI%LMFIzhOVxD%`WIO zVB{f3t~kum^bZa`H&40Tx^qfMe21~!{fcu{u9(h*W>0lr_^@N*$W8yDoGo7Y?9#b6 zqs>sgpm&oN9OedMxhU`o8M5RLwY3S z4$D=9YmI1k9%AY~Qdk7i(Mv5wC$U^EXqxKqu3`@F%brVl=dOcgD1!zSw_C0*uFzFU z4VR~nOG+m2Ji;5^1|`IW)PqJBiJ~J}+sOnq%#|h-Cy}W+C+$#BCg6jBjueF!nd~|z|eG-6u z#iqVn6cq~7^Uc-97-uTa1#qSl@h<;&NZ@r13uOp&@A5ncq1Q>K@mGtj9*8{$5s82Z zo}JXVW2G9z0T|OUyhqW1Ghrta@sK@UbKZ=u0e0^9X#bTfS6Fg*lFdMo?q3<@Y}daq z+~c=MK)$IXM3?ihrOV-X{Gd<^ucf>v?_0H$_nm!5R{k%XV79Kv#~*9-nVn*?xX;5| zQ~8XVqBLS&k2*v7s~i@|N^5EU;$02}2Hy3Zc3+w{u*}6LFvHl!50}#?<9uTOWBS<+ zRv%E9sHURC8ZJncrRDu*8yG-jEC7GRBC?OqnZ@zL2v(X%>!^j<&g6J|6?48Ns2?-a zsB_d$O8ZT4Xwcijs|s}g$^mY90PV#C7~~|tqZ1UQ$_tCo#{y_xOdK`0PuaV76M@|J z`esYOC5=P^7GFm3b3|RIMR$$qIKtFb-98yfk}y)Vwk;|1yp7-H%QtTh|L6vV6Zx#G zq~ya(dKfa)efUP6obdG)XT4F)CMY|wS9!9>))8ke-JiB(b>RBvyEXc@JrO9Vr1M?J zwJ=K$I;1phag8s~^OlYLQXe{Y$xQ)eEk6l*xRD_|iuX^jHsgIC$>2pjhPFlwY|>lF z_3!UngxWB{J#Ubo_v+8#2mAW7R=`EtPwf)^_YT)r&z-xrB>}_>E8hBx$;l`1K8v^G zeSuz(%EWSKsnZ~tG6wn<<3$M2DhfPG%+{@CWIw^> zbcmiohf`LGS?ld&#Z}(&!2Hb$Z3$U*+%(JkME-Xpm8`DWQvc09&>-Pcr@<2g%u9X>Vt?v^Tm^|ugB^MSsj4Ju=ZZAKB&YJt{r`F^8Wf^s61y_d4 zmB4qD=TeJhPydh4!@*{w9#P!$asP?y+-TaxiZ=4t;azvRnveQeO?LBjV;R#KVWBz3#i79#5NgpF_^8Q_H(OoSr+Hx z{Mcnu5^IhLPmmkWIqxU5J^ysr3DCDsS#58KezkeIBkVb>tt>*Qy%l5sx z?tGxZj!$~@X5?HppOV_SlV}h+oFkjHel78RG6oS2`lk;DpHgsqi%*nW0 zE3@Cxn$f6ISE2{t&e?3XZiCVuiDG~ zBdu3d)YM>vJH=0D)~tKnZJAFB+D6{)z$d014h9AWnzm(Yh~N31NtU=|Orkb4-k&{~ zV4@f|Wcjn(CqZ#pKUtFZg=*a6MHJ@4^5us+3X)IQVB9_^ahJt!#?fY@THKF{3yxg- zUCincCA{DMr`(6q-m|gO7wGr^$>&U11K8x7p(+=Pl7XGed-$9=o3RLZFqc@t$Q&&S zF@O1@W^x>;z3Mx2S~&kr0cZKwhzwn7!a1ozL3;@}sI2o3iv>Bp4cPVYfu3D>6TEL9 zxXfgdq6SIP{5nZdRX=s@hgHw6sRWF-*<)4qdUn16^23_5jc^W=T$IiCc(E&JcuZD6pjVdJmVD7+e=AH3w{M&)NWBTx-827z_@jl{u5oA znUnA=eEg}Jm0b(MbTiUG!3v(6Vi%J>35T9{v!Y&{_3e8il^gSh8}lxz)%6|%XKxz$ zosa8R(kxoQpUhRt7VKA5B!-=M@5uE$vfmV01P}S`+4DYcL3Pv(4%z zRFm3{x-(}o=-5#nVR-li+r&HU`&nbA0YHuAf0y<%ZI*l%vJI_I|ATDf+p+U}-p896 z=I%_HOzx99a%I2Nd)ENfwZzjRRRJ@GrY1WuaicJ;+c*Qq-?Tx~l|;pCP4*^PQ!6uLoJl&T zSClavyFo}uc?d!MBtX>Az*wRsF*Y`iS^1vqpO^L#E23b9z?x59TW^r}8Ff~ylKb@K zi@MK9YnvBmQS-rDC7-TTsefY}^HMeaHgHXa?VUjqPle4{x?JzxXVQyel!)Qy(u4Q` zM~|+YIVrDkFqrp|IICl$%1=*2M55v2`3gWQY=ggn$J4DU`HPF(mMmKoJ48sOvDk#3 z-OCL($3&Z+^H|ax8nepmV_e(_de&HG57CbL(~P+K1b+{dec~$U)|jAV2)o#9g|Y zedWKZxV>2%pXc~Fvum$Oo0>FBT-IPCFfnrH)$i5O5Y!#zQ8-Klsd3KQ2=}KIb7}Cv zw_+j`eZr{ffP8%egPNyFf@1X4wg$007lia8La1$6q0HD8AIaY+bEpVxfGxD0thyB| zKSP4Y_w54q%BpJ%x^`hL5wa&}O}e#Uj}+qK4@y6C$QWA6KwElP~uckqyfT^Du>pf?)88N2sjx@sjBFo+G-L$D)^0y-l zQQY>Z%7dUW*19fR0f|>F$0R4-x0~$w&?MNe^uSGMFIeFc>b!CZe zxeVcjtMCu-iIFWu-Z*|*&y&B19@u|$P`<>S|{eRPnr z0>;Wmo@>Y2z6y!cOT*mctFMaJ;QK$khOEW$?)$b&-7G8=vsV=#jzvSTE1XzHIb2nz zyEh(@k!Uh4_MaEK#Uk@N%5(D?u>3gRFk3mkgFGY12VAC;^CF}en_WipZ#HRsB+2Dq z!@8?l9@@`|;sK^=xUFw`eD7W*Qh?d|`YMi0Q1e~B=&O{$yDiaO#}4B zH`p*3gCNhr?`vu%fE*IMD%Q)#01JTphYdWCXVpZxsx`_!1(scY1{x>#b7-fQP$|_p zhUg}Ip+`f6QFL27s6b5Dl2j&6{I$a8GB}=P^5u&mGn$!vwoHx7ZR-mnb|NS!$oSRf z<{vNeMqZ<`&5T9d63x*v>ME@1=gmugZ6RUlO(n=(+b+eMv=}pJ9k+_d*HIq+kJG&J z^nkE=`TYF;j})x-?)d<5bZ=SWw)#Obubg-3X;N@>)4hMCi`CB~?-149gPQtNvxlla zl25C<)6U1ohcB%K1WE;hAbLGOZ_0o(IT?u7@v*wy9LyXY+>|(IV47t{H~EE9&m7Jb6bKhPW=B*s zHH+@u8!>ru>G{H$r$ASsb{YbzH;SCxGqjhzrKCX=2t1m~>rJubg+#9z@}tEx`j^F7HG8y^vCz zPL`su8(yh0E(x$)m$#z%vK0mLDbYnyx;&wPIPlF)I9<#$K~5x;ZDm;y>d z2ymu``6|ZXh4G3>hTxJ2`Xm)X49Gu>54F(q*m<|R!lQ2F_c=t4xrslUyf@E*B#9@^Guyuihtp>KeWwD{$0a`I0QcuvdA+Em$gTSa6a zJND7a)ec{sdIslL`-~_(*-6(x#EKk5eIj(&ZhMxsWpTVxrux^`ZtZ>>A)(o>#Z&K3 z_4bwxgTJ;m-23u3iFFRoCm8AO#4I)25zx?dFWBZd$6;-yj@+1RkwrmIwl#7kT4tv613 z4*dIHV-I9S=-Sd^n4c;Yaz885w@goM(=*mm`g zUvAU?GU_3IdsWNUwtxJA>s|jc%_M&Nvix7aCcp9TpCW(Y*}v+|W&b*&$RGHB@*&2= zOpv%9l&)D^#H4No67=@EZB{z|H z^`Q6)0Z=>iJs3wu)KvN#(9{)%ro-6}`wq@qYm(r5kSod_yRQfJN}_`j?=CAFUGU%= z|Altp85tBnSJ*hq$UKGXW!g$Mdai-N514%+rlP1}RH3TjyD05r7JX%&^+Rr$;OHWH zm1126l0Uo?TBG+g1C%mD+ubO~*anVuu!@R1k)q;5!13do*hvGb#19e;D}fwPY<1bE z+r(}hd)Uf+W67wSUIlFzVP8vM3|IV_@k_*1gnsm1*jJUrozQ1lfEMK!g_zhOieS3M z4#kbxgL{eHDwiz(Oa}3QO+oqKWxgv|S0YWhW{2^xoj!h!lb38sWjnSvy*z{!ZrknK zwk4&{oH3)PlF96t?=JgmorM8DJq$_$73&AKV{tOerzB4*v@yQusd?0Mfk<&A=+cxm z7(0Yv9w_o1+ZeB08o#qzVJ6F;7dzOzijBO`|k7C-+f_WB5frk)X0ap_K%x5@!9R-5;8GROD&vE!E+ir zx$fPUtnXxw2#db_7d1PdvIfg=z{`Zt6+eFbK*msXx6+8Q6XzfE+2#%zEh@jj?{gC; zKwHwW8n`fxR${&cFH`CPKAw_k-~RoXvlT{A(Rn3&qa&jhsYhxkgTJ8@yO@~swRFS7 z84~v|t$Kbg(^#UvZd@T#t}{9utd%$#0}_KH77BV;uQWa?MXoD@!Hld>#`4LiZe0qy z$#&U+k^?*F`5hJ@UfGb`wwFbBXEOW%rvE?pvcjO6I$nSCq-u{;U|)7kWyZ>(G~QGh zx|U&mayw-m^(DynOr9YZ1GuFm$w5=LK8(F*cUy$e9yJBEII4wU=|HPZncIA&AE!EU z>4}cE8q4pvoh!Q#w;+2&m-&TUIg8{~)-9SmF^hmGgV$@YIFnWoW@oL72k$@%2JFz{f0D{1pve zn|591e=V^%Q#-Pcw^)E9tvBpEQ-72Z$XQGsNzV?L((0&fo|8 zB+2OD`nr3j2ju5xSpB0GPk261GTWs%baLz`fYua?2HJI%nQa;{+WI@Y&*N*>j4NvV z(54??hoP8HS4soIfhmeN+}pmZ3{h@U{*N=^;n zx#?bDq!g0Dq#Q~zy3(0(g(XI73>g=?1|SXQsI(|?+&Beo?NrpnMy5#kPH3%J&gw`@ zxnBrs)_ngNrn=B2D@n=p>KMpwdc|bDDD)LgXVy6Mo|((n3in7xNQbAV*z!%utqG{ee~Q@5 z`y=9uF5bYv_~K!i9QRYBkL=Qrey35LsvL7h!!ap3Bl#6)ak~_{iH+F8Y^)TVWp*e* zGvJbqJHxRlv9H7OtK74@0-*>ilFV7Ux|zkx4k3ifYE_R5bIFIQqJ}?@L5`>?s|{w) zrskiYQ;TR4ch2l*lbm87g5$a?g&aC$1a=ly2O*MV-+K|dg7a&>V=KAH`cy|E+KbK2 zK6Io7y<-f8s@~}84wTRIJ+XUy0&_M6{?@)dH$hm%S-fbQfmulQ`7dGnCud%2Hv}@n z_*05RHx>eVdTXh!>DCsltQuKBXBXX_-6C6rW;z{04U>TrOxO37l}+QPAej-4*w#@; zZx8CT)Zv2AywPO>Cuqs-W7v8L;cmN>XdU=07o%bF^7_mo_7T~FlBSZ~2{`=28)(RT zm2A&fnX;a_aNC@1@?y1+arwMKt&3_cR6`sa)T+OAZ1b)XSp@7I^{|kJ#E$|n9}TKHYfMJG8|yxVXC=5VawUsIra(C zu6Av)XCXQj3|RqGlKiui)0VAC4*9yjW|Xa0_{bw}8G%!EEqylQBFJthd8|)yFkiAk zvRv&tk$v5|Z-Bknlgj%HWuAKUozu3=0r4-0FFv=A!JIi=BqjUkq?3gl8wBRcE0fY; zs%IR{oYU_>7ECqj&%539oAG7U`mnW7sKtg)+{oQWtP_0qsiQP?! z9}XM^67`(sfkRH1jo!AB!ojnvMbDDJ%!ar}a0Qrl%zUoW3sbG<7aq0A~D^li%*55nk;3enze7{+~tY?X5Q}Pnv#_-@3*}?Xo=WpED zL>UBqf02bYy%ufMvc9(I3bqg2YkaoW7R-X0K~H>oW7y8FvVq2?f{?a)aNBd#EM}|v z7=M*Z{Q9E3J~BB?;l@=o6H?IM_!V2j?>G5?tc)qYN=h7WZIiOaZzQ!sYCjjGtJ|gG z((Cpt*k1hW)3Pwap2EX!Lf#WUQ(46pP=LD2J7ot+Ec)r<>D*_I+4c-4TVXjfSx!HX z>dMOLIMWJJrxCR|di8N@O}r6Q^FoQ7hWWOXIT443o9P1ra|{ZrJZ|o|wq4k&Cvvb* z_bL_^Aqp)wmvN4$PwpM7Hc&_`0PslDT}ytjOU}3|`gTdl4~oy?K;hEcG%PP+ z#k>;P?S~T-*24&Gke>nQ#AXHTPj11OI3qh`is;S}Va*sc-ywHe>u>h9Rc_}p3eOIg zZda5+%m`nL%tn|{X!)o$Qx|0pv?z|t!cIJsH{O+?w6%#@{Fni~W)7xIS!ETDM>78=Jme zOx)oowG_xmsi4acuFV+B#Iw669%olZxoHO?Z2YJ|qAJHTY7R$jZsNLzYE$prlPqy5 zckQ~U=*NdP!w{y0bOlv-ck`{gEmJR1jX#jlFG_JGD9%07Ty}WgHmSU*5`7*}mqdXmzwLg*?Fo&os}GSvj$MtX zBoFqOv@hhBZ5t~SgkLsZFdtYMJweak{U-Rd)TY>*lM*m;)WM5 zD%5br_ieKy&>MA>$MImAQMc*r3xWI5xEnnkOW&ZWp1i> z{qp(q=L0;LXmva!;k6;Kot@#k?`qX1yeN^aGZ&*l{cL>c4km){IP7 zUQ(;D*kj@)trsszsO|edw3<|~i6IV9*w9+bY5H|KKXf{j7`sC*kt(Sj$F@8HGBqog2R=yeNvnEDg3B~TH#+!+UkQ-S({Y+mKU05S#G-71! z7HBw+Sn+6)JPJjI)KK3ZSp^ncj?t5G)Z*q9+%7`ZQEkt2RZE3E+T*haH;z|StRhbi z&t!h2S_oMtc$xe<*zWT05YnRV&{aMgG$?e^kZtp0)elNHzP-*^Ud(&>XFDi>oC-&8 zyT;aO9 zQn+xE9w?qKtl?R|sja=@T&z-3>Hgcttm}DO9{(oYPGgz>C$S07c`qQF!o7=lpzgI? zZRbp1!Q3G=e>gcBnDy(IFJ7=y5_?a-#okg>0F;mvUsXt&fgiO zfrpIe&L7?m%76YI(`c=VzucN<_wc6l*Wh_?##O0)?L125J$riS_+svnpKn~AQ(TO8 zh7I@fE{Gw;y!<&0Y>_`hyNLz2v<7O{Mv?hU9P4}U-+il~-PURPuMU}QYW?gk@Fz8K zghA=i>2ZZwEAmV*GApcW8BU@kz_;Aadc>;%BfF~03){?XQV^z~<`w?Tad#I}-WG+^ zi&+sW?;^llKuE1#%w+r^;A%J*xp8YqlTVAdGQDy)5F5j++@ukje&>TRX0AAIZ=y`A zcVEtTn0;^A&6k^e@2Zw7_SUDcH2ozjSgHDBZo7+i98OT(6Yf-oM@@gGyx#1eqHftQ zYu7|0z0+Y~G4CS060FWM|W(-)VQ zr`qL>9rl7rk@HoZ0`hMX#EUg;#61`y(vB=?=kk6U*X=uZDu1}RGWR6q8Olg(Xw%$_d74~{ zge_Sh!2^+6Gx)6^IMShFG$e0;@!LH;6%RQzl7nZ7S?z z`J4kFDA0yt$@(F$x#d93*OYE%1+_d11(=gCz(^3Hu1U01T zJKqYj=st7*z$s>>&oJQHeUs+NxHNrD<-UkX{thZx+f%I+O5^XGb!tlyziMm@*2=pJ ztk)?r-1a0y&50C<-IctHa-R{0g)db~xCMrta~7`jzb{M-E1&KR(d2~xiM0|B4mU}x7*D|9$S?Z5WFo^9=`J~~qCl3iO2l%= zna{UQxF{aI`v9?6mN(?G{^CzmrYHw<@7;@};w@Nf(xE&k4IcGEgwo~q%BKr$$I{8a zMlzJ0WCuP5U#DzxmZcOUWxs#h+`%?^#dEjnb#wYY%Om+iFH!b84Gx%=Gq+{IyqLwP zSoprj#jY!s&+PdGS2FJeFrDF@I9H0URGOA~Y0alHM94q2E~|G~Y%jo?%Qq6m$a_KU z(b_$;5Cvh;VYDM6f(re7Np9$UNIJ9Bf?wQ>eZ+1Y? zPd8Rzw81u|+T8i@6m!bH_SKs``#>^K9~5Q$C}C?_+fN<9Km;C8heo#jQR%K`@M`(+ zp{;UkxfDP!+L-0d+@RP;+H8PxrXK6K(tT)l_CEciU7e6X6|A@gRR?sS2G!oy z(ZZvzP-Ev$pFz&M=6P;4W`6j9oCtKinBC#|U=tQuH;IUOf^|~4t<^1j>a#U;c5!;r z3iPkh1qvV|;42;B^rxDh)sJD}`QIY*t8k4J+CVx*?|&`*>}ar>gbRRYOUnN0K}DQu23dE^($#4Ed*3cXbl*U6p>7X4_x?d%!1R~Hu{cKQ)>Wr zpxy=9R>0btvU<(W%pI~9hON)O2n8-Am?2vEAxYaGOp{2{*w8*a_2}625J7GeEF97h zDNWzeW!#D}*~?07$AS?S-MTfTP}%;vgN58oOx(rlGY~cq-8@9{VQQAXR+Mbs<0B^y zSfjZquyd~ztMq=k8y|aGTh4XupC4QOVuw(C0b7T=XtkN%LEHm4e?@~p+?w^%AJsH4 z!?YMY46&VmiX!($+!+XP|GiOmc6MYF3d2eCB#6z{7*26x>X?w&NT0~7W1rYHXkhjz zuyCeu#R;EFSXIc+U|`1P-0i)X&)mIzdmB3$a3ui5E)E>0t->s7tyQ$?@wbDA-80X; zv3a1m%!x05PR|*3k+5yAdn8vt5ZNyl+ISiZpd`OMLiHq+nsqAw=#Vg{-^FPC87Iw6 zO_xpTC_3^c={Ek**@Z)B{fR$3ed8;#9fS#KrgiJqtwCPI^KzbNCyC=4!UAGx?avuq z+TB83s*ubE`D>LX0M~2ya`nV(I_EyXy{~u90!f9_?Eh%ZbzPJ>&SDN>`I)*L@|E7f zXRxgyUM*G&A4%|8NvCN0?w2!4zzy)QDjg)~I;-!mPnp(19g^740(N%E= z`#o{(+`8yW@sL5aU)8FerQ2yvUA}xdCoV$cBBuw0SAET_v~HIy+O}^Ge16Y%EDpa* z0Xi5p!0If}u;RfsIG(`imKG=jNPv9RPD)YbrqR`Xq!KCR}%0lof=zQS?UAz4jSTEVr zsc=;rbz~IRNbF;9sqna_wX-$ahVqryc#N?w8BPmlBkNk?^r5-W?rDZOfwqT#@<1$( z?8mjXua3F=Ql z-Mkx=a3wa8LjYCw*4#aI`%_r#1koq#_mXRJS!uZR5#>>pM=S1m8Gx9%XE(o2U zQNS9-8d+IA;{-S+zW>1%lw~HTY~qf@o9Z7K9qO`|XrZ%<>M*LVf2b7;3It|fs00wn zRe~m1Zn&MvdAsjP*_jGH_nM+k&bf6>(%o;~ldbtvQLE{}(_ZKtcKamWD1&Y|b5_jW zJI!4BhzKL>eF6lQ9{C&)d&DS(EBv%Z!-aZX_>6%IrU)aN&CQ#%`pk+ego}G2mVyL! z?9gFs<;1?xl?FPzii6B0~|1=9hGP^|fyZR*i{EWNGfG0JRmgfP9f7^qS?-&T0T z&cB9fVQjWovDR3%j^&wiuRH|hU$K1I1x2y)H}XzBT`1aM`K0encV%7gtF5IOg%>~* zLGN!>aEMCdP)?+C?&-G81(yf*3e#AG_~%KLhtd0edpg*zwZFC{@kQa;gt>iBrqX9~ z_l0dNZ6o6I1HXnxF_28?$X?tbyL79|C0h1~y`zv}na35%PLdfoa53CWRpDDQ;$s(? zFE1}Be1~o5d)X4tu~%&P9^U1X1SZ8Tg^N;HeApl|Uv1U1b%Z;zSioMa zJE<7Qj~bP2D7T0i4Udkm$WS5!?~xJnh746uf6({L_7)rK3AJYp$Fxdl6-pYw_r?7$jTlikQP)hK$Im2ox*$SMS%AFWFm)h3<#XY zHVuqw$d7i)n#1>eUjLJ?Tz(9gO88wXsZDSW>}+~@eR|4k-3563VE2yak``G>*}hXCPi-?4?ARe4dRtH8;qR|ASS6k#L|(gmF$b) z_v2^9u|R{ddF5^QkBoUiextdltH_R?Sahya>!MM`69(1(-tktJEo*6Lvv9MA zFiEB0qo&|teq^?!H~cr;EUMT0N$p~mrg2ro;U`46E6s-%;68K~3uS=I$PXSwmI?!KV%n_jU4Tw^uE+?1&C-aU>Tzgbp{!?`L+_LLPHlDC5>uZ-2|Jkwp0AxdZZFj6gRJ%T{Ynx-~1`cN>AP6OhBmnz!LV!OC2TjCj*@YTsN%B+6?^62>8DVdJE?$D2BMBgqBeR8HZ zyv-KVH#)m0gUcVDSo}P=qwUu>Tec*&AKqn5M|}FIUK`m!4em}fAtN29HKH&^?%17r zQTxsOTSdYtE><}r$+_6*sV0*UTKx>OmMjpv+2>7eobeQ}IW1R4LfyS+WFK|+hIMOl z{|3xOdWANYJbD{qE**IvXRmHDsy&;-u7_cdLarUT9++x~T zs(t^$sRv@mI(4sX`Z1{F%-m-tDsnADsfW?az3hPL$gAa@S$q?*AZ+GV%ptEXyVosD z1^qoRJem+d!*iRTPtd(TjF=zBsAKAM%z5yP6yf z$;EC{CV1_za6_<5*A=@U14bvEuI5sreb3WugWFeCSEslZoAYlx7#9Z_L!IYuv#V)j zwCEC~Zr-+>Y&K-e^Zi%aas_Pz)g0>bixC6L-)GkU?tXgWAp9DaXWb1=3#RObtxXJiNVc^pd~L`*HA0bL&y9>w1a# z&%rLL&PDSZGEt6*t2dCV7lSBV9}Vd%!bvk{CLwV3ucBD&S<^+$wW(N3e&@_wl>Jx> z4%zmWHB^*=zJc`@w{KmMazT_m_4`v}bpT4tYEy3~F99s@Z(KuU@lU>TSU#%a&6@-`G`3aVUzQ6yGUfZ*FfhG9Y;>qTh%wM@ zjl>Km+%`h^3naQ%q5aaDY~O@g2uue5}CaftbOp|GCAJ zeQHchXtH4UeC2V=b7JkG7a=6JJYb-JGme?t_jy074((78+=S|yqd9)`*tC+cAAxC1&#GKgPt&2i6 z2Mwy-)A5!;G$}MQ?j2B)tdC;a3}=Cj{E`%EFu1jnU)OitI*o<7BgLZ5E}mjbGw5ot zNB|YlDU>I-&(ag{6R?Ww8mB6TjeK1WLe z_hInkjq~P#XK#A63@f|q!sM?lVB2-r6xXu0mT+`ffEk`qw5V1R?Z}z)v zEnoY@*~>R>Ot%cRKu`uE@f?XC3EcFK@lU(VBqJ^9&N**5rt|1{C|6wK^u1pW!o{|* zE^}bLRqrzUlS?n43#26AH_`B&0$9=N)wyHGV&o?LD4OQ*4SeiGIHDSvuAMp^N)E_9 zE^TjfhnIfdsi&dNowwN;qPdV`pFo$ydk1Dqq)E5`E!=wCl666#bNZ!-w_ov~0`{ls zJ1h5bO7W@<-Z5#K*}mPU0Tw8-I|-8wZN?*dN%vNxj&KxpgvwvT*!&bj$AU^RjRNT; z8#7gG#YSN$YHFTgx3{OH>pp#2Fj~eg@u=TH&<2uq4P_X`9Ha>{$TZp;VfDihF?%H` zD3s=@v+DC~ub->WU6VAi({6FY&|+WNmI+z7J&5_sueb+&r@+?{t1Qjp3aR)mfpf?- zC(Vsa(-Cyz8{LD*fM5OH?J6WV<5lBQvq;9I_(z;VCU zS!&`hMFL4WJwB)Y>+h-VU0d9!ydE!p+)5(k|6=dW!+KuZ{qL~MQx=gStrn7~43#nz zAv94M6e?4ckS437STbg=P$C*MXh4b5V9JmZB~cPfMN%!Hg!Fq|x$k?gdq3;hdq2-{ zJi{Nqj(xb7jrx4A&vl*GdA`s0`+e%ISRqJ-qgvB|BtKKeGd*SqlXHB>rqv}zlJ*Rf zaT~7$pW%qP^BW9hqn<)B(Nzu|%5x0*T&!S)R?^VJ9Qe0GA0|CXHBr`WA)4_T^Rtu7k9Hq2jmzDf zJO?dZ}8RM2ZX^Vo1H-XHkoOTUdy<-aYsy7+AYySN4*c2?pp0R%R zr?>xu6&qv_6xh(vGsni`K}d%%1$FgCf;5VWC-|3=o;tpBG7rvmUMd3vdEzl+4Jqz> z#gv*ONI5zCrrI~8K!Ie#Um*+D*`$n2pGMH`CK;7neAnqP^8#LUgxjW z{>fT#RqX4!?YJeK@U|v34BvFx9GX((m>2*#e^S5_E`}OK=A!HwvYwbm#dff$<>9yb4x7emw}q^3 zpi)jA1)BYHCMfL%9=GF8YltbO6^(OsA9a-h6+O5M)#xkOe}!$pT{>a2dD?h2>n=-| zn-{`mW!_9Bd`pgLNdH<>#PsJq_f>Ma%^ggpn^WV|VbCBxl4fT~2u+HzW69?45=cYV zj;m}p$|b=q{+ous((6V}i}1_nZefE16|K_yz>0BN7IBOjqq7ir-)O>@@i|Al=9_gf zjxiZgGidvS`4c^p+{pMmN{#$~`pf$`)c-=@n@?ZZI>+bq7_VnwYArGA#uM{1I^EFZ2n%e(l|$Spssv5yHTL3pHwdnfh6fU@QPXjeA42Dw~Joo^|b3} zG>c?wPiwBj+&1#_K2(p=+2H}p+{1Yk@Vw(&Uz%pTj%?|+m zzQ450y%YQZBXu#cOG-^hlK@BxQn0Nc#<)#7!Ha1WFXo4hj(^DehJzB%w(M4wDQd!H zWkBnuyPbx?Qv>fC>kvkg1x>=_Y;P-j-WVBRL@fyFVwGj_Q!WawP0qddR&N1XxFFS~ zdr;P?zP?<_jknjXqW{y(%~z5IihFi+yAVt2<_i5H`f=Ro4ZS}xg%ia2$^NO^N)O#{ zO7m&WoV97L-vmz7^SADl@Wa*)A35^1=cFnM?aEqG%i*-a z2R7UEybDxe(C^6Mp)0U8J+B`+CgR(KGc@C1AC5EDz~A_}7>oC*$NI}Vd2pE8x3aTq zITfx)Zc#3vYKXg!9pI7fQGcBKZQCAkmpl=7$w^HYU9BmYG1rflWk|}N@ky33ASEEA z^SwXjT87=q3z@vp=u2oAC2vmmF2U8vB3Y=zt<{1(LFHxR^Ych>&BUk=tzy+19gkV|z_Lmq|wab=Z6+cCalH>_Kb zkSN@RIm*Wm9z4gchaI-~tLP$uUFP^zEP6|c3Y03PV~QU;o8qxqdkt;P`dXUSsr`j1 zVlp{qZ3qWFr)}oo-PlIbOLsQ*U(7tD8C?z)zBhFFJ>IAFdxPaV zfWir7AzsmsFk~ZVuWIV6a+)W(SNb^KaE`)kmC6KtlGR_nq9HF86$O$3D=U+hfM%wT(SSNAVp zuNGLxNQa*J(OI1!n2XyV2JP>kcYaKnh2HWk7!$k4gMhAPc(qp{qntjbH-f9_Hfg-@ z{BUMo@4UNAl&k3O57b-5HkI!th9;LNfGe~~?5`4jtvxCOfk1?%wrFUj9ERM44e)zX z5;oM>*AZzftr|1dak^ifeTp$fgt?%)a}_qNUy9k^-@biAhCjPdJHFjfQtd=)LAjZL zjn!sxG%|l}QL26U^3bOW>A4UXZnWA^NCpl#cUwP!SE#d#6b{JpSn54qn~*O^O4=s3 z551XdI~o>Ex@!(Q$53@+>-Wvg$?@zVO7Wgy`)fLPj0Z9ewX*8XjY#46sund5Kgey z*HKJ|Zf>+p*c9Y4)}}10ckU`TuackJ0GqyTP1CcVgi%UWJ%W=dm6?-HDDxs_Hd6}d zj}R@buqV_hBZ@Uw+>tEYjJK=yUfp|Wc}2st!mqRbAFp2JJ=*|Lput*jo@1VHb}I`l z)z?1{S=&xqTRSzD0@O~)AD%(vLb{3;d3mD~(|=W&I0;MCl~aWgijN}vPB(hHnr@gX zo}hh6fytXz|Io2rNDhZQx7k;(qR@P=)_7ez?EIw$W4dFsGV@!5e&xXiUW(yv#prBDJ-Fed!OWRj68DWBEsywryf(dcafpVK7!Ux*IA>R%VL+@w z3&z1d0jKURhhH>FpQCYK`rTCGu^-d0k_3Hw6q1pvc}&H)roMyUG1-4NB6zeBBZ>E- zxhVv3&obcF>s}E}a!o0WcTyKS!nQfH1|7v2Nu8)d!6tOQ8>fFc3$)FyvD~3RrE}1% zm^q6RUL@7x)iae1?m>pwgd#M{ta ziS5nFPx(pgF`PRljved7#;eL2v}HjM7tfH_+}t90GS-+nH3Pb_hMff31WhR#OXt&{y%Wz@ z!N_`OGfBX2JmYvgUtM|zlDt7i6%w#g1<{^mU4USIC z$-rsg3zv6NuPyk&AJ#IYzW4n0dBbDR2y72-!p6L?c1})C1C>g~rb}k|xz*TB&-5+> zL}1SMwz#Nq%v09a&vk$E;3YR_l?5mAJANKGd(HV|5o5BF+{>=+c+EAh5oX`D#)i&% zA7kz`$T|l_+y~^r)6{^VsbL^J?M_#XG-1vp`w`Om5fl}*b=3O8uD5cHssgf#RkXpl zX8nD1MvfT4IC<%oTmE*>K@oGSkESHwUm=VuJQ*(6mGCej?T^4I=j)0S%gMQF-%t2X z+9BGVX>-h3Ia~^sdkeq4gZam3@HTPID|X@-gNSpHz4_Wd3^c;m2p+sm(8k2#nn<_Q z_y?fw;VD!J$3H2)fHuz_{7x$(0dHF_4cdREUEpi`aR&vrPLc>l*)W7}PgcoWwXCb_)$<4&BsQSQ;ha*dF9*RMq zaez7igq}RCp38|8VBd~mbPEs)_L3fJi}^QkM9`iiS7}`{a_pJ{yLXh$KN@f8X8}&5tr^N^M&4|oh zeXSKYUdxic?WH@Fwl~R6H1-QKj_=wb}ty|X~e>;|Y=MGPZhuLcs6G;i1H}OR9sq_L3j*XQoExhtFInFPPz7r#By5Flz zp0lO-Ve}tk2JCHvM+(8oTGbpouQL@aTVN+7URi!zw#F zWy=f55=wu7cqvn+M~%mQEBq*VQ5daOCg6T0N*tgMOXHYW4gZD0E!albB135(uF}sG z^Cy+8Zv}5Ap0PjEyK2?SujQTXE~si1bu+r5KM({~%yWw#rm6Y#O_$${y7eD(%uN`C zA5Th@Tt=3`(aO2FFeOXOC7v;3hKpXOiCMkn&6AQp&SI?RQZ$d8CufJV0FI(vOSsjP z65MqFDw99bckaB+H7JIq1IgF8;v!MZROiCiqZ!^rmNU=6BC2qplJ^zcYwai4gvNOj zWaILf>ln_*)2#jD_3I|G4M9`rpAoTT0tCF1NPJ-OL*ihfBopA9iFDAXP#K)3`3wJ* z=B}%glM{uE%OsBxn9$Qw<;SKy|3=r1)YF}uhSaWer%v7EaQFzV`6Lh5>EBE~jw!&9 zeD(UZ1-w+mg-1p$(0%JfS_{J^una#rP^}eCPUp}oHy2OxUGh}g5p0i_A*f!GzcTca zUCn9w4lt3`Ty>ll;GFUr9@on5Gnf$zU#K0^4eEsQ$g`u+q7 zV<=8je;n>kfCgD{*iq? zvK2XLKOARP(tmAs#aJV1+#rb;0wK9VkAkP5Fsyb>BPTI~O-P@Tr?}@Gu*qaKB@}b+>HCMnp#1A2us*+X@Vdh%$?h{TQ}$LD^7)wD1H9=)xXD2 zt4_h<{_)YDBz*81YpEI@LkVACZ?=D? z?+tgN%-QXoy4qsf@-Pq81z+}M-H*?)Sn^ZIRsbN0ltQFH%dU70zTU-hx`af$)1ZNW zb>H}RBNqPTzqSx@ng_MmW5U#_Oa9)9<>Tk~%PaG6NQ(DtFD<9h?&`RI^LZ&`O9oB^ zM2R<>CoxPI%Is*fqxk0&osx%JM88zfFK8d-d=;LY$BsRL@=3Db>G6KHoa!{E_FJ}9 z_vp0k@#cU2GYN@P!J-pPNprWry6*HEb=C5B9D^CB_9ELxNJ^&5o zFJJ$EHDdYCALPIE)Zz0yYxDYe;YvuUs;^IUQ~8h2cyz^B>Eych65q5Z?HDd$S?xM0 z{>p#+>E+?yw|9Oq<*%=yDqaU3I`pzKdtC0(UDk{bbGq3{;@xnpF=?3)GbtAcZ1i{-uNwOJ z#P1nzK6&DDR9OA4DO+!5yDj<;2KML_|5f6u%rja;kku5;7g9A+R2;X|fLKVW1UQJh zU@E5;+!z`ZV_Q*zFxloM0}}<2k6TU%V>gP)?zBYVI7A*7K6((boMW>v7~u*_dik`A z+)Zv1Q4$n}b7yt!-aYC3?hsIGcOwPC`7KV9mN_28bTsg!)r^CcQ@AY}& zth4S*M@eln{8SQm4wD6{Soi@NakEzIXCEva?y1&#XWA@x&xtbXaeemH-R@cCZ;43! zKYU>Jua}8E=em#yIP^QjjCYo!wq#siX}KkSY4t~Mbh;{rF>ooP{UzgpUd3A!HD`Geu~&@D<^51LA_9{E@rd-Lt>d#qNI5gB{;K zwmb2k{8aK{q@9CjCQk5LajO54{?x*|L?6^o> z)?E(Z=mCueOj(@Z_;CLp2f%8wJGbGd<-V>;u~{~~hD!KJjh6StElvi=mM1{z`5iNy z>eJv^RGj?Qn>4r}$d}s1ISLsW#JBHkwx=`b1;YofIda|&0DvOg2vBE^)(<# zseSn7-Y9wbGcbxQ%WdXT*9iI1?T<6R$j?~A@ zF^&(@9EVDs9Sgt_;jApOKe zfN~uE;R}8`|8=yp@(H6RW-%Z0muiB-JV!r#pY*stfD;>9$SYyD#u-I@Xlk-SEBQ8G zhlAV4ZJS|PNt`5~gRwqh7KFoDm=lewJKmr1cgJ^XmA__ly-(}tsT~n??^n7J?3}Sm zU*KKlO+kGME=GU%*7TOhbvKN=di84D$Y~H2ZyVk2Ei>0YQCey+{QCGE!AR=ZA^pdE zhR@u5pYndxuv&N|iYcE9_UzfyfYWZv+Q`D{AqNKwhDhqHqQ2X9DM&bJ(wLlIPFrrD zT^cOF@vCkVyY#dCd?l$adh~xPESew7N|3Rqr0Mh(UNqo;j)`e2?bQ$LF$)rdacOPGRMCAT zrC+5q0rRDpX%LDuI(2RmfZmU4T@c(3kk>Q2*zo%UVW}E4_Gl5;#RpgizEpF%DIEp# zOOy`4qe$t6V?88 z=0X-{c`wOqPxJi#y!fTHB!HH^ryq-P)W9@f#WqFxLQUtIRKBGD+Zq zyAa*xq#gi+o%nDy_270%hB0YwelRA|?8>=aY1huITU+%NDOTlr=FI)chM=$itAfIu zH2<5wOgyvfj{VOWR-0GY_I{gre822JLf_oJRDZ*oLT>)@I_mMc6h!js3@$46 z(4A8p_T_72k;Jhz%jVN+M>!m(x2U9`LdyKS@x|Bzr|4>&(oA2%+uA#H4{~KKuiuDr z;JXoei&T<`CP)MTe1504zW-%4AP|kKfYA5EfTuAdd8MeSOj07(EtBliQ6fRO9=_cK z5c{xxplRo@ z{GyagylkCa7ScZA44JXrv z5HE0R3S6*N7;$Xx2yNiqBY&EcUF5`MfJ>3f+TMin9`Ppd7aq`hk1^A*r@IM%3;$1| z4+~V4Qv}hUln=fD!0p`b`7{qIOso9oY4yBkCKQ8&>x2-COP^CE8vG zeLcMk$?E!RpQmG>qx5u&qWQ|1o)<@)Ia)f^_07S>7sx9d+$0{%T)1!{S35}nv?Q6T zBf?!^%~s-?-tChHV|?ZPdrv#2b#i5|_>%3Brajb))+F`WJzb@P)C?p4H*T>9dN@{W z*;trxW6;Al-p_2cg8a$yPMtc%iG|E>;NXX6(#q^}>i_WK@X3A2l@9ntX_-`Ks@!#0 z#2VwKmI5aUhHck@fL*i2N;-|0AV25Bd)d+5^FLI zG_gd&^+W+G0{L#erN>SagGQf$+wSc)XVvR2!X`arO(9X|s5;5=I{Ql}B9<(iS!TQ7 zlKL+eZQK0b>{}-;f4Nfqwq>@t*yFoDF3%$OaF3O}|Blv~n3F=0p}GB&=Vm6~rDtSd zo@e)IT>l^OrLsqdQygYC5&T@{f-KDR@>suqz0~O95c$M&d-gFAe8-GDDt*VNGIsy; z!iX8Yh_1nrOD*5NnYM0wL117*!n@$&y-=9dduBh0%L-Ip8sR|V(o38yx|}D+0Nl@+ z2sAm7*;O@fVI=NyUHOLY#BpU!4B0C4=oKOQy!veiH1qJVFkeZQjzOQv=}~p-(Iq05 zE^sFmt4Qja#Jx^4Po?}DzJ>2fCSLVsIputLkqkY0L&h?NGuwAN!v0g~17&35(_@Nj zDkr#A=#L0qP|8a{vpwd`$JT<_B@6YkZ5L$x-Ab+-8=89;pjw!1)XaT30&R!Khx~TO zv3nzC$Vf?<(at`*Xa!g0+f1AL>Jn+PKd#5~iamD*6BtS_OwN6Trk7gewbd9^Ra33j z6i5NF8<&%i5;uffPWrpBw<0Mq7Hp}WLQIU)PQyu9tqLlm?GEwRKUEjb?(&`#r*H(8 zQ~ibxO-R2T24Oucj1NJ6EQB&v5A%;+BTJ~PMZ{2LWo>E4es+J;=S7#lvx8`;qQONo zGoltsPDP0;H%r7mUIR^=;*jTd`v0oKwk&ST9aLloZv5kI{h6~(vX-gWyv8r$MUc7h zqs##ii{b|=%i$Qq>8lztL{ewSB-hn&B;na@0>58tA0V>1uilzP5^s+D^Vq5maiBa} zcCT*i0^Vz$WnCSog8Qf-#o1oLOhhlx*`XRvwp{5&@s_)HwU-z$3)=BWXT(C>GAqA6 z0PhF14NG4Iu_YxLM#B286U=*HbqlU&@m!G5kXOr)9Aj4b1 z_g=|Az8+iVWZYo(dIWoFyz!IOBjUL|D)ZQ}claogig^5_w@@clSZR%!kH}D_4mcBvE$w$MIUo@iI*4eAVS}ZJ6N?cL>jn=X<*K{f9k7jW*HKsH|%~ z6i`9YB+>}&mZJG_DX#6d%fe^{DH^K387aL-6$kdw`KePU-I+6=6qr+H(+pX9UquM3 zMjefKT=R)gt{%1f-^?N&Z+sL_k(L-Ge3e4c*SRRph@#4}|+r-dYazuJS7zwYmc!GE9DiIcm)Ytgcf0rO`GQ2nWs*@QwcDLLcS!E{G02P6CI3q01oK+(IZ2{N z(q`VL?)qlFe&~rB1`4b*FfhQAPkR={A7t|rzfE_9BGf_jvB}f_3SK9mNPrByWXZvn_gQTXTDYXW(-$cCLL5F zJ(7CVO?}g&zl#?|ul;pz9gwv-V-Q4B|E!tZvm&m>Uxy82c-NUf-nZS$e|)VR-ociX zo#gFtq75!mTlenmvF+N6`ucKY*up>d!~MxQx=Z%|h$5vvvwNxKOxX*W{}YB+1&u=k@I#EevYj40TD+j0^+&6Vg48d@_{EDW@Ih-s=b?wm7h`_*r1XfbE~l zlN_A?sI0^yadf$<_3j={`dkn+4E@)OS==`RtMW7#zp4D>=n1_t~uD3D132R3?9z8wp(&M>7ZRtf51PoSmtRRtUU88|R` z#=UNF-qFs9?kGJ|zdd_MFvQ$9u36DC{Lx}>WF-it%9~AoBu5SfK88Djsp{7eEBHU4 zIkV^GECiK2+&WBx-;x`_ecR*bCu+k$dlO^|1Jxam8E@~j?KE4S_LBk<X-L+oIuIV=lbf4sP+djW4K!gq*|=kO4y{evu{tVs znc`UkRs={_yn40#zBL<#Cp?%En3dn|Qu5Lpoti%e^TtN2tWhxb?v{(<+jaP8O-;)n z$5mQv`j(18j)NZm-KMvH?VmFUy2x&~Ku%yN=O}2ma`SC!oTFv^S zRUKY%^x5^=V5Gc(x2}__?~7CjRF*a#f1v_vI|~{1R*&L=jo@P z%S0VZJO(G;Kf6^ENRDkx!t7ugapo+Nd0V|GuddO|g1=&If(me5-;~6md`#}?;crlho zpKSPcxah(RWA3Eej9+X!GIpt<}532_;pg z&df1n^U$3ST(=I159g*~d~1U~7vnw(S@qJ7M*(D8k-EJ7SlS#B6=e}?T1}z45swx! zMo}&U+plc5?b=w3(?twVv?))MCr^RK(8`vB_-MLMxwIqkqs@bP|DSmFGK8jJ=2p-! zn8RWo$5XAh_4Vsr=NXNtjb%SjhL*#h^U6oEktE+qq+!6xU3&F0S3bPk5%c}|q6u9l zGP{g`Ri)BJ5|{mnUfx&`6}SWC@NQ0A+$*MvsE)KZ$s8VbGdD0TBx1>v-I~|Vn5~_b zVA?~|Fzo1oy^}Y5+E`fh^*~&Rht?>v;(_>ybMFbRxZ8-|JjAr@E)Us!2sxh)7Qy>N zOTo9DwG=@vN`>S!Na_}J*??$}iP5$3m!4mUoYlFoEs43^R6cOWpzy-Qh9RHcR#$7{ zJ`5F0Zz8V8uuWkBsgw!Jj>XR8)FSlh=O85ySoJbZ3}M5J$HpU{xH8h<*q{97UK2ah z>*K@OIa!0p{5)_V^Quk|lt?*q&t#VL6-#>~@aNoim(TM8h+Rrivq?|))p;xG*#w~p>gl=p+>Zh|}H-QD1EcVOhFV;+MHag|6vp{6d;bdY(kWLVY9JWz1o zr$2LHs#@Oa6H24^n}~rk52q4;ryd*V82qag1 zqUgHL=*c`9%1XIs@0l(UGK-v)Bk5l|0|-PtZT8ulr`UI9F($Jz!{Q~Efw|=Pm5J|! zq1Wx(s|a0It`D*o9+i$5!xPB`e)T^U!v>nOp zj__Z!`$I4`8VBPOU}Bt77z24xPwb9}~C50!x#_wC)= zPsiZIq))>A{-T#4*>{+i)4jHGX3!P;dlz0?U99P}c;b^GmV-l%Eb4Sl{voiUJL?_n z^y&NL-o^Xo8dkZrHs||rvm(lOEUO!v=MiSCgqHKH>wE2lPk)VA0j?)rYG@TEpoDG7OTb z+su{O=~mc`rbzJcUhLvd=Rp{zJaf)dBra&_lay$ik-G&~UIN8Dn%qxl0!TA|2qX=A0o;I=8m5xceb4v#-gnTT zFF$Zy;s`se=)H`~EI{7|G!hn1Gd9*+CtSIs-D9|Bb`RSa3Z*sUBcz4RD;ZFHVKp%A zbCOpV_e1$%{dIXN2c~?2qDD41aG|Mqj9RDOCmlV-=KgZaUK22}_>j z=g%|h;rZu_twsABblTbxG7o$#WE}#EQ@a0CDNTJVM(=RNV`Kn*gwFXwlzzmVbxqcj zLfOCfJT#A3s~e@cz5>@JT-$xO7G^H4)rY;3NR;mfNsH*xLjU`!n(Ny~bAzOZ`-=ID z7bn$8;&uoso0HXP!uavrXvc|LSO<5N6X~aZB^3!8Q=5cr(%rT8*>gp{#3zF$czB&~ z{w!V+uoC%`Lvg~|#QW`f4H!K5E0GCCp(AcNL~^@2Gh8>C^?Vx6>+}tH>L$$OE6W~T zUJ`vh&DO=>?^1}xE45OwqRX(>c6xDjv3}0$2OQ&67{U!LxO7^bv)w9XctZ-l;JflH zn-VzI5z7ay1Pd|GvI+inF2k$YnSd5qxk}XG+!rLT#}yJ6YnGxINYlL-)|R_9)@2Ru zp_Ws$?r%iShn)w0C!OZRGSTiLpn-dRwErlJgb?Z=K@Fm5qf=9-(Fc0SyPfoY?vI`{ z=?kHklH$B%80D?_kA^tm4+$ma5#6@;GTnRh5Yy)~@#JVeN#9EDmtTIt;~QqE`u9DB z)vmPmE~Fk%4yXI%yzBuGw2P9;fc`otf?=qao?W$Nc^P>eB`Z}m-L+l2cHN12!Z~4R zpa!a^=99P=+$$xXj*pV_5Y9`F8!eLDmrg#rEwA0hcBv-gDpYq{YmKkFSyXPwsHqFi zr<+$$ka8&;Uvr)UjKig03gt4#XQ520V-MAh950f6{nGu-O#%{r(%^01aKjydw_#Qc z$vNlDZqm3p`+Z*i-u0*8^y`Z14#nTE+@2qvzR--mgh2rF)$5P1&(tJeM_YK;_(X8< zAo4AyR_I&gZE&L%3s)xK`#S|hZnM5-Hsp*JBEhH%;>;z-r@yXctw$eyo=9dlYu}_E z|B4New8Z=gnB982r;{rXh+3G)Qqi96ZpD-vG#&3ArnxHbZ`eCz7(Y7*FC(wAH)QXk zZ+HA?ch9aUWZpSPiHUZ|(UOQF@_NXGbTxn8(>hhp zjo#1VQj?Q&7cgtc?`y2vm2-!buG!W9T^X19*h>@xRo||WHX1kE6v37GM&@mv+;Jj1 z8l`f1dHM6aaX`z1%T)}$p9m$y`W@T12PuTWo5rrKT=j%bh3}7h&bwvffz$F($f(5% z+(Ch6=;&1Jgd8R^s*7tZRyI@c8J?U1^ZGl7fB){?hw4NP$VU-&vFFxJ?y&9JFNxEU zyN~p16zpZ{_qMN^#sL~onbQ?o6li@c^cSi*KcccB>D$Z0!V&vuJ@ICra1 zKar=|x%I`8;gVP5=|dksy2|;6H2I4e*T&|1uGtDcGU7t#lI)qm5AVfsCDJYMPstC} zUjLTCx!l$JKScr!IRcWdV3EhWH&bH`?s6l zY(d4E!2qpgVNOUg(`EYgTjAN#V`M~I9B_Y|Roa7rsv(CC{Kkj=nzNHm!_SN>smsidw}N1gggNwF4Z$)4p)XGdm_6zbwff5O<2E}Ot$;=VhhFJz8M$(pZx^Jb~4 z?Ntf;VKj8<$;c}{rTF7yMAU+Ls1OI=x=B9Ran1G(U>8UeV$B5%oh#hVqpv?ywk(T( zfz1MY?EOEZS z(SNm9kmhTz!}S}Z=XgBbfIo)*##O$q77iIU`(-7LQ+QB<0TuJjajntuh%TJz*XCs` zFx8T|tHSSE?4<|!+~;<0wVdz^Z%?NFO9X7GvJTKv$wn=I4$==im`69Cc{tumWgDGI zy}?2xwWOfyJau`9T4o{*Zty&C0Xp9CtgjS3qJ8gshjIjS&xhf{@-Wtmf{#yCRU8@| zJc)*++)Oc->amJPO*}UGSUR6M%Vec}&w4^lr0Ne=2>FzJn9Sr@`P!Oq=nHfD^A==m ziip+-q3V#UAc54v)NRdH%3em*E{;thbjimap4acr@rm`od2t?tw)hX6>gmc3g}&pW z1QDzpG?BDs)#f(Fgrktw`QvVsiLd z4xez0r*1;qoOFG$N@7m>^iPYiJh-RQKno|nHgTLFOZLOs;}OX7xc6CNm~vGn>z=Ui zd{}bv;PvT;)&>dc&zk^0zF%%!2+Nv_)b;!Ju z&n?Pq)zHOr*@AIre=51KIfbzmR9B;BUx#dH|FCZF!MdEG+D=0>C3t`21j~^Toe8bt z4yyR%D}aQ;?I(idZN@38$9kIe8tPEdcl`E&)q%S9LztnLA5($p-S9w0+iZB8q~WZk*8Na5;kTrQ-2w8IQ6TK# z#R=|0VjJp6e%m&h45I59eUVt|s@$U&wcc|;>0IpzD^enUwX`S#o(MQj;3H8?o9glaTq8rQ`q&y1pZKRNx(T#|63sJ{Jk?C0yvo45YKsjaFvNpk-W zlh&`zEN`2%ZX3A{w6%@u$g7NlX!S24?HX$tjj3%tH?vE|tM5IpKT`w==5v8_Nppl! zdA(jv$8FrRan>GPtc+Ktptn!#F;c(pHfg!C!*9hYdjToC?&Zt#B#9y2rXXVE#x=X_(WXo z5jKnUNXXt{n~fc-;EB-=p`8)Q2W;pzg9#It8T^+bCI1fvYEFaJ%Njm?62n9= z?9t`Bb4%jh_QbiJp+?uXO>yz|>fZ6u-`B-zh$B97)ya8QszIiDe^u8)?^g;xIY43l zDT;Nj-NE>0@M~^d-(Jh3o|f=q0t3;|r84l!^~x-Q>>S6G7IjZ2EZtEr?E~X;zDs{KOkJSSM`+VWD!UewdLijc%5`( zs>xM9t`;|6-pjEH1scAR7zyq5^YfR*BY+WuyRq_9OBM+|};J2w6liAUj;| zUeStbYG#=YmyDwBxgDw?%*UidxMe-5;Y#7)+Lt{dByb@V1rO-xq?MBtsby={0ue zV3I?KXDZ%hJjLl_kHVe=asp+QH23zK<7&B_6xyFf`gckV1K0iyh~Ps>ftdko7T z;zNbRbJU@cGBD&PG;YcoqAl^?i99#lN94INXWOHS(Yo2Mq}0tTUz|RJ{y(Q?>cIC1 z8QB%ojgM!o*;}B&&(LP3XI$r<2=5VnuLBxugrA7D4fFw4j52O z0SO%-IO(2%jWN820Y!ca)5Lej4xGi(xM`?`8tar^bONemq~jh=lud@G8tn>LdL%J` zjf2M8PJ7%pvFy|mBs|f69x@?0{IFY$*+uNe<<2`>xIu2{RWEW^9Op84$DsY$w{DSf z;D6B%|8(v++E=v&k$&l2(n=qQCDkqaKDq%^pC5R1y`Il6*z>GrHxieyBS5(z3@j^a zo>dOl(s~YK1hS3E2x1;|uSa}z`p@{7Lx$yH-L7c$i5CV>G?74W{%-dCs1J+tmS#_P z8z}&q5BLU3NL-yty;zJC21K5@$s>bBgtzQSy8*{W(#EQuxAD+7IB{yj^D9c_dtyJKcWYW%5js$WYsnRA>I^f-2;li($4^cHi||MfMk z1M&^>Yhg)8ObcidU2}jGDguC-PYr*x&OGJ^|7>Ig69uiB{^KWa3D1Cl0g|Y;#Eu#m z)~M5*jV~I+6YBi+3HeFu?yy(?^%KQ^%$NPkL-PCoW)b)s|9dFCST~9PJ(Rv}8TiF% z#(&;rg24Zmum3x0+4ST(X3%#>$2e9RgUgZ23tCPdlKQQW#56Z>LTl^&-(^nE4VQS~ zEp4=Pm`;~1`pYG^)#w=+?ccW#*@ih|Rk*03Q;KTBEy}j%r6Ic*GVkO)32CF7ti>7J(c;ND=UXS-{yau^{6Y!bYLzKtxQ< zA{hKjFcIENZTjZTYW+}Sn&RAj&YmCXSrhkF&u;>X%=75u=%ahYIi<;T_4{8X8XGA_ zU|PYOYXOv|1pqysucnV5P0xM@6#sj9po3b^jc(v%0wcY1hcqK?W4O~X;y#*gFf8aCci6;?9j{h)q*XhE;|$g$A)B@z8k0dbh2-RjThOKC+17jrcGnHNKI%7*FNl@ z8*uVuCYca|O0v?iWU|zj@byy@6BFIcWN3_lpd+3kt;QGFixlZyOTNJWjerFh+)jeb zLJ9K=;9AA+FMe;iob$`A1MAi@{LR@boCNUyd{}(rnnAHiO^$o8v#GcvA>kmBa~AMk z;ArMXjTy9^ZgV4bx**g+r`N;fH$$jF!SWp8>$$A8iYhcqwBAf^$;15ywQjp43lvyG zS3wUX2A2nylBs+m+QEVrj4E$km^LqO4OTKJ4jvEUii3m(!)L%c74CSkH}& z!P}QZChbjDBEUH{l@9@ToCWi#>o7Zk#{=hKPTTWjZ&J{jb zQ7oB8-iy~%MAm*D#vD7?YS}S(n*c*`i^M$t)mdu5fB^#sj@oBMw<-~w0mBksNv>MB zuar3FqGM6O{+HwF<2_$PPxz-SbLwhI>}pUN(tVD3uJGs&t8LQSX*43n==E<&VfU~qLYzDB`l?ONPTR3VAYC_J{h*X!Fni;cNy_IhOEc>l)DLFa5Co$27Ck*_OG183EiZxU%QM3|Q1|7n@1Re5 z?Oxr{4pg)6*GPH&PZ^@8OUFKYXw&neJ!H>G!sJ?eKVTON;&T5iL)&V)DCC>fJmW6rwFwKWbL9k;BtJylt zFk9eOy1lD#b%8P5Zx(h*2kY_gTtQ3NSCUj>DvpbqW@3<$NpLZ%43s;pTr}UH`9W~= z@oDA2#5`$+?K`J+FG0{9yn}V~=F{_6&OiW@RYmqk;l9=C_4w&Z2^zcJhnK!r4O(fh zcJa8jPo`uTnPbk4JDj%#J026@%pCi;uZ-Hdi$i^^ZOHl+@0PTO7joHlxmE^=#RL%# z8W*Ic7X2HUOM*48P4+*lsbIH?HS9eEk-n9%SP%p7=U$WFkaZQ23J2`cAcj6;lJKW1T?->-I&iyXD zu?Yot6|N{OEFkoqlxfUYowA+;HWl??($tQZr^bgp`f104jg{w4-}RP*d8v)n3v2TF zqfayJCR$z!zR@J=U?6)8hmCBo@#G!r&z(EYQx)Y-T7MIKg%VPyQ;O&Lk31l`3`)w= z{!AU)EnMCNQXP1|oNgs{AsQMQ7*W=Q1AGw7{I!P>Uk(k}xK;j{t>mlOmq?566*xF- zq)}zxg&zDr^pgHhv~Yh`Q?2QNG+qm9@3P5412FZBL|Z1g*=HR;)YcCBSFf>yHDLV+0)<8v1d~ zA3#Z(W^UMsRi_L4qvNZE`HoH(RFUj~Cr_GT#&Q$Wy$xCz`iqiMJnbjvDOo5$)YZE! zy8PuAyBD)B-T1NS#eg(1*TLKePVEQN7mNhGx?@T5+`yC<67GXUZn7l^mZmL3?E2)C zU#$xH99dk0Qhvq9SHSJ>!CTL4+`E6jx%H}8wE8@UTGm+zgopg+d~0cOQ51~ymA6TD zR#lI$A`)524=;W-Xuk(3N5v)wr^f@@oy&%*$Uax{{j;(0esyjMi*#=(1Yu^0_r$rp zXHVj8EE32;HzzTR%b`foMeD$pYqq=g>`^q0KA1iTII2=@S={I1 z*MjA(T;S=e*)p&hVwXba49DUg58jTtT5B&Iskv0cZTbFz!S4p>@B^50KK_v9uakil zC26~pD-CwIxId1LL*!oBL#4aBkrW--vl-5XW?(hFEmJ#^1^L)XKHt+nuE}o9Qf#AA zq6-YHUPf|dy8kNW=%w>Z7UmUo9@jxTO-A3}@`(9@E7W3}JUr%JRALzDt&&rk|Jd4I zL)%Ndn|5+Q@Vux(k-(8H4ISD#Q8kbLAN(!(#z`(!1|$Ou7A&aLgTWWISV`UjQV6)i zp(F3T&|RT4#W}F@tr{GUuY}M%hDr%?9~gOeIRH2Nuwyq)9*P{&c(U6_?>-WXAVOF1 zA$3H;Msc@lk?z0*3Ujl_GFqo0TAL@08~2`EiNPYG9mdjk)fa5KlmR{S357>e$nIr2g!VN>vFtT6p~Q6)PpP6nfMztOl&Tuhodb$A#;Le9Djzktcs$=jF>v1q;_pcVKvVL3(!ePgKsq2xw&8%Xo(@UMo zsVInn;f+(a_v~~7I1~Fe#qtSk^yZ&as=9aY{_YL$5c0`U^e-X8IS+6WjxL z?#z*zjIcqLQD$89fS!Uu^QK|f7W)E?XQUyQ*7v(VPjiN(PRJxT#nNShRuH34z}S4H zqk_hwfbk*MbsM{%CYs}!^1;X6oQ71F4V5`kMVs2sb##0uWS?uvxzjkqKctwR^)!nC zj89zLlI*=jQYTf>!H644d94_@QLygbe=p9ATQ|Vy{?hVo-`==O7}{A{8P+;GbV<15 z-J#F>t`cKKc^`5g=z)7CI(-!!Crnf<^=bcC@k$%=KscGpQIw|3M44ZgG(W%jc0AjS zY0dPkXlCWcX+s(!^!}_PCbQjqda#$bZm;FvHz_`Ansrsb&QB%tpgLFWO4s21Cgez9 zXqSOQNydue7Zn?4bTB});YRKZL$$tf-}MpFmE9&fJW?oKRxrY*@;G?ph4q&tI!5g= z*|Ffsodh}8n#W3VGttyIJ73VO#L~c5vTBUVPc;g?H_RC@UHw{d@g?l(LJQ7(e{1lWdHEfO$ZKhNbDs&1`_|7JigjNqawIYEO&2MA^!%mRjc}OnrwD7` zz=`CLuMR$Mr=zjp$7bs#XW#WXbQY+R4?`Njiu>p=2&r)BiLLV&@1J?>=oT}sS^HO5 zMFO>(YPoV`K*^VD7f#| zeW^n@@Stsrh_bKG@O#zAbaufQA5`hyp|NVXagI~B!BnzbC6W7@KeTE$)=mCp&#TtK zpNC{jJijF@x}TI(_H*Oi8S=OGEHO3hH$u@keB7=59SzMz( z%N+mvWgl*T&;07xcsb+My2J+WmWx*=PM&bDS7>S3@e@y{z(KCt9ZGa=cw01j`SMr9 z!qG8We>Q(u=apFWx&7il37a3bxS~k>nnK@!> zm)gFyeI=&pc6yrt>eRfWx9t5Pnz{=8&{Yb3>c=C5^KpfX7A?ADU#NTNXCck))8|^t z&9``fuR-VN(yNTTy71L<{RWy7+#EmaFh(Tzkb%PaS1 z6?K(^nE+H$hBNBUowHMS114U1>3n zMU8?6qU%rX_Xk&0RY7k3LO6lZlYjsIlgtcH(Nd~G@lgV?zaH7Z+0-%ev7@*j~jjIku|oq2Ll3bX6W16 z{vvm?pkVyOiARS8rR|@itEdt6>%P`u5_ja3mG`fM?Nof`5`#6LQ@c=|BK~;|yhBeR z&^Qf`qr^lN7r*%mSijz3c%JTtQ~H_SEpOkvk?!CB*0VYDq{lHU?8K;kk9K)m+I%}a ztq;-TVd2-TYa7r_!p`_DH)Ph_of4DgJ&o`8GWqa=DXKAXUH8dMKH||~^@Xz&2gJnB5*Qr_(DLRtB2TP0?Lb^KDQR2yoZ*Vf$|Ry^)?^Fv*Z$k{5li!X$joG5tZGh94!f-M+|mwZ zvaT>F8f0uE!!!p}w7rmPrpqKwrP6}lRP~mss=BzCbRj2LA`^~iY)lbl?vNov-V|}! zlJ{+hz)IoSrS-BGhkbCH)L(7rA;k?L3ry_4cbWf`fm{2mQ!ZYN?2oV=;hk`Km7VN9 zhFMrNGog;qz@9u|TvoU4-EUmKj)lR#efyyBIILQ=%HCegEFsWu$S;uyG^cK(45M&P z_^|!={e8M^C&Y){`Wg1`<=@_iZEe>nr(<5&@8)})x^*+L?2F6t23OYz3%spJ5K73> zs(c5~xdd+%t!os%k)RU}mOPh8QNVmN9(C zjva(pW|{u9=FHd)P{(sKXh+F!Jbh~GqlT%wj;}L3b!1b!q22SCa{gJi>fQb`hx3h|vc?_PVY_3eG^KlX8a z$MN;gTJQT(zn%3-W-aR&pM5y9LGA)7@t3$bd`B~DM!T>}FH@B_mTW>aG$=6oxV z!_&5uN;@T>Jz9?eZ!lhQuLrwQ)zzBt=Kuhq7*AsC!XzLL`OOsq%MDc6Du0JRvGkbQ z+9hZbEUtHKLyrQ?2_MN1B5-Is@NjlQl!(xluJn>sWEbFr5B9!gjBDCB&ZKM)HZN)0 zyEAS}U|!pkCuZ~eeDm}3+d8xG9L1{yn4FlZ{MHT?Sg{n1SgY15@IniMnwX%^FyUw$ z*m0yG9B4D38r(IqmmMNkoCXxkN9KF{P%(fQHs_4c$iYYBU}XiPjhScZ(tQUH9(-16 zv8!WBeFc|?TGae13T2PaNoI;1$4sM|uB9bc6-j7)+Ovv0Vp~A^AtJng|K7L+$q3uI z@vBKFOaTz0B`^9|e}#~C=JKHPG5i$x>*o>_ zRM^*9hAVY1f%e5_DJks0aKpEsoSdvVC^AOLHUPA^fKQ3{gsz1sb0IKB)WTFpCu*Kf z@nv$s5musqiHhjV=@$V6#ZSk3Kyc=)H56ebClw$Sep3QoqkS?pPSq`gN(X7OAj#9y zGrz#`)asTePaFaoCe{h+W!awG(9+t9mASDs$pd?_H!WJv?KK)NG|G-3rwpVbDu zN-kPX(#VakXuuo6S9dq&(ENe&&d%e*0#uVb)_3Xk(3>|mF!+h?4znK@C%-Mih>uva zE-Z93<6ml@Jc6Gte!BrGR%{(_?mAs5WBiUr>BXiOn<$i(+cwcq+8clLURL+!KRhp- zT{Qh^vx>@H;GMF!v1KWiD<*yf02)%GU?>LEQdRcNZHR3-@gFg6i*}v7v~>0(I_6(C zyrD3sbHhk=Xbd2b8(PBg>8iXKlm}usjCYed6KIURF4OpUz#vA3hiAuoKZ5DM$4d8N zv!dej*ROW~L48k8vz~}o5NMETEAZ+tFL(ytH5nP`H)o&>39?qp;xif0W!kHz=6qBg zFz?sTgI8o7qZW2*;`$=ufC{u3=M+9c8CA1Uj~ z@B(tL$sg;pW?3-V^SdrKES*d0ap#WC9aI#>H-@4Vr!w&C6}LKG)usxZFleb|H^~G` zJ=!=6xe?NuQ08%5vrtA^*_#++_HZnk7cgRo^3)Y;-$*6K?eK61Za)GOP{F(gufQyD zMo4RxQ(Y(vsv#DFGEPSq>X=1f%1r7o0m2rC)=%$f6I(#`KupWIVZ-LueTtSi)aL*@ z;m!_Y;(T;eSWplaei&OY6jE)SW=}G=w@&!$X}?2b zapRj^2XtxSOcshoUqg6)SFAzQ$}6aXMv=9TxD*@auBbY6`0#^oBC@i^G^RP#ckZm_ zQH-g!M_?|M!wK(+uRx1rX=Ua4Z;y8LWm$iJe_Od{BZ!lbpM?wXp7%W5F$=r@x5d_u0>bzW_19&Jdv)`XlVrVUWs@ zpkmES`;&rgS$vnikv%A|Ujk;Ha``eUhU140-QN>~O{=H^Fmrvav~*A7$&%yPgK`jR zd1sh@svF5<8~8x`K1#o~?QMX?(gwTJZ_l4}Kv`ga)wL0|63k0uEHPlc?wH-O4(D;Y zBX>TSNuiK+dc#0_tWs?1L5UOWKLIJ`?Qg}yI&x&J7r;YTD-y9KHh220!9r>*l{GA? zsnKKE{P&p^RBPg;bR3wy^jYrPR}V;(`?TBmN=>FzX$HN+ugTTB|> zLMw^;gQhnk(E|s}Xw!!kG)N{;T88@G48+SHn(;TrR4Z_vw<9B(ZrSg71wz+hpBhVR zr*!zqwT;QB*q8*g>>M3g)B)CWF);;S&^~!VIFMw=#2yc+tb+=?C{YfTLCX?ujV&wH zB_-muTs%AjsHstWRd`^iBG~9yQLUUTV>YQm8dZJai!0CcSz~ByOh+>OsZRd44T8{? z9fu1zvbCNY+(@?H+@&lZZ4P%KGKVX#ps&c!_U0dXZp}Ie1g+uWhK$U9t4Xv~=+Mo~ z+J6>;KAWA!}#LB;|W3A^@eKdmxM2fe7Dx z{T6D+HyEsP9k}!0hkb0nbU5P?J3Ec&%aFZ_RT(%m@j_{dYZMlx76Ld8zYdc+#v7r4 zb8V|B(v$mfhEd@aQr{UW$r`F+5N}u@w7tg4*H?KdHaq(*U_cT<-7Z8$;pHr%O+$Gr zc2eVq?%sH6CX&q&}w02C3~H|*jiC+9^j9niVF6E8kC@yLmk({ zI@fbT?a`x01jiQ=@8vNBo7N*YYvtc^-+k|eN0-eg0sYUPceJ9hGwPOASpiGV-JGV( zj)xD&CMIf10t2^}4_kH{#rYr#2cYUd9F93Vqp&zOMT%T0F)>TXqU#&ojrFn($V6tx z)9tWx2JEoi_R;D&vsFFnjc+T}7o78H3%S(exw#dp!jEAQuZmAJaOQa+qh|zGZh}8i`mkX>+TSLQOr;v=> zYa&V*c=g~x@Z>rZb90d@McfqoHUTmj1E!l%ofvOn4sj-PXHl}*?_$1@gey%2Uc_^+ zCi*=L$Is6x?2S2@hKQU2San+f=eeG|wAt*|Xl9i330W|s3 zfxmc!jP~uj4%7!^&XH{tSFY@%Rq~$XQC?Ae?)Gg3e{nwM3+8Tb zv0kRDwN$hxbw=R*=%}t__#!*YXXD@jgd70(thCDks;!rGSY4lb_C@g&2|sCjB)=}R z^rHUja$A(Vji5cMZD=Ud0M>y~NqOluaOdrZ52xW=gi=hjHtEGKags+Np(73Ht_&s5 zf~>3{Ye*bj(R-w-EoD(CNI-CN4k(LNSlaZlZ$O+?nv7tC7v-D#5;n~Sh}ymR}|Hd&b0m9 zJv2t;(;Rq4SWT!L%?HjXCVh%UKRj^;itB#zWd7~%3kxWwHD^#vc(eIH0_fw~UL)N2s+{nXo`SRsGZcm$=Ic4k~qo+bc zP%sGRi^s!WEhbkRiFr*q+sg{Xn}fSh%sbOqU1-4Veu7?qtTD)o~H{L+?~q zH`lcyoT8M$ei6nlc{MyeYwHbFKQQFOg?eVE{S%3KYJU*s<`@IegadQ& zlHDvOmL_B0g79e1x$drv!G2!#?;78iQ;OCxQG%Fnl&L`=Emrv*q(jQx+fJS8BCHXc zzGE)PT>29@pl$2bXz;zc)+Ka5^}x4eYuDWsRdnF0QXzl)PXLsK&|jO_-nwxkCM`wj z&Jyt=6_=KfxU{&>3v*ym(5f`HH6VZ{T{q}BO*)8|&FH*O-Z3!X*9LsSG-> zxAB9pJ49uDg)m>4Ev)}BeX(Z%wA|jpdXEu0DS5yr^RVW;dGpMdH&oub+S*N^-=>U2 zzNm|n<7&E3a=(T1y-M4t2ADLNO*RljET@`3&>1D+zVYuBv#^PZ zL1Jm$pA#R?Qo9WvSWt+&3r0mp7bd$LKYnMhk&0rF+tXt*D&`qsN|9)>@*lsrf{L@K56Q23T`e)bVj*{A^-}zt>Rkc2JsJ=)FD{1*xAUWj{L5?q_$}6`QpYT!K5{c{=0sQGO{^FXMY8AW&3w^AiCNGlf=c!|ER5>jm+qf z!=8{}P=X7O8I1(54CiCV?gst}7!@=IR0b!IO22#zN0YEOaK|vpA7V^%E3}p7AWkAi zbCt9O_sYLdaGKvprMd%$DgVr0Fe!;qkzQ)(=;^5>h(Q6`+Pj3_R`EvP*`ogjo3pQ9 z-^k32-Xs~LN|VhCXkApL09sy>r>6uBw)kMnlIY^%bm1-mtbFEXJ=+Ec7Q|97~ z=jSf~$-6H_>gfEUj@<18hruU{&CJ|;EiFAAC5zXm7m2nUu$cr-no&K1&y3u`P8U{@ zY<1uOENbuJ{9`I*f87Q_tPXnp`gNNm(woQdF1gY0hT@6K%nbh#3TB_f&}e3@b_-rv zw_7Dv6k)%f={9}*weP<^^c1sf58E1#Jx)j+Yc}pU?&!Fw$`?Y-9Cj@KWtXy+kl!98 zVRy8M!lv2I3$XAdsyyJYfb1>_Od+w2*>BoZh*~9kz|N`UzSL_g(KHb!0gD%sy&nV> z6ui+($vC8EWcb5-Qe3}Te~B>u&{}XJIE~ikRotEneP{10Acr9AA{AZcUAmw*1y;tzBVu}- z3cNC6l33^~{zB!lfDVW$QUSK2nY~$6WiJF@W$?t~U+j&M*l&9btx z&=`zYhDRT&8&_kIyY$^(Pgx{tPySINxL8;7Epx zq=g6Mf;+S;AUHH^h9E{zG;-oWj93renneZVGS7+(9|9?ExrU05rBWLBVg&MIY7TLr_=`1Ey_1u(BG2%U;<|za z@2%vo+{a$I50eaI>y}e~sCbU9Uc3%FiyN8jK->T$ps(JA(@$zzVJJxhAdQC2UKm}i z&lLYLCk6q5T-=t|^?~&RJCq?t2Qm(%5la!$(#S;cojc~Sxwu-us7*QnC*0+?FzgA? z*yD_Z%J5x)BBC=sGl>U^S`J(!0|PFfsOS}pd~Nw93Sw45bOd+;;tedKHjAn`I22sG zNT2u=J*k+NqQNQ%{z6=RkX=yJztfR8vumW>pkp)X1eyWqp8olxTH?$>O!Z?~MR)fM z@>pC~LSo{{&#yC{_yNb^;S}pK8&O%_ary^=4~s;E!i4P)tbk`5A>tUj0Mnz*_Snz6 zWlIdBjK{D}wt>j6!$ERA;c5hZL{SGZd;^Q$kA=?m_DDt}RFJq?lLH_bi@t{K(bpHM z1pqRl2YHTqcuC1IGqa?;QoG|OXw7psxhK7X9O};6qv&t7{mHMJiQ2zn{0ueNol zS20Qz?&#|1NYEm@*eB@C>#D2k+51h#=sQ#K z(q-qrHc|y?qi)Sgb5d2M9Fr&kbzm4xFDWUB`2IMy8SyFg7d=ljFV?jYQ1$xto#-*A zyiWrh*4^H{DHPic_djrdqPhvlI*6tf%a>z|=L5tPw(~A7F3{v)wzLv;dd3d_w5sb9 z42ezZYVksXg7~vf(CC5b!3RS8%pbg50OZH(^J{+$B|yP~7elvtbz5tzxIzh3O@vGk zFTsUkXJx&yLsCKlyHr;v7GfC){6_AG3!kwXnPOCZKlL1CZE*Uudc5;yYAkYsD}okn z`HdUqcTc$hbMQ$6MPQJjhwyrlV`qZC2rHJ$bUb+Q7E-yPE2tBz&=7<&LjI3>uqEy= z#w9^X(emLc3{g{{+=T^XC?jw)kO<;Yes)JqNWFMY=BmgfQ>g z8Ny9~D<20)ThfVFWz%)Pi@!XI1LQzx3}QSkjS>b$QLmAqNW~Mpb02VYTRxrSJK}W@ zlm==s=qP>`m6jey$^a#bXN#dugD>mESM@GO03gUy(DCK`vEdYo$ONQ9kebCv=dI)B ze%ap-kGIArPs)IG;L*bV$RAJBd`7Ezlcb~zz8(5ANNhpq#>EjFn^R_(w59bT$yR`> zAl^k(4*WKIv~F5(T!p_~sSqkWwjdiMnkA5`H!CUzUcLGb91KYsdlv}Rf4%-ExbMjq zRUhHlz;}{s0vskV@m0%1aE;MLdE~KP&>%QsjaPAbxjV`YphYOz;?mMky7uDzIv3qU zxLUn#OVG32UqVSk}UA+^%`_Xz6#xEiIe?A?mC zvD0yVM8k-*R0X>$^t3WEUC*9z{8+mPA0y)pOno?)8e6b(a7bBJiUbBADj+f(&Bs=m;#1EI>#099YzGF~L#K8*C_w0Z{0B=1gn3fXLpJ|7a+FybjVK z`Zzoiba5U#<+p4h8g58_o@S^t`JSJ_qa@dIKbBpPQ5F1hL}Kw1rrq5@{{&5mp?v+) zycPZjPs#_lA@~OLw#dgIe=v5h$j3)?gg7;b0L24M=EX%4z^{Mz(91{v_~C&-j{4P&&GZl(*|Q>zb)tu=#3pFY)RK{KIfkFKS=4ycg4EH86Az=&y z+sexGW1Y6p&h+TX-un*QT@c+!J{vY}v@tOuZk|AE@UI|W^FdJbJNbs1Vo;9Xn$&@K z{9vC@dxQdF+=Vl@apM(qFF2HXQOz2Zg)lQZ-dq50unz#p@D>RfnKYC!Sk(aE6n#8c znLwo5>B!~O9(OV68#;5k-TSI^JSWmz}w5Lha zsXG40M>R}7HFD}+P|IqlyeJKCr&;mSRJSi*7JTj6wFvsE@^VA>3lxgjA!qV+b<&b@ zLQR||CN?;j>evc80|DIa4QFVWM)zF{lE6C+%9$u`g}p+(R10g# zPtrg8U;U;!`(CmA%a8y44?na2^^=o-`M-I7NQlH#Up~yXf(n&%>qURv}zkHNyg3K3s4$@G9ehH}RETgzD3s!w) z`Y(T?LwA8~14VA-fB6u$lkffSUkm5|s~7g~N0a=m|KA_&|2JpgfB8WWzx zXz;`J;DdDW8SUkiINC6*(Ed57c0MsFiEG`PQJP9-bvcR?&2n+PTuqVh1@cl-QYZmM zMT=36KyL!rKu$qnzqNbTHswV>Y7%T_R%!6Z)_kN;YIs#tz9XGhvB6f=*`DBMhaFpF zQfLgMqtNM}K7HDK6Uzk+q;6Qz?*>%JR+9TD%;}9G_-qt#P~78_A3uKlaz+N6@E_je zO+L7LcQc+9W|m?uUk0A@erTu*9Ekm|Lth{X2JwV45}&~o-lXmA*Dxr&P}k=iQMo&k z&g@P~57joUbsNrJo9JOqQgi(gkXyX;-7rdTKvz$4D*J$L?NNV>-JlT0;IM^(fvOwy zd$V(M2X8t=hK13577Cdb`M!8=Twook)^FW!UrqT!?Bjr%p#eAz-A9-&4-7bRp&BGr zAo_Obju;pi*h+W9B^cIUC^%3BTWloSKs3Xlq?#kx2QQ->^uJ&Y@fu*;0Yu#iVCYx_ z$^{GbI(Pu5PMxZzv9PqnBb@H%d;O z)La`->MZS`KQUb4M-HdhG;` z9mKjAKJJvJl{;W)*h!pZpyUVh*?)z)4$y5l?Q*;L9 zmcIh=Q3#@jo)rZY)PA2neFEtXZ3kAF=i+zxwy^NUlu@J?rx|QY6^cOUeX*ohQAr8x z+9W6h=%Y~Oftq%KMQw|i0P_Xmy_Zu`Qx|_Ook?V)OWRlHw3`;z&bp{ZP*1I7;OeOl z3`FIMUme~gjOw71(d5p813>k51!FRNd}Q%qg!k&M%Zv=$zJV%&MHD*KT1-yk=i=;O zKch0PF)t%DK_`GxRM?ycRUH}@24_eWD6a5n(B1680yfY0QPtIp7#~70`4{?%X{*!O z2Jo|~Loira@afaWRRF}fglEw4r7~*B#b{Ru+h*aa_4Q2WnhuGp^q#km;jaIr&r-K> zq^{vwXbA3COoQHoIvebM6)7 zl+lvnDobC3Lb>NVH59gxtBfiPl`nKh?O2ToF&#dGKjegsE8{CGDlqg0f2D-$VN4nK49J=dbV!cc3|7SGiSczm(>$t6%+p={GE8=@bm3^_H6K$3%8Vgu+e(hzyW>7cpnfz zB_*ZVc~A*xDlwxFthxmYGbSdE_x8NUTg-Yfjt6aO%x!7F(hESLkmQs(2SKL1pR~R zYNr!=OnTTJkQ%v?o)kO3n3$TmNUu<-*|zVtXEARti@Zyed}7uGHAWe=ijXllX} zQ^sH|!X)B=14F9tcTZK#b92sJd8?$>(!dk1_}3V4m*kiAvI+{%;PTqmHi6_5!GX1! zI9I`{H_&D6UgCo*6E3?R?NJzUxw@8Be2kBYQH@rKj8aQvx9N=If5)l>Fa?0R>AmSR z#++bnkSQm;ye5DkL2p#Oipbxr_<%TLlq+fgk4}^Q~O-n@?(WnfAJ29 zvjYoDTE?wk1?rRUB%ZGsqFy=jsuH7>adf)4F^65H#Km*Z%gf8i9GO3|T)!X>*InF? z^bOZY-;l)$EUWEqKkk%gA*=`-aLH5ek^=@*{LxUZ!guML{GwF<=MoGAp|_#s83Pbei<|ghi8Zd~&r|KKuhdSS1Le=a(E zdwU^0QPx-;U@QXaItYZA(NQwG`X*dV*U#j1uqyAnI%IkR_COPWbDHO%M~m>Ds_33G zvDjU7IFd`w=?h@;(Nml&S5ORy^8ywvw}W@<@3-*7NE@hz5Jo^XR={!)5N&O30j~tB z-k%EeLfnSgI`W~M>wx*B2Mp+xdMK~(J~0nndFvMYK7d+A=H@z*sMri1Fsq#=(}}LG zPq^kSF6ZZu0Fp+9Scmt8SemGkEF^UbYj1E`5nX}539(UG248pDU4k5xn20@UPc`_N zYCDm+AgG312--q{uZ@mjMG6|!^?)EZ+tlr$b@%WfjvY|zg8^uaXTY6Ci0YX}!2#gt zkssqe{K(g+npTloW&DvZrF6C|U)Kux8tVQwfBdYr*q?A{XnTKdSunA>VY^25 zHWwe>23kfiAKUwmta-bOwjUofOqW0zRqv3Yl;Vmf!o@W1?R$!n-hOa9W&{{309^E) z8h7WOa~0{vK$n>1Lp%rrNk_!U(gBk#-3*lIVIQ>h+ILa;q3^2yFxjYrH#yL`Y+M;0Z0BKOP1I27mb?S;k(<(xs} zN`Vzr@%#cS7QcPN7zkb;N(<~fBWr0uJDPRn9UN!qynh{8c~o;0m`baDQbtDmo_UOS zhZn+ckh6DCJ&9_^hkg&xqNO@Z85tSCoQ=%Pgyn^1nLiY2I*JcSCQ)>W{2X*gQpC|@QD44HO;t50&kh2E{Bwg_WM$K3 z>?1R~&1_1c6n2+wBSr+caC~`aJ&jsXUyE1Wz>bIhW35ndr2|DyNa#Vk z1WYR_G0|OcgMuqh?GM-<_4!=RQt~+-KmNPvV)%iki~H8!HOnmpzn#t;2&QY$ZzXzp zWkr(GWZj?AgbAfd(4$nmTF@M+R#@7GT;FI6=geUULT0a`+QuC6us9gi;+_N3Jf3dQ zD4nnV27V1(0Ot%Dq^l3y$=84$dqB-qRBQ*oDV!CFiKdXhGDbK@$BC?Nuuk&KC?XZO z($E;pWq$nlvGw3?isT$7Jo?Wtf;T0aApBR5cKh#*p^G%6N2BlR>KYe^CVv9|8ZAoz zcE_PjW0m4az@pa+jA*yxlan{;`8sQ@jgper(Lj1c zo=skB3#k`e2%?&G0gjK(_V$|B**Q46qv?-=5Ft}quAKO&p3G%*(x6l3=7d81zR&9$ zr6JaU|BtV>hu~ReG!S;v&Sk!k@9#cp5~z`ui|0zp4@ovIIT0K+6k>gSNgKj8WKBPA zZ(jnjj+Ab<+YdwrWRH6>t^oWXg2NwuvTvLQM)oEfP-Aj$Ii!kgM;>A**9xhfJ7I>k zSdoX?SQLutTl@LYjbPGi^{Q3H7B_`Ir&1TiaqW^5Ig5pp=H@Bs>FFgU9|4gxth}0c z52pOpFJJ^=7J}r{;a1i<-ENMm)R}MR&R-;MmMQRs#t=N1>>gBNCLDA1w-4Q$7U^j0 z-<9ZJ6*qr-#K`dr_u&QS=M~0!<}0eFUcUaaRCLf}Bl@xj`r>nfoRt|y=@DFiAb_m| zy6(`x$A?G42G3R;QHyt0L{}v5-;AkXR?*q>8v}T|9z8>aa-<9aFH-6L+Lg`$m56%^ zE-y@sxT<(!jo^ZH1%HRjC2RFj?{6_cdq66^E-$U_nryz z@@AnYqzhQJ%xRhYIVXcS2#yij8=IOuXS4HElo{10CML|Uvooqs4%Y9JYMrL{LT&PU zYTPudW_4y}W?L`72Y10+<>iOVFnRHKzeo{9%Ejp5@51TqSK5bq{|LJC=RRv+%N<&{ zZ^&RjSlP0qaeE-P4O(V+!52RZ784T}*Q;9}EK*%uBppHqA)Ew$L%CUgXn`EpToHgc zg`XcXC~x0ZB(;ET)&_U0x(8ou9;Q{lHWxL?-j`>#yQN z;W?^PkR)Jq6^IZrum6t)!=(NE=*4D`QqWhVTC&lF;b!J4o47+Uf-Sdh*@9I86JZ<@a?#*_Mvs|^OXSDWx z{`JUV{>v8;QBkIS-I!Zf?t0YNxVv3eNGNRY=gG;<-mfr74(>V-uL0GNM&(YD zBpGnfId9TSPhhJ5eZ#aGfg7EZG_v^FC;BtT>cbuPL{M`d#)_wL$NIq$i25ubb~=!mr#AE4U6^+y6}eez_ljZHnWI@E~JDeER?W=@Wc zJ&wr1s-GJF?^`p-()Z99v|o1i_EXlu&^8gBcCP`T&6a$hrmT>V5TK}_e=+H06fF-q z3WO}4co|(?Mk75nJT0`HS;QOwux`F(0VJV$t#5!`bV|?TG8o;|*VD@-h8HsjK1?rP zxw2ab0&Cr+R4TcoOD;z2_g0D@*kfiHp^Xw~tLDt_p3+T@&2MLpZA^$y^x7elQ{690 zEo5tI2`E1xhswV2qJx;27~mIgmwx>Cebp)U=eKMi7$bCdJ0I~1KTmXz$&#YXM z;81jWF~bn>cS;hg-ziK962_Dnm8Yo)YnQDFtTQtcQ@$4O5rmfRh`vSDe>>E^8q7Hm z>yk0mVq9vB0NT0s1G+?^sCcUXj=KO~9u5tn$#oxjDlxKk39ktD$vVCq+G|MnFEcmc zflljx9)mZ3kW~&J4M-{W)Z1%9CUzRoKXfdMAV?rIgu*5eqyd0a1h-^ zq4MlyIv!{_aisAcurzNJGEwm4&>KMJ5`FO^H$2t>VwrBek|ComSELCV9kc&P_pA7D z3htu0%lqI3cw@{SbCtzP-0Ob)vUmgd8dWh{nFPlBj7E8jiJCVsZ}}(wGwBI5pUKTj zj2~h;H+W9J^UICZ9`C+#GYm$j?cvpF_Sn~ho849FhGM7_S^&3`7W(~G{`>`ndQ2?jS zvEb_Kq8<;o!Dc)%*1e##R>7Ac^^q@}0FFw(N^%WF{n z!#aa#NpMPVQ?LPL3aJd>h=H?y0&9+%JQ^}kM|dXCSfGh2NB4tD9caJ_Ab_YW-Y+l& zEz(y?>}0zUkpJZO?7U&#D4CtlNK4a|1nOsG>lb1cb5~zC{}QU~=9b-2w7K`r>39F< zo9EJ@nF`)b?Pi$)knHkh$k{RS1*x6B8%V6*T7o?sD_5S!qd|R8ivkNVvF8yW?N;~& zG&P;y3y5R;IL#^rh1(u_JlMmFVYv+I1U>5Xf4uWQBL)gMDdT|Hy+nW;Hg>5ED<2s6m_0B$q+w&J}){r$*~ zFZvcf)6mcn^nWM@L~>;)HHR@x0|_|1M1DAYNAmaWZ)gbht+m?b%A$_Hr*LZGIo>5Y zN_*5!Xo!CFE%$l<_O1J`pG!DGgu4=9mDveC0j~j?C-Kj<`-y4qr%#=oEGDYFj1cT# z_d>zImD_NVCu94-2mT)0N5scKX-mnaI9$|6C}2~mr&&k^iXfnH=ssm~V~&`z9F2IS z(Mo-&+t6v{?1#q*PE78-p&%QN+q;Vsn1H-ktZL>sobc?%(KMbvnE2c8hO))HJGLC1 z))znaW)UTs^qGSl@J4xd&8mrqJ`j9eTNKAEy*kPkDDDC-ga|Xzf>yfYHn^kCxh!7p zT5-|#KQ$?BjcGCpzqw_P6lxVA~Ee zJL)TLBBFmcZI_@4O1qf3kfdd!{PN|?n>&s~?JDEKfj(S@t(6x~y7+>BM9-}r4j0p& z0lBx~J}ASgVB&;i&~jVlSVtB@=fOI^)IsD)QwH&gb`jU@=aTc6>xJ-nBbNCARG+fl*R3cy@jBQ)rI?gE`oSn_* zX)5?oBpcOVo2llb(P0BiOJ%s-fHG8n41OOiYJ&92l|`97TbuPy|E?71J~L@OIM<$6 z{tr~9@2&KX4zG!VllOzD+DykUW_ID20q*gYhdBf)Dkv80N5FDZ=l2<$IcjO#`REU$ zyKUs&cX~<|UxUgDs3MK%hi+afuH)9n(ZFY4!pL2h71_K=Vtitnb}8(`5QLJ`(uH}L z>OoClS*ZD|Lc1RLMB=IVzBu%oaY>b>)5cI*Ve*yJy=!`KG=IvYKxQTCg=(o?nXsxcYmZS?=wLXT@;BBp;VvL$>=gxqoV_SLPH8n<6^*KMp~ zik=D{8`3|97z9Lpj58kT{6jP#f1EH_LIwKjd3kx^%A=5|1Fbmftq|UQzaS@)iD)EM zFZ3uKV4{p|wk}{s*~Kl(g2$U}pyNLa62nZ69NFvIyetk1yhN=Zpsv1bt`jl67-WQN zf{-{HkKy6N*|n=dv+>orX%;f)8axbbkxon*3zQ9$CetxjAZo|(1Ez7O)=MX@dwgC# zczyJNg9pV;Sn9OaAVw9sT|fcL)_nBivm!8)V&Xh=z6_X^n%e@ z$Q%-Nb1ieH`7ik~SY2Lm&i+%*!%zBigV8Cvm!$j}SIWPx6mz>O9IHddW;S8f`?inW zK+gd;dTF5n8@bEYw;HXaYH`#~Jci*a{#(KmK)&US{i7%nDUXSQKN1Orod)H$=gQJv?M;G16d%3MVuMsQ|?rlR6w$+V`7M-NI@a90U}Ve=Z6Dq{Vh) zE!@al^$0u(nH9GSuk2@5Pw}3J!~8=>D|qao+8s68jV?watWlh@!l?Oh>v*J$m6eq6 zow0sh0H|D1Q8*)+2}G&&SRvpg{x4oj5{xOD>asT1a7YSa=;3ioOHLATD03TaS<{&q zDtucD8V@j8My=4S;IM<2S+P`n_AK>Mt_RLk&p?X*Y+~mjBFC|BVO4(&;5^{xqT}nC z>)R@C>+9z95D+=P>vCUF53PXBL-xX>hb=yiITIY&?49_Iv2p#9_;_PoUAiiX4NXAe z(TjrqNd5H;nrRqhJqI(7DjbETshO!u_ECM!l0S($j_7NhiokE;oXg(cqJ5#KyZhrn zwQR3SD8RJo(ROak?f06-GWz>3fl8OYTS!Rq<~SihFJPhse!oLx?h3nnKJ5l6WP|GW z$>?1nu<3(t>VqU;0?a6%M$`g`D#%KQCI$tuZKgAw>VX3XD!&ct^Yq3>F&bfUnEmkJ zA5($y@IR&kiuZXhM7#t_BRKcm3)Pqr3)p7l4mSj6A{>uF)@$yR9s_U$X#(y$^Njb7 z4nNEFlDWCLU_B!dSeKSSuvW9Ar=@kRKMM`}!nF$(yS#+5o3E8)NTaP6RK%#8VH;;G z;LiNfM-u~2ztb+_C=ru;nq?0V{$Ty~&}}p^5}|2#0vDkVO}M(a64xIdKK6V_PE6vM zK*n*mg@B$@_Zn8NuRChLH{rOOn^fi@gf+mQ|F@F>RiF7^iI)rH*<7N3-xXcVZ^EPj z#XaQUs@Kt8-A0yeTaK0Tj;C_@LJ!>YF`V1SkD_-0JXV*$5+pHr2{#dV(XoXx0_5+% zX*ACS@V)bM%ZU@--tS8^X!KKMMlkwNc%=o3NYwuBfG>YjD9D{fRi`Li*Pxff&+3u+ z=)TSdnD|~PA#k8Cw0ubC9tl9H;XCm7 zGP?%zx2Afa2;ld-Ui$m_VP>0OyVF1kXj%atW6u@}y29{_7j1tEOYRk9?rd$d$z>}H zVPw$t_%DnJ+IF0ozf?VrrUh2>&Z(1ukAeeiV4#PD+b=F*`p>=s4{Kg7yLNwnxq8SWlPWBEr7Yg??iW9*B*_|1#JYfiT6zXKIW+=S5w0B=(&IJ0-}6ToJ; zb?7z}^7otQIhh!D2LH+Ef{a1dgsu#Fy#moMb>Bc?E?98964`tq*dVF4IJ*7r{6LYp?H{ z5lvzH2*f0IP(`zxjCcybvoKU&|Gu*gnhe5e=e+(UiwRr`LJB7JKhyHH z?e`SS4vgLuDhH_~c@GBEuap!OAJ<((k$}DmbO97}V%it*C=y5bdQg&%U9kd#Nq`xp zmSw!ZmNZithbAW4V(&nkxF{~~&5;vfq!zxyK5NCbJj_)=4D9iPy>Wcx{^h)LKfZE| zVKTB4S+XU@q~pIiNNykD=Oe0H-K)%xBe_<+LB3*p zagnRbVs6G~+2i2FZSIhmU{A@A4$sDo`=sENe4;+j-0X=)Hj5vk+yZw&z42OWtI?ni`HgR7xQ0|(Z*YM1QPbK%zf z5R!&7@(zU>o_e@B`NiJ=F*tHXaO4@Y*q`!kiY$vw-B|1YJ*l7SB5Xu_aikr79y6d` zd-hyM>fcY2#1>sX@AsE*J8`Yz$EDP1ku{Z1Pv_;OD_B{*MDUk&eBp~$A3Dzwap-#o znwlKZba_m0v$8h4kin8EqBob@*sjE%R8b+*$8P;?&_KX%bY#RmZxQI8xfQWRojPQB z@9K~h#p^X_w%;boN**Hra5_-@c@{*9-q#oK7~u0hH+y{oI{*PWC+6yAnSeqJjY0b= zYtxiWjB!I5cdy6%y(UHM-M@Py6kEc__qR7fTSv!@0lR5=kH%ecMKs3}iqZOH3b-FQ zz~gD^x4Z+CrXf9Wh-6E-SG*_}WsrnVrEpK4P0%l(PYBL5 z7+v!#TH4xrz7lXizzz~;-$Z#~@h^MhuYV!-J(a)J3q~emj+*}q%L7-r|I6~gd`!vr z=)D70P$4p^6WAm6QFr%EB=p&<7`6M_Q948|(X0@y7-ZJ^_;FV9h|fb6DXHsAzsTJA zwq*uj613~fmOyo#uv9lFXt*=Cb@8t?E`NieZs`=`Kv|Y-+q9JJ9v3*~jlG zzKl4gq=RvT;_W#|7Uv_r2HucA0|iJ<*P7HSI~2a+l)Apyv$S7B${b)$wq~l46vQ zii!$9e~2a8_tb0GB*oS6EbZ*_@?NESN=>W0mAT=xz_x>^_sy6IngseNHQNCdJ`t&T3bQiz8JuC4Ym{lKS$c%8z8w9<|smI!MPw?ca zQ=7%b<5k3C9e9{P?|n75*+}LYhWfE){Co=xz{3Rk!RqQK!wcPHavO-gr&pb^mS@P6 z#()!S*3}PNoqKfZc%V_nu)&AGVEp0Q9HkpIn=m(OY1D!rhItTXb@)HR3R_6X3cB9J zL|D^-gw^~=eN}BcHoMA$;V$oK08Y_UIf>?aL^!6F&He7_8R3j(j3N)WF87M#>70f_ z0e=fFpl|oGLu3-YsS-JDck}SE;fV822FU=K{;2PPZCy|i^1RHZ{unTAtG-tKQ!G94 ziyA<6r!55ORa~ANZrD`=FcFT;&d~Y8m;n<2Vz)7A>bX&>i2k!n-0laz0rU&Wv=7fb zEOQDS7Lqti_vL%!BU@Lx*DFPTs;ZtZmfmr~xJ$nTT}#F%tfP38p(reT?z99?^bjVI z9mVv)8#HXR`8-e^&j@)RgoMOAffDeyc>MWWLFkSbc8m{*D!k974`|qCos6{I+ zFMqK7h^D)HIls0fD;+3_;+)fqk=mcM8|2{a)~B={TX{oH+BE6=njc=UCK?|Z&H}m9(a{I1#;l3$I zj0E!~L`Ac$Be%%QC(dd$pfCjsO3R0e6V+c_MO?W&wi8BY-r9Z2NUBFIa=|5j58Vnv zY^r0RCIBLYYq3o?R=1E6p}tzwV`D=rHPx$vvW5HloC?=a+_%+K9qm4+vc2S8Sa9$I z9HPe0efa2mt4<+M0Uez3D~jR>jRAR*WX0HPrMYk4XGATJ^%nVN*#$Yx`xgiRU`dDh z&maW|WD&=a1W#78$ibWe3np#?8U;k3zajSqW<$szHu}W4fFlWFkYS^-97@F)JyvBn zVptcqedg=ejdD%~U=+rte89(HJX*#2=Q0#VLd3I9&)-v1%Xw!G4h=ANC@;G|w|6gJ z_5i>Wlw%p`=~mg>pv<#9a>V@WR+B0mPJs_m;anP(5JbgQw70a>;M&Ri(OiU|0p>4$ zE`7E6ad~x`Fx;`=h=>UtfVNOsL4F|lF|fU%ArD#vWMO(*+7$U?X7Hm24<^wsBWnTH zMN|9~*6TT};i=CuW|uHm&4)zw5Q7Ouqy@$|oq}8fsHRz^aMlsPzb4vyU@i;gDkfsX z3!&AZn~QITE6Y6wu7ErVZ?@4(xGSW!*;nuBNFc(V2iZ}8Iuk4U~?;djN zt+XY?!emC(#s)|8L#gXW{@5`P6R68gGSMB6Y@is`X_fheub7LtbO{4*w<{_vF{K2R z`^Ro5D_{cJk(>n$#oH&6+qc(3*Bie+B+&LAE6lF=HiMt zD5}@AeL=iveZ5Ou!J!*}HQL!fJVWGd`-|kK*^<sf@vyeimc zZvzU9NP<_F`2Axp4>4TE>SWNp7r)vc_HcJ!wPp=A)KN)=86jwc4_mo<-F@3k{<-y? zD2wg3Wg|D9y>uGq>7cXg$m>)Lu=kW5v@&x11sJ#4-1Nr{DlQ>m;YV%xpju{+4O~1CLX0zdKbUDiCxs{c% zW=AV&7STVuU=!ZR6~Il1jbI}`;m|XLzQ)l371M0UU{DL!0*Ll71Hr5gga?NPMv?@* z1#F4CRs|`3XbiyNjfy8!oz2)>G!r1k0XhPz3g9wcuHi3^wqN0x_=kie9nSf_nybCm z)^`F0LsEMIo~*AA2m37o%}&_5V9p*%s_2*`J{9McH?5tIPp|6CvWAfWkjAaBNP`nQ zXk`FE07IcbeVvuXi|PLHwyjuzfZnlU*bJ>63s-WvW`wi$e2G!U66W2z49WqcPb|@&khOz_>7kFK)3L4d+r$ee^f!+ z(V`$hAW70MUxteU)&s%met&=JZ~uM>Vd&PI*cTi!?yUSX)#0)U8l7o>PYkZ#0mO|Q zxCzn*q<0~q{L0FnsX$=06CXYlUs6ZIWC_#pac|?-#UtSqRc^FiCxC;2zJN#XbDU|O zT)I|1ScIS~16<-WKVbpS6cpg79PpR5F0E6mUA^2AHdbFDhbC)e0l&a=pHG9A5#T^A zrrgjlY*h9t@{`J^a*BeQfmnioBS9et=n}aG9oA?3E1=4lyVF?PP_)_^t?l=nrdmPWU9!EstN|I6L)DIDkIlc09mfqUQX zg$|Lx2_^rXpF*0%-+l`6+(9~m!~_?MI^*NwfX3k>;&DJnXq=BQBKUjMpV-3TOIb&d z8A{BH^?|u*Ij}`RErfE+)JFMB8MZHN+SK&o1=l84FH?93!3@Png}S^*TH~w?E56v- zVGknm^E=DjdT014Y&R33DAc{kt08r3_JM7f^dTRf2K`*5k!uq@g&~+si13+w9fQXL zg<_(`%UJYrlOqoAv127k|A)LckH>m#--WdrNGW7Wl2E2fWL89(GvCIPStueIlA#O@ zip)cy%tNAtGB=Pi6Uto5m?2|^u#c~`_OqVn`R)DN``!B;_UH57e>~4xE8X|)dtKLg zo#$~L$8jdg>;#aI{_7dpWqRQ&fxH>S$H2`Auc=V_vJ=-CK>>E&$oHG$c%j?Yg4`45 zH#Ab(-ri2URma8&3F80%<@LXz=0Cm!5%hp9*5^O5Pxw$ z^QV9Dc_6b81gQ%>6^ArjoBg0ikhFGRTRl!lD};#3_}^ZSd}mtD{OdaqKk;P`p^f{u z*Z;=zBi`x%O*e%9O(pz))3!lS!*wIs@o%7n*S&co+nxU}Pp46tJw%c4RG63k!;h1U znv0r(FkJZO*AqYEuj`IG{hR9s@e|j!HEZL&|NV8%`@gwh{~sGo{6Fz%|JSWgh-dbH zq`$=buq?lrgvWW`I&}nJ_P2Apg$RC zjr{o02@N}5peG|55C6J{f)UuEG2HI=@86F*6fcZy>FFsWK(5ES==F{QrbLB_i6XKS z;1Dk%%Y~RNfK?O!5%HhX^L|VWF+n`28!aZDnmsa;9GU45@qt+X{>8;Yw776ZfUv{G zBZId@{qV$u2f5-YKm&CR_URoM6oY#Rm704^jI-B4~pPJQ^}Z+HiRLz3jZYgG zK-E@^bQmvX-fiKk2f6Y<5Jw^lO_!pY8fGjxIXVubedn%njq}n;AWZ*V=Y~^oK|n|K z0lpoEt;=q#TxSeT3^+><(D#F(1vuNIqg@!HJFu}3wDsk9X>V3W#$QlipiaP&fZqo% zVy!EmHb43UmJQ&_;KT5&)93qCkGvJ+4yvN?rP!>+GvP7meDM(dJw|#7^)X|X%jK)l;YD5BhH=diCdFuQvY^85x1(E`0?5#_ zf`Z7r;*=Citi;mnkEr0_SDFt|j(Gp-cI|hO2aV|0_&^dRM``7cX$H64*!K z?dj=hkOa+aY_6cj+*tEuEB+#Q+X@smpdzy`oK#SN4Sx$p9kNlwQaT@cvAQ}{Hfq@W zgOYnYr=uC4w&q57Pk7Z9D@(~Vmh?fd-r~Y%@$yg zmdZ|S%?J%wkpvBb;wJl^Q0!~4{OkiA1>b<(j|71)y2=3lTKbEQvoXOxyd2~FuIgsq z^8)079+`ua(~feh0%$zI8UW^hg`X~5byB1~Lz_$X){`e=Xy1W?h$$hN5UB%`xfpSs z-A;ZzHlR;0u>rfn-OJ{SM56+#?gS{y1{$;27TUD>4F<4D&K5La?`y1s<#_^1BzU*^ zQKKY>%mxNstTl;iIu{z^CW(in7W3k7I*Vqfr48b-V0B@}aCf)l9QNWxJpcJ?`w%K& z;fMa#6g^M}NjzyNZzWFP9f1Xb%pgPzAZ!tEOtgQo z=Aj7q*uEbF?srS-mb^j1rk7lRrf=UBtlui8-^eCtyq4amVsC$_^+z9AKrA0HE%Z+h zg7|Tio`UC@7#XWBc1L4I;tCw%P{awUke-@rfK-EWC?gBrBsis~_4VJEVyNJ6m=Z#l z%Wyy=*}6M2BxDi}szpUbTHc*R(=bZ?f8_X}p3iXmWFq`A3=IsR#DPrrFc;U&o_P4# zF)&zx=s`^Zie?PdrRE8bj@pVR;H;)Cvcf3i8(^84xt5j|00t=6@RU(DOzX2-^KVSD zEaWiNKYjX+>zldR+5Y9l1S5>8BiCV<*kt36a@2YBb5nEkB~Xm<3{!V0!EF}D9J+h8 zxH_y8Cl{AWo$74U1U{i9=N`)Lqjko7#c;QAcfDw#Lt7uwENKeO@B2}P9wTXy!eDOq$gi9}L%P(wpopkqb{8i0j zV$!uIZ$b%2=m{_vfABki?QGye#I1}fA-`ZuavxAY1qIcdndNDqco}C-i9y*xD=-yz zz#io*xC)S1iFqyxDdeKh#k_MTjV!pdZ@SLv>dN2Sao)nB!sGrcG)NQilaZ3IW4dVqkngUAcn*F_geG(Z7$JFBLGTKqwnJ+^WXtk6!@YBM;3tPuU3WS(}`Y6{NB)F zI(|=G9K!TCurVwyUfcu4=Zejre1f4>A3zEpCq#YU^*vTiO-cDcyQ`)(S!suygp#%4 zKQ_p&@9a$CEY@NAb%$pr%%Mn82$S3{PsoK#cW)+#FJ;TH-=+kjq1(4J0|DZ`*7 zrEAv{eAfG@1Wu4|T0HikQ~F&^9P>jnw*fBAx(7f$RsCTPRvM%lug407u)T#g4Wm1V zxqjGu0;e~Iyf6nX(-4cE!2+0;urIB;dT5VFZz9lUp3Er4m7Pu%%1 z`EwHZMT_DY;F|s0XfUSG#@&$c{O0wdz$q5NAj^(+KE#g2vp=V&wM#TKSo32Wk=<#O z0__~D4!HoKhaX|sg$uHB%f_)c7xTgwA3O-bZugb*U6Aa(`cb3CXC z5qd^^tR*8X*#g%QknDdkq?j?n*gLq5%e8PBi8{-8%JE z^bMQrAEG@Cj1#{Ga=%O_Cgy4`Gu|w+H*B3ZqQM4Qiv+xbz|U1itfQgBx3z^P>fyr% zmBKX?og9$naUKGvD(Q*n*VzomA{Lg~A`Mvm@bd6{?GccWxG&zWi*-eowEwCOVN?Dq z23KKlcx`X*LjwUPr|AH-1a>+~SP&#jX=v2Z=qOrQ?f=n2vhKKG`zisZ48Hks_p{U^kO4L1+Q1B;KcbP#Utj%;)T;dS9s<38-bGB~gzNXI-E{;>R003!#1O|Dsg zD)EzHisEgl+r+%8^f{s!nZoegXU{_VW8PpxQ|twNg#=fl#7Kh{%L-sl({2h^D9Z<^ zM)p!uP_W+8Q~oWl0xu%KoX8WRZ8d8j7lZJ|delv0q>}3%`b3a4$ll|<7bL@cNJJ!3 zLc4`JEi|zoEx>5i$6X;?PmbL30@%7&@UmSwY#E-f0PWIvYNWx++W8%M>gK(G=Hf6Z z0}?AQxIJO7!qmgETx9?=hbcC1*`ocE8&ohj!~`C`75pmj*L3AXYwCgd()9ETq}9rV z$OpQ!QhFN-GhTYWtE$pI=5;GilHU5L(aT+be+{+kj7Lb9x_LsVMzVQuPEL*@C#pY1!t8FcYy4TP zleuURnNZnbCaue4HY@C2AU6{mP|Ynbmp@5v$Ob6x_RYf+8th}-d z%H;iYl$QMcNY4CVE${%gGn!h=I;@)h?>%LCP?Hi~9$bgbEPtRYB=HWM@2ai=Rv?Eng7GO0v7^dT(QDG@b#+< z#T9GmUuocs2{8r&W7G86f3Us8fJG*gvF^*vFxj zf^HfH$LTbup-*Q?2rz!2TFN~a57s^_s~Sbjv8x3r3A!S}4Xa_{f0A7jhj&=OPaGjg zUP)N<8B$;G`JdMfQ5-G8%$dF+jJb3UhoN7Mi~N#4G!gkgaCI~^s2Kk0dlK6>4*{|g^O=ya`LO15kPc|E_NuFnWza}L5k}a4E8b4 zS(syts1Ff@LD#dEHepE3Qy9>L#MH69u7zZ_Q6V7$*hj&^)QcYuSZ@S`fRG1^H+Uuj z6uZ5hqy*i~Zl`=`#C-bTZL2Fw7v0^9 z*yV^>+<)Fvsu%%uuuY5|NuWjGFO;nYZ8Q5Y?ocba5n0i7#a+f+m>yQ>KGq>TKqk$S zzR*NqX=?^eEtn&xV`SukzhkSo+5V5~*JfXUs(rvUn%hw}A=q8|LUlNg;5JYGn`l(J z$ERY5=lk3{UET|qdbx2opckCoIO-fgOgwe5M88n?sj8r+lL;m>63|M{QNDu%e4zj+ zwG9d{dzS$eShLum`1LOq8@w62Nzr)rs2qkZ4dS0c#Sn3}49xtl{y);s96x>>)zg*V zx*H=lQ&6~p42S|mVUKdri$i-Wppu`pU8ku%Gd(k7k=>T5bBE&@C{RwqTwDrpec0$` z6UH9G&CZ?(o|V=e=>9M$H5?NyAYkfp-qii}uMI!oF-iMMrk&XE;tllZVv&9yr?r4j z=sC>Q3zA`AV3?Ug`a{RVOu%8g2)y4q9a4`Ydf-2uJh{PX&1>T^gk(reHIpllPsyD; z>CpSl6L3~m{4qcZQTM08Il%Bt_--D(BB&rpSePKR;rLAe9mwTm#ViLWHunULm-gKf z1}uJu7`HF~Sh+DcM_qgsZfP8Kr?M4*}IRb)phDx>!#5q;H>Hapsk#ZgGP9Ila>sgei|`)_qvQP9VYmp zv3dO9E+!^q53-hW*r{;rxMjF)%a$LQV~>5!xesI_3`hYlk3P2{F_8X0xOD)< zL9P(m|0@|W9+YR8&zoG*H|hH`F^CxPP@?+s=mPIH<@?h{Xmq;*MF6z;0?BHAzOax` zmT~zCKpBGD32CwAc`OB3(QIS1TG6P3XpJsi5fELbxkM8Cv$xXu_P=LQ?rQ{tvR<^e$9t z^&z>+5xo0XIjAY3$11*;!$CIV447?1?7*y%foYx)MG}~sEG!3X>T>~-R8LhUH0@Tf zSbc!D@l&q}qz8v)HQ_A`*n0t9EeDW~V`)GyMtz*CcSHWg0#P9abvx59%X9DzDbX@A zDm+X=lK!z17b3v;7f7q6!N5bLr?)+vyGzpL!1EBMojVU2i zj=7XbrK5KZ({$rb&-RhHrUiAvjWVxk7=8R=Ryxy^^YZ09Vl!eHroZsHRwEY>DBnhm z(Q!?9QtjF=yo?)~H#~kL zand`9lg_=7f46UX?`|8^KIqJ}D5%FDH9f3`YNk`GPN&QFfEwx+gV(# zNxz68sf9LkNKjT8-jhfqg8XfZ&P?=pWJL==7v#7*`8X7+9)YfW*!5X%E{acamr?z~ z_02fmwGXAGB_&V4Ththm@r4wxu((c#m)>*!eXK$)_|qL&Pr`*0&YTlvOWBAX&E<<_B`U#SU?CE@4xu_}Fm1PWL zK=RNGq8?@Bwhpz)AQ?!9K?%a0CLkn~%z7U7xClmr2t!b0RA=N9dU=oxL3%c~KUu{V zr-^}$$l^vWxVyP27Hw_&J;cbuaw-ZWb?(`7dX4&m1xf~Bm;PyI;z$3QF0JS3*37Ei z1g2*k5X(R7vK4vc4^|y7$8-Vij30%42u$gY>nitLCrZ0+$)R(FY-$l>&(Z#w*$kcY zqm~(znW-OL!SD@9{F8i~O1qw{t`(}5flN3@Riz{99^-pfJ&^i8Y5TEbVyvRBzTO@j zIn1dSy$J7$T~&wBQs?x;ytaH?JoGuKSxort%l9w(`CCc5w(hUm{I#Url=6eyQD3!K4wE`W-F9Pb>?Z7}FJNCHZht65} z1*5(PBqM6ua!cGjkThd}nHreWJdn^Fp#@@7>8ZGIBr|oW9DxP^6-Q+Hg+Pq8!$pff zIfz^apAT`_v`$fJ=`!v$1E*R{=_r8^1#%)3rK+x$oq-1GWr7zyV?t+H-fq6J1yuF)9B^1{UxM?i6i(er#HXK^tsHySgf5L#@A5|yuI^uV&A!jF;t_}#Pi5Nx!=>LtC+79y5c(%2tm|-~%RrqJP}xpJ z6%ii2s15g!yOQd&tRbX6j!ncf4~gEmg#nuSKo;@P_K(JMG`=UO?g_W%u#9|bmr3#B$3LgUaB!Ap0U zAU&>JR6(us3&6MYRnvmvvF!q##DFWWYpwvBoUV%wKQ3dm2 zi7_om@8SN4?rlQ6D=g1{f=AVLBGcM!22CcWGm&Tt%F6m^-C582p?iNyk>j@;P;KG< zR2N>}?(A==u_c2jBHfa|ENJ!LlBwSEMM5b8&7`f$wpX$VR+R0MYpkN;>7zJEv~{Nq$L{19TQBP#gxulX_s9K%w-i(Z*r<8m05hCmAzG5EIEDX z&aWUDcqSx2hk`cJvx>5t?FRb%pqzD)H>k;VG`UCwrbo?i|>)jDXBIvKP0*;C8YIv;a$?L zB$%`|HvU8}FqF39-8-$oUQkvd(^duVOL-E*zp8f&vF`TGYe8dGU#1zs4qP%VF2&aG zLwX3|@Fy$ELJycP=fIb^E;}t=TXy>Pb2{17#A+QgVBgBl`BQFkI;A@3-&PBj?`n2A z+G#;_sDstkT2N(_c2B&%X!iUi^w^JLaA` zPS#`6d$_C!kxN)|M#r%#&(5HZ*Pub7)X zosvwJ{g^aYneY{z*POwC%gb;seu{^E$%zS*-R$3qr%%0k*VW|#m)w?1n1M8Zy6qGI zDD&)r!NHm{_Ht`YUdq`yl|RVNRMy;*sWrIB^WStSA$h#4_wo57vtb44Q1U?PW`znF zj|#RR$7=v)TwFwsQ8~ydY{e<~?|G99dRDLvn503e8H#gRDo(Rw2glNjX&j`O+Zg=C zl`lxYTi}+LhkT5<(|*@Qtia*ob4qcN_b`2`{s8i6xyaJXXXSd8(ZxG7-M|Dh$+-CO z-u>TfLggTf1)E^=Ucl?Ch!+kHPch<&=G(-C@wmp$M>ZrUSwJK)g$RRZM-CxA)}A?R zrm-)r#q}k|M4Wh$hbxyS8WZTQ4=xCq-dys3m-{CziT7O?^+#kNuKfZ?QH9h&Va_re-Zp_G=vl;#T6}m@dkl z(O<}ZOlOBBPEr2=aq0tDw;i5zGYyN2JCk$v81G}OzmhUOZ{Yj)3Xd?25sDLCYZmx4 z@_@zbBJSU>?vP!zHM@ARVQ~n>Yi9b6x47z}9|Kk}JM(}QrNfaUP@W79atVv7im|go z4S_-73Aksc#_E}cK&nt6q=j4Ak`6%}>nC%>g(b$fs*7Y3hqBI?j-_u87bz#+Biuw8-KB;f|uuc?CogWL08C zu?`><>0x#YU`xVvCpFdtUZ*vL#sntn%9dO$jg7&DyrHJCCB*s4WKa6I&H+bwS1AiE zZK8?&-}Way3)gg`5mkXcZQhH<<3H?9-pQAvB?)K*Qm`Ge_&&@uG<$2#Pd-{mE>I#u zWs<$9*t=xXI$~Ag@2=fm2}cH1UXz{uFgaD3@JvQYhNXcXx#RfAh;q&*a&p(P4#+Oj zvREKxdDOx@a+H<-0rI4Kk@V#1e(4#kzW9 zpqHOp6`OnC-bsUZq~5?(>?$OTE9fN;6Vuqh9j7Q&uHztvt{{0plN~NU#z>|xFEwji zTM*AJ>gLTV+(JVKk#WvWPA2F<3yrbLcLM{#@u@#?MqEIB!}%}T&Kc+?VFcT;<^$)u zcAtH^U&2%^wrq=3DQ zx}xGEDQH;5^Kp^_VG-fO0j^YD)N7=)6~CSgk<939qcy}+X?HANOg)^6-t6K>Gh%EytMM#jX~q2qw8QvTf|~WnwK%;Vtt8o&*j_G-q{HSHU=D(6-QWIDww)r4J9XJ4Pf%A9ow;LfaC3Fmt zStO^Exu;qy?n|GhLF1|W`MGu@=D&|S!Z9_V<+n$yH?niK{zLZRF zW@}3T6kgL7343%2!;txYC z#}_|%rYQV{?K(J|^};0td2-ECtcg0Nz)7btU2^;SvJX zkbHL{#x_1)eh?M))aZ(}+W9Q&|9V36d_2~%P^cTT+-C@%f3s{Pz{d6p6&5a}1@E}X zND*0M>0eA>+?eT?$KiAG?VdDdx!jbv8q}gj0Yye~RI8-Q0a4cX53yai`2dNZUp z4WsfWC<@&s6GtANJQXW8346wr;?BW;Si!V77r?Y_)PQH{7U8$$dROdaaq+ZHq7Pwh z2%6$Y*KXipIOd>(+Q6@AuLbNoGBf0nj-mh2L#0J!D_G$|`feShKCKfGc*KmP}>7<6e9BX_{l zMMnLyqBPC76QUqTZl_svps*upxT|J1<(U0%%SjHd%luDpX z6B^^TZU*a(WgQlUm^KBnrq1|yiH4{CCi*abqTBD0H}1hBjOEMsaI{v_=!-hgK#xKl z9j^(5FmiJ8BUP6hK781T`Qp)V&nu|7xTXp}AqYG6a~alIp{# zD1~2??0ygrDtG$}H;bKL5eyDN;|2%ovs&%-99(>dTnkB$0hfe%Mj`fVhQ)oD5~3oV zI>;3+erXojG43}hbJU|L9{#c^&i&Q&MZOn7tX}pornS;jF(_-PKy{oB&JH z<&79nQ2AR?>BQx09>9~Az;cHQ%^K+^Lh$!-hlZj=t4bxR+g^zG2oj)=f+a6ll`@OW z9qg-Wy@XdBteqBx$gzhNxs91Xi2~Tl=}NSO#jU#+v|IqH*#cAxepDgZ{*Vuy6$#jk zPxe(>Sy|1z1Fw)^*Y8>HGhqA~qo@Y^`!#DoX-dLlrlgG6PBe@EbNiTvE`rDbo=SS6 z*Qzl5KiB)NN|T+2FD?2yoA(mAY0yHK(BLi74R=wWg&P}GOib9OFCwh}!surj`fZFS zDQw!ZcEVQ{k59-{t_UwSvNaOQG`@8g(uIscv)rxR8+lVB zcT{`4yB{3PCVcF2%+{)5yt#kFz8=S;dUu0@q^?YH^8Mv2 z18T*a-{;Y#xFLK;dtcfDqXcP4dXMlQHgLjd=pD$7z!@CmE%+kEu8A+7Z~5JiUAkMD4{f+=9-T57>8m?9OnL{NI%qy#^D}2F~0W?x+ZHc7RS#WwF zo)x35s;c@}1BXjx=Gg6dTbAAKzqwBn;Xh)hgqD;^cIL4~G;p@F9>t8q1=K~g3FMV2 zX=zZ=@->Gsh2N|aF*xMTDv%hv^AL5UbA->@Vw_a@doenELj@g<>Olr}@cB1pZCrU6 zwp9CDA_rq?%_&{ldZACBQK~G|&f%?yNdT3|Hj~)Ky{W%w*{EM_kljvA;YYiekQ~gy zcD<4I3pLveE5*Twp-iT)oaf#j zA1D;n`A|;7r5a%+AUtBcx)}AE4_(Q^nCru}XYxJ!8h`a%Rd>(&ohZA)kntc}2;J++ z>+s^jK=(|ux=YM~@@3(jc+_=KQE88ON+wRmGm$VswPuk#1_hf+JJ@&eLdN>cokJ!Hb9!@IM8E%yU^iw&fW0YR+r;r72_EcSNHs|}VB3s87 zmtmAxM`e%+@j7d8Berz=m+@+Y-oZHMrjabiO5`We%nTsV z5}qM5E%a78uDk048o)6_a(xcv9?p%ZQ`9Apv_bl;s3OJ;GDs$oO>QP@4`n4A{Q@X3 zVvntEmVSc8WBg9a=S4RAd>I@hBBf*+)b8R!Lt&!1y-Gd)g- z`{v!iH#XF}*JC-Scxal69KG8Yr5*SzN*`((8q>094}UiZ(@>in@judAhFoy>t|gwJ zJ-1OWK62o@BHM{Xww6)q()U{>4g6b{e1X(1tBrR_|&>!%j)h}#&N(x^> zgOpTDhvYfz-F`^ptTLn3(!x?pvNe-#G+jIDG8+BnXCzo_ux!S_#^_c48`|kB*LiQV zm!4h4UVioJ__NR0xwS&SFs#>c!25|VU(fLyEcF3Nge-}k!M-gkM!zs8X97>^ZlosD zcZ1N?SB-Ft{=s{F{qI5PRhkWZaX`SiBAk?K8Ih+I%sji{?{B$nyYoFS203DMCg5}2 zB|6i^k3Rj_v111o6pe;ZOC>S?B7v9~kBmkfB!d=Fe}Rl~)1BGJBRIAyC~{j&G}IKG zciOl2+{F5qyPT?jT{(9qPr}kj)9AB3+Qg|MpN21M@qs1#%=%teymp_qveAwWui93y(g9T;x=zV=V$Z|PoeaSw{CCK`J@0}ymS*Z^4^6!8>Akp93n+&caa2f5- zU1+*f*}s8AKmN_-U~mDD_EY*aq8Aw+PUnBn3Qk2<8MC);QQVnw6Lj)F78>StI1=2} zPjj|+==t`y%|VQKq!MMwzI;MGIPJUw*Tzj}j$s1?E}v3Y=hw*$*FTLDLuXG!^@W%PE(7^nkdwM}z*d^Wc7XuFlUB zez-NP7`<_)-Ta7Etwyeb!%=5x4S&t#Pd`#5i)z#IQ9`R8n1f%JRr|5;8+2I?A{S0* zwH?Idy|T}M<5E}%qwxp4sYl<}Eg_GOh_(HC83i1!bMRtn1bJkn8UolTfS3szo~lfG zm~yj=AP7b?u(HDN&lHW)X9alNF}=oOcSZzwFaqRIxy>Ma#h<5Nq%_y+ek&NO2Dc^! zMT-yX9!5ET8c>$4&n9>HHIOwityXC5T>UaJ+D$Xp;sXxju5P3I{t}#=6{HxJ8lFj> zha73xW%4!nEp=nV(=9%PR#*AeaY(IWlVlg5xVDH4kM}n*7h74Gr(h1tK5O_EJb%)dT3R)+^ zcc);~8Fvwh6#h9caTWagnw{`2J=TpdRn?_zE9YN}oqf*0}yI zlvxbyjD~>E++1(goiItS?3fyC$l=^Q2)@9S6!>g)9#^nCP^lr)hen=>4gf^_OEVHK zK_oJXC98WpXF^K6?u4e4EspTnyv3J1cPKbAvJEYdXRluLdOd#Hf#8(UQNFrz`igfK zA%jYOQQ6tKgo9uGqVCd$5p4KAL23xz270G)vGOi(DJv>+YbN@!QNU7Z4kbsO>qQJB z^%4anJRaV^&%2*|X?{MsdNa%{KqW3`qk#82_CmEQ<#_c-Qom@g zM^dXT7V2W=D_mH~C4?&Aeunau;0Ig}c|(g|ogv1e!m*N%lx|{``WA2owuaKf;V5G- zo6O_@1!@1Lm+(`x8Pn{~{hhdtOG|WrKUAUprY6Jm*;5?J0XHqhqKXulf`Sh>V7IjP ziqPMPUEcP^zJaHAaJM&ci^vH~%2N9wvNPE!*6KFd=A)E zRsYyXc`Hh36B4OHdNQBzP1LE4?zkag%1#VL#GFlp7#iQT7XHQJXxG&G)QWK6WcISho<4n46WF;z_rXA>^NK? z1$vw6we|EfGk-P;0HZ=Wc3N7^@c%ma#A;t!t1XPE=6Y9GK1CXL0GO}161_o2?DA0X z!W(1`#2i-{Q9Nr)D<1}IF@c6uki$@|;;MQNu`sTh&wb+20Cwy<>8t(} z{49n#8z@RFhJ(Jsl@Vy{iN%jN14z-4aiGGLJMvnQPyRts+&-?CfNj7og0ku;#(Lmh z(9Jp9{UvN_ZVu`nO#lh-=@)bR`DO2k8_~v_#zEMk6UEf*N3Z=%i5|~QRv5B|^&8%V z{xj0`ZS5@>l4eD}7@U}ph9_~-c}Cbusk6xZ=qW7@*nHZSym6&BznERUX2EteYc7XTl3U0!lJe#mL5?>GFM9xi56ZT6GW8jN!T_NTP zLML#0Pm1p2IzdyzCrJ-OtwDHy>6Y{~rB;1~GEG}_|32j7kvCsMmwIp{;;)Sya*W7@ zOaqQd@za;v@k*0*43mw|#m;*6gfKo)W6=wz<=-HK>0xqs3^QpsD+synr~%yFSD^h9 z8BZ!kCWJ7N2kInZ;*i@cc5|=$kApJQ;ID@DcNb97JR}SD3}M=Ed^a`$$?Lfq!W`7| z)rboy+z<~5DI@qL^4^|#gwzFjj0VWWwS@;R?Nf=w+=&^aizFKo;ko+d3o*zjLqDzO z%2grwyZP_2MoLEC#?$W;ZF)JG5Y59Rl9WrNFLW-gk*39HsNIghxX&(93~;#Wb6Uda z*BX?#O`<5lDD2NBCw#XgLqnNUw#W;^_f5hGfvR6Cnvfy^86J?FCQ8*# zaFQFoK04+Bs{@8l=Eh$161KufJB5)wClN`poKxq}>>{p&+uffF>>kMNDhk6HMBt|5 z)_8=Ff3b8{7Y<+Od#FV4qVbIvaP|xc$7%P0GjbBgn-k_o_$~%&3zERVpq7=PMv;$- zZxJ`gp|d4~2Y=szAu47ejB)n~EyL|A0Fi)@&}D4i0TqlGhAdYEWH}!;yy0I%;gMH8 z0H*+aqRNd;;GJWOX3ThA*Up%~&U=sjSvR7UwGgwhaqq>lg#m0$q>jXpcu=Ha!nIMx z4cw*H>SDQqr12&wKFrZ`2bco{72Wc0Xm6E+$_+g*yasOd=HuJaS$)^1`yL94B8ZER z9zBBf6ypD#VvgPr*iLOECtq4zykE4Pww_?=T^`avQ(juS9E+7{r ziSx6m_!|KAHMJfXDwH2c(v%X7kbBwPHk+|4ED=k0?HU=+R#+~Z+2n-p*{gH(z*~dS z%YI)eHYbfvUddRp(_UED$V&b*_7$@H-40D7Gme#D2Km9@AGk5vm*}-K2c|-X4Tc;s z+xX;3Ttp~R#ZYP-TpF5V+4E2$E*p9gA2wKCT}9soXAV-qWynjo%Z9#wh2?H=ZTn4K zHeC9}ABSe$j~GX-V_PDI%mBkic8$6kvf1d!NQTAL2!u^pf66&)f}@6NXNR|_PMr1} z1#RisUS#gL6@a@>;1pp}9j~qz>;RDp)O6Br_==krZ%5FxbstkGIRH!}cIp~ZI zxG1omV5hZO3*m$!NM44z5dUyN^B9f-uXgI)vpM)}m(bZB{n#GMCndFl`;O2=;KyOp zkZ))Q@*nziU}|w5TuhaSQ+ole8fr9RD5#XwS?Ude^4jSd3E0@MJb8-Yvtzc z0^hv4FqJanj#GdHnn<}BcuDU+h7B+O`37Xa`QOohttQ?;m=lIkUxa|{uHrVSjfxR- zG{ZS%Y2N+UkG7M23vjR`zAZEA*MEMACOf{#P=xmwW&H zJx-cY|ML%gxj~$xe|mLM6T9{A*R@?JqyGL^GBSq~#BcCVFZ)~n_kW4twC9p!ulkWE zyy@-jZ7==%<8t>A3vh_+)oP=I;vc~=@=1;^jQ{xKYZq?AJnH4PfB&uj|MTSjk66C{ z@Fk`$W9Poyj0!R&B%!1Pb zYT10>9V8&LW1V^)_v7R3HSZwRdn|maxOQq8r5$tNyTlt8dWHGGm&euL-yc}E%OF=M z_CVj$&qqekcSf#IiW%h4Fu1wRBcJ>>I5=3blCGBau^S~eSU}*?;L3M(aW&ySc(Cqc zSdO;?bsrVN?a7i2&-VNR_H$J!r{wBC_5>9V7UV1bs6tb0IneJ zJF^&+7zmr?;4Hz&<1rfrq~6HzpnI`0e8Wfc@w$ z{)PJ&;*?rCNi;NZBY@L64^qc)C2Bq*P$R3wbjp#r>Tp!Dt5Y@nxRl{$o@w}r1caQJ zPXJ=%Dw1RPQ$n?f6vkt&{Tu=;&6ZKLHsBn9{D@CCE1LIU(PPlc;=v`u-!ObqaQylo zDasK6K|#6#5o4&Kko_%Z-(O@Sduw zG(6f7-SZP}SMdRm@HpYwW4qoXm6bXTwGF6l+AJtlbO;UXHiGd#P9Z4P55JnqgS zuls%T-yYn#t8T@}%epRh*GQY=?^j!ZIn1SylL@1aIAEA(4FNuKWFha*XwDL2(9xF* zpyM$+te^(FUu+v>m=@;hsIozv-IwEnJwX_l&W=Rr16YtG9tAM0ia+p((P9Ngjd39| z*4F846v!y)RG@pm01gH6?ZXeBCAZq56C(yzI{I6Hm;{}2P-4L_Difw-L~E}{RE8S+ z+!uJn0&?JOJ;Fa?acLp#MAK?|a#CPbrhK|y63GjZ=VH$KKshpp-@pmg)zm~f2!8Y3 zwip}%Ad>{a7CTbF@KtXwJPzuKgb4Y56W|oOrB^X0y=1qLi(W$GkjybARN%sLXJA$LpIqIQ+z#1+J_T zFcp$|>}-OL9~fAaf+&Nq5XGy*>r?@B9O=S0ltu+FLPJ6{G5!7ZfbTUPi0M!YA0nj( zW0oJTckJ<=r=}+W{G$X$K80kVmo@N>JdP`Rl*w!qIQTj*tcu?eLlcO{?|3vFXBw3y zjW>UbwGi|p;s6y!4!#l2pnnB}3u|P9c+A4gs<5Ae)wn?>i3b@zh!WUwk6TacS<~_6 z_7-+}DOjzKec64NSAZvV7G7H~@VlU%{r&ak9!wa)dyW=TeqQl(MxY@+Y{OpcOjHAa zFD{{wtC+re>Qt@w>XPxUA2;8oyZK$N^$)!?SC;HUKg!G*8$MPS>8k(a-r15k!J|h# zFj9^vaDajdRlqzHrV3+d0B_wXc#_2`7AR!Oa-Qqz!G6kbVeS3_3S@c|&MM-TU;O7c zkX_{f)LM;n*>YguHsFGQ^P0B_00{>6zDg&BnCq|^;0D8iNSCvUz{J_u80Y{F4ydPeyaJyOA(2Ot&6XsY+*Fz}v0BOO#`2@ym z&Tl&}bl-dVhcVE>XDJCdoEcZCg9*A%#X29r#lI03n}0YuIs!#TEs3xT)~a6V8U2F- z0)(?w(A~RqNsvw%b}x=GUc_#vqM+c`POSyD^1VF;yB0+MT2w;vNpRqs2DsN^$9PEY z37HpSIM+iDb_!WcH%6umMr*QkWmOeoTgThC-%yKcW_+r@KsS>6v9Pm8!Ae}M%U=FT zbe^SIJoLQ;B&U zD2g{d*|ocW0l1jz*e5tpC6_#GrZqt+>lkw8c|EAt$P9p)$mhrt{KBMu%+xa1AOPF2 z6=qu6OFzHJ`2L|x>w6N54wr*4N@$ldawotg#My@TBL)zMErjC2tB>G|Vxzz{5%U}W z`7)3HA$+Z=rakm1Y-%yaX^8opF4rd9^F-5j78_vz*$w3js5eX4C~(IYWZV350vG^? z90U{8A{Hy>L6t;@DEUPZP(*{3PY*Cd#LlMZOsm2(fQE-QEno))GU&f_NMNHt_7g8i zL0$|b0Ff0px)9hfK!AEp#wDB;im)y4xIS46A&n58orTkzjM42W#M9Q{%e*2~gSiT1 zV6x={Q}kgAKX|&$IyGM{4V&yCx_v0vF7&KFCqn6*;WqB_J;Wer$BPG=eEVVH5O~&< zM-!;(V-U39`wXxG&xrW%3}R?><(-np;5=M%S?4LXJ;J4Eic7J5Hk49VLsU_Wr}II; z#M7cZrElayaAn0tMp{kUcb2bKi@SO>S7tChJhW@1`mab*#YQx3k}INWPu1~+0(d^vFT5^uR=f^KWOgCqvoE$6o*sH5>K7dezLM0*XRtU1!Md`em3yOrz9_mF^n4 ztguPKWt3aw7!ksx;j9kH(j%0hMCY+oF9tCt9bg&ZoQ>ZaFo<&0p@ZHzSt?sG#`RuM z5X1RKYoXPZU*!i&jcwOjDR*~?)(5n8<8WTYVU3jb_B!&bnCOxjW~oy9Aq_PA6zMU0 z%vs?XF}yzv(Qbaf=H?3QMZ`XjqhO3&aRSP{iHi9$!l_N4D6!&n7eR)a zotml^e12G5+#r@O8@H9MFjboNv1>U-h3to(83N%%)m^($1oQ8n_)7pw7j}6g9w>We zB))j}6^lrRK9?iB@4h4YV4*EPpj!mQKzBkGS09klx?Y>ZK)Ess5zzI!8Ag>WtuKEk zE|OwgB&6-MYSnY8ZIW4w3J)#K8c$y=&A00mshMlLzN}Y&`&(GHdL_rTnj1y3^~`Pr znjwIS^HCX+u?I!>1)qOzM3mYZDM5=lSqLZ(E^5ZwHeZvAA;(0<=B=?l!eKB?O zW5is4*tvk)G+1k0t#R{lt4m^?*mIX6M7T`{!ZpORi#RW%|22;V6WPo$mlKb{E* zaKj262Jd}bmfy}|AP%l#615-E0x+0If&;M3tT*z2ftmToNGx4cZ^I0F67PHY_-K6r zEu-nElyL*8n10h^x)etm>u})XWJQof$&M^%a7?%j+5(C2?6^KD3K#6cR3gFtv z;cWA_4Qh#Adk9OdY;zdxID^=cWQk$c9J}2x7{)?-BJLA6DQ)AX-!T^Wt*CYy}{ z5Z@}2Xt)-NW1JDeddFOO$&VwSa`-9UAY*zmzKU*cvzleUAiynQ>uaMtTnV_>8qx7E+LjqrHc>{2gL zMjYhX3-m9Rh;0Rq&~omKS@78$VAs8Y_N^F=dgL@t4)^p)DFkBB2N|4~ z@Y#Lg5yUd%%8Tg`_WzcEJPu1qyTKHgxdDUA_iTgLB$uF=ibuHbV%*omT#K9jbe?qx z8wK(>btR=|={DN8Wq^T!va{Bs{rnV&*jZ_ZFUMu5l_L*id}p=+q^*U!X3g-me0#P3?B~HzA}w#A>3XR7h%yE|1X7M(Xe5zr~Zi^O?jo>4on* z9N!Y{U{VaB(UkZ(H_}=&P%n|DnO?tc(7t$O(+5-^=}cju%~!+oXzIKlvZGBKHzJ9s zZQgvcAITn1xvW8%M`4p0Zr?D*ni4u;qw4`pL(yCI^^dwMZTum&e=XF~Pdpvj;G2RJ%ED*{%wLXAs2OF|| z6mJmMAtTE@;Ee-v`o4D5&5r;_1`P^a&G?<*_7K=Q zYjGY05Wc`1!Z8Nn5v|MVkaqO@h9`lx;^(tU5|FnO-o+?8bX{AwPD-)LP=9}J6ip0v zoO}%*ow25!FaKDo?8Mv5xR<_GjkN+XL!R1?&?WTjuy6(Ey$Y4WMj6C*v)mj_M1Sgr z2iVET1q@s+&}BM(M#3)USiIBOd>0USBW){4dXy5R$W!-36NVnLKOFX-ixi7BjO% zYX`!_n*9uijJPRekpiCTuTo?wKfmo!tL^gga^MOkZC-6Q7Z4aK{nexWY#95ebZNX8 zvpsb`1;@sA0eb)pUN1QjZAhwrg*5nyeSON--4ZhhTYcY9eWOxre@6)?ivtvIP%%Qx zXmfrrm&>u+50?;lu0*c9$yH?+SmNQ*I+xOEplw-1W4`YVbte3xgU5$?&_RjpPbt+e z_d=fjTp{X#zzOI@jzQ!=WcTQp7sZzL%>A^G*Yvd(ndok;d?g2QdWEC0N??=a=iD`@yEb z{0$)hH0*K#`b}>S#ECh|7M&?JdF^8m>HXu$iwbfanBT}YMw|ADg_M3%J?f6U=n@+E z$_P&0XQ}%(N-#$Eo$#J+Ud>7j1D7a#!o!gz0a z&d(B}0t2cJhmTd??NS;YdOL6>N#hpPN>K*qY6bj4teA-5DA1RwG^F+-1zTD(m;w(u zKh6K8XQW@1;!`1ka}m}p?anpVd+Z&T)3$T|0nh)e8JJKryo|(Xs(|MjR&)67%q6)1 zi;!lVJ7j>}Z!_$w0=%*2_bqkQ-C&8?&8XvG!yh3b#tuEY`;n2lU_$!ljK+vtequSE z^J&*9M*fgrfD_K59>eUBkpi%aEgq-E-2?58VcjrXIo~`1al__}ll%nP$KlI3$_3v= z4EFNyD6#%TSM#CQVg|1;X3fh}Z@_hgi(ZGf_AD=QR&QG`S$-RVOPVkg4BZb(gg*Em z`BFKxL9lx{rYjiEqn<&q_|7bD7<}eh0?E?t?O?DSL!LT)#D+k`uq%LGW@E@t+@kLV zWv|DUz+aHBeD+-rG^_H@%LG><%4HBws&kugYFvk#_X!GKLJq+&)0zj78~pPKqLY=E zPiT%r9M&8KMP{=QDcMY@sO5EAkFlfa?kGyyAAq&gTvmtTK6`)K`S6so@}-}ztX#fl zX*jm60ax3;4UcXkyOsc90_a|Qr+;9hsv!}}nS_AKB}v#K#>HG75B=V5Nvq54f=Wo^ zVH9(q-j*XOGO_@>4(h4s4vkos6g+DKm$wGR|E0SxkH&gy``4t7kOq;2(;!KPC}T7# zbLJ_@5JEDGlp+mEGG4QA3o++oaYO3qXU#rlww@<8Cm6ehhz_3}=u(J~5GF*M_kfv(_r_lQ@wlC}!k2 z>uIoDCnzf!O)p`OQG@v|Zg80$39QU0Wq{K63h;tTAhAzqhu%6ma_ksTI|gLfBd zq(8gJTV)fUzE_AZ&q?zFB#B``(rqmIe23Uqs6HCZG$)=`t)Qn@3|RQlweTrX&3@g= zQbWMFXccyFv7-$kTLgq~Wc79&csMr7fqNO5FsbA*7o8T0xdr)=c3k*hE*!owEkD}N zU--SjHnFh$m8itF!yn3;@2K1;w+_7?F~pNNc@bAIA-0*>hJyh+DZ?qt#nmG6T)2&;#2*rn03+)qL%qV8W#7kd0qgjXUaV|FU zl9O}~_s45?+yWUN)7MXwxzA~M*u6Vc-g}Wy%YxDNh1r4lfV=yR5>5o-R-E{#Tfy__ zYCz@k*UZJ_*;M1UtqQB1kcwJc2cvP_+>wB*>M()75Z|(P?W6M8O|Wjd1H&ujh4<=A zu{~hRq6Imc?@h>#W)}8&OjY2CQ*@Ozv zw+o7lw6=EvMW{ZmhUZNKybKs%;=OoREs_mz1fln=mfjZBQwUr>%x;(-E#(B%U12VocZ{Gru8O|XbQ#4Mxc;VNjLoEEd89xz(^E~o~O}5z857Cm_ z%G7`vP0nFF$KIL7VDb|L{UX%=Rfl4`VcM+3>E+STZ8_>#2|>$DHSF-YymdC z3rUZXN%24)ksZX4En%!^GdAnT~+L`T<@L(JUJhLI+}s zY^wDG+0Ct+NjP|NLvGAE+(Ov``=b`^230!@0H;lEEtm>_!8H$pf*R8FMaLabR1#~q z=flkpa6YH72Y~s&1VB8m&@91c zVFlF&3bEE;f+mOW?ySl7J+>g$4l1MevK#((%mQMk7@d++ALa+Q1k#r-j_%%3C zzhyl!k$Z7G{y@s!?yStbEOA5c>%rMYt>3mZ@BTHASo#oK7Rs)8fU;0}nnrq;l#r67 zn{IG+XyeHOjhWg0wDBsSsJAp3Ex1UYe@b}g_?wm7E!j5HU)oD~`aUwTCNUNgt%Y!T zFyE5bw~=71GCzo|)$j!sK9b*J%2B<#DOvOQuNZAR=no={KMp!$Mq>?0-`3x5loJOa z8kfX3b{|XEkv`XufC?;?sKih;VFvM8s$CzB<2Ez|aH=v|6RRQ~1ePqO<5t`}3H6-B z{{7@256gVwhHVcGOKKapq>n%moW1B|(Qb`FG)wec*hsy@dOLUQK*ya7&WqZ*wia2- zL9;yj_Gw4+utmUi2#DaQ$0y{r`SiVG8bO%^*F-R6m(05cy)|K%E?zX(?`)j#(#^Vz z4}cvv+OS6=>|GDQ8Eg>pjbg_!HzgvZk8C?%LX0- zTqg)2hoB+A2JQHTI3tK#7LJ8AazE|C?BMTuQLA<~hWK$H|Xg2YZZ$W!4ux*WBVTiY`e13@c5N7 zU!(l~P5S6jy~3_cf*07O{J)k|_@1@X=OP%oA3*F8=aPQ2qP7McfbD@<-_H6s=w7GIk|+mOn)CK-jv}MEECw zL;&8sl3Q|PEEsVsWJu(#fB@a%M?unD+W}ub_@;!*KLGvhWorX!fNkEl1DIBNf~Za{ zyB1D;AGbWy}vkKlyeCt8w0874LO`{VFqlduZ#C$|n3Sj1zelEg)98MIX+xO$DK zv^Ma42jC2S%!#w$Tafa21#b`=NBUW+q71~p_}88<__=I+Cts^FvFu#L+iB_FQjOK>fG*i79Rm})pY%wC(b#M^6^+2L_`KnCO<2bT&NzwL4U02 zH8VkB(n0Sjcz5N+U<~;r z+5~uZO|-2Cj%Msznagt@1LqIzr_PR>4dPComlEd#ekyOLb^EM&<@QZ*)myYV(ECr= zQuv~48k}Cfv+t>Urgggt{VLdAe6o~J`;LIkbH_CGI6j^2pwC4H@VZ~-$cCQZ|x zjWYx)$L>w?Eb~2(H?p{UEjM1C;$c5&JHehx7X6^I?e1Iw(ZSF`GJEuO|3Pw6hRm!xlPcSIl9@CBzr z1V69Z!DrkEze5$=Jl}}Pt*@g1wGEfV6c!a>xJXN|NctA(4+al9gAXK>0|Pq-H5#@V zG+c=#Aeq7F5pINQ9i~#Ln@)II8C9N0bQgdO$|{idhok0Z#9M@vQ!v&6 zT1_xNQ!fwg8lb^WgXPpKB=9x(4M%AsPU09vP$zqIxj1hr2Ak#a(5isLIM6jV+Lr^|V^MGO<3` z^7{osZe=eCJ+$~#5`?P?0q>RDO?jWm8==<|l`@#b8Hm$KNv&+q8#c96`%q)umVJg$ zJ4496tjFkE1V$xf!gjtf%J%)a^FV>c-c9WhAvF0Nw{PA&j^&b&ghz^*LA^+hzDk~c z*mo1)Eu@`<&bT8*Uw{8vM6Y`B$LTD=hsLy=npwP#+il>lH{Ggi%RqmR!6*Z64MqFg z)#6QeeK!@oEI){x=AX$CoG0^SS5`!|qqKtIZpHr~tgoWH9H47}EkH(_-9frOj)8?J!=Pqgg@Z{0;+Pas~;@t)EcGn|lU7g(1QBo9oadX7^$QM}+L zkRLywcu9k}07W7O<0K$ISOC@24fX}`=Imn)xbG^}A~n8SQ0r^9rTMks>=^yIdcb7| zYFecbjJ#b|!ejDjQShIq{&a5Qi1UPACZPg|X{^{ejeZW;2*A&qX}US_7u@jMy@s?z zXI2xqfip(ca!8F@%0n|-hUr-=UyT>CW@sip4a8vp*d}{IMTM18tetl+yt~E75CYn} zY0=nJkEMtt1J53PU_@jIsGPx8s}4SQ)B7Ng)?eC6NzvX-Ys5Q9?!4}44V)`G+8+Yz zY_yh0;(|#8Jy^fE2zzZ%NfV^32#RXNJ_WeiRXh)5rnc+&EG8Okh#wdkoRw#w$Lv*0 zXRi+VKzGx&;>|cO@<`P1!_d}e<5A)yWfjn~he8Gs3Yi*-eut`{(80Q@c+=r?M^s`Y z7dLr%(tv2*S%WaNdGOE{@$#Pq!oVHfUhh_yps0)_BIUwnVbRYKMnIMZg4JXpMUa%t zM?1#_@ zRQ{YJjU~4n*Oo0sSQQWj;haXIteQ#8z4qrANh~E>Yw->J1)FVROG=PfHsP;Yo=O?M zG&w+~3KTYdgY+*|NzX*W(?8x;4B>+xF7Zb#9E@5Q-k#Ynup?&&ZYb|Z5e$nZhS&ZF zn}sjRjXqI&to!p0}3~}i{BsetU?_^A9?4!+F375=RmZ{ zy?kh4vx_q~0@isTwjOpggRs87BM}Da`wi2!TkXu)XdC9JSonwccl5)qXwcrhGsAAd zjtV=SdGgU)RBjv#Q%$2(WzPY)J%8zxW!J$NJ>??FXI~|RG{DR4+s#_%X-MaZ?paUUr42xO@PG}Tz(7E z5(h&;cWb3+ox`k-_Y-Q&_eKLpmH6+$@je&bM{-VRRzyQ+W|>ce8_mMm5OP4QOQkX_ zd~4y`i3!*j)9rFcsKZC{)nsW$Gbv=YV!4i2aoXJ%Zx?NBl$^>cZ(-y|$G71Uh6*bh z8ezq=INQ&s5G$`i$9YYa<42F`871ukTpT(?q8N|0Rj*IM!DdsOb?AmpSm@2`*H8GC zoe{l2(4;w{Fe)y5qp}X0xH|hbh=wZh2p9*$qAD#t2?i9_H=2ay`oy$J9=&sztNh#& z3lP5m&HGn_b_CV#igUmJj)L5NH*)*eFZLa3CWZE&5939Po&YM8(s0wZ+QnPNpnEU$ z9iMsY{9b}9_N#dS?4epK0*%d;?{8L8#kWJ@qt7*bCV6D@YwCACoMK^pq}>nA1g(7R zvXfoB8>6tj^7M{?>x5|VjLeBIVR|T91l-o%$Y0qIE`Tt{ zCToNZ=5eVzrFCDM3KkchGn%iOpGja8gpj?BwZ!}_2JJKMrF zaRODr_}3(cbA3Bg;UeoWC7;_5^cpn3*4;P&Wew?ptLzLA#*qXW+eUH)%Jc`>AIdDS zfAbQ#j(!-)R)G70G7 z|3J&`-JUP+GbDDU)^&0hVSHxY2;%SwS*9X~( z%CyM;wZgzW+F8^#KHOeKDS!`BKkUIyzrOFg+>N%kq;;oVY=aK}!eJF;Cs-H=~WmkFs1&CE?*g4Qh z^BAg<$K=2>JkeUOhCyeD1m|&5oN{j+!J9Y{5ZYeZCrs^HO`L&E!!zH%KgB7ZXa4-5 z?F)W%?5MCny~dM&ri)hN9iDoFjV}jfbGi-;rOmi!t@-tU9M(m))4QHQw_s==*GG{{p!%kl9%>vhdpM5$UEArSaNUO-> zSp~B8MXqFCD!io%0g1V~qP=bw=;O|!tvI0*T@d5D-i`T@sWJi!aSomEv>o&pWH=8+ zI1tCqPK+%xB18etz{Q@23(CL#QMWPz1_ct(C zRIZ;B4OVm8qt^G*Xqv$&KIE>N{L!OCq6{z&NZ>tx|IpLWtlHtuTmS{=BdlibSvXBI zv$`#|;s=Q{CZi8pEP09wyNKy^&tp5)Av?#`Nho0NgQtABawG!d(ob};8nV|&TXcZIFKI6_aPaJ&8Y8)f+10d-U+q369+5sS1qT29* znScl#YI~VEn+q%q9oYM9Dv%dIT6Y4LEnV8X?Y2(W0wS4R1~F&_5_&gh+s&tF6({wo#4b|LEnUsZAL7s9`%ceo%ypw`yX3W3 zA}}wX+Z8WTBQ&j}_sTgrH)9grB0Ru)1+M2ceVOe3?EX16r*&8U61Q#4MTHg5%`-)_ zUn}Sz(D9lifbG~k3|YVeZ_-M6-2F=YzLwguy^`O>9Y>xdq?7NU)FJm2c_^V~%R(ZK zOpRu zAz-tURQOu2AvlVYlJ>1MtQaxC;Fp$Ky%m!r+Vt~HDWUZx_cn`XpdwjhSVt3#tU*8m zF>a~~3hFbRJj1ANyn=$No~KaJa5v7S+y)34hzd3UQycO&R!`)xvG-oV>#6aarwS00 zejCDfKE+yGf`kD}^a_mQSk!$bTP8Y9G#3|iiO-9c*~?g#Mdj&PA`hObA|oRMxZ$O3Yf#_Evz3wz8wKr-`!8%@6p;IvkN0!^zJI#Yh<@dY%hfs+z&mtwP9tn*=X+})S@{q+hk zN6Zo!pMn@tDqR;lcST#;K;Pi(qQ5n~RR$>Q6^^}ehZ9b@GIrF~-c{q0u-5-yKHgWg6<;q*hg?2QwHX_j6odFhsQ^hXO_p;Zr~C`4c}52WhyFP|59d zNT;dV(f+`BVhi`|z7#Q!i#l)`?gzaKZ=|@FFG2n{Zyw$%#|nwRmciEJr}o#&40-2Ee!$qB|6nFoCg7Gn2U>)1{z7=~ln2Vgim~LAPU1i*y zdR#9|-%>cYMdZ-vSAhU3tLi zSZ>gM55N(K?t_U^+keT#_j3j)V~Rby=s-#LtYhZtHT`F%j}rnRzwq z%irW39pqW3DuGC!5$@c%>Ma>ax|l>AdP+h1Szfseu0JBFP2?MN1<-&ipEz+5AfkYg z^b3^Ih~ql}U2I`xJ*$4eQ83%)3A>Th``TgnHie(_m80gXs4$$>B9R&@Z3B>y1alcW z@8B`^IrXc>72wHw?pYe`^4wq&f3rYRy%oChJqJ*Zp3|rewL{)KeEDBBV%ZbySJ=$N zQ-*N>k-S_~qcB)aJU`={)U^M|Np6Zq?IX!Y5nidF2JWoEv=@8U7xHZuZf7*uuiQU& zXJj+Jz_I&xDv~+>f2ATFzZlr)j4P<(>u&`>B5|%bYjW9D%xa(^k#^(wRI3Qstxar! zq{CNpSHCJ$0fm5~qM|*c+F>H+gb%y}vS{_>1vydTkPcAS@awe*Y8z{+hU4|4uDy|q zTV%fVS3RbfE=+2m%}D4YLK}2!#w_;^&I1?6*a2Eb{?0DBj}o%ZF@W))E!Wf?$9{ne zI4G8*_Ve<>&zQB8%t>O>} z^mUxhvGC6eQpY|sF1+~2^GFq-RwgMln5Mgj0-XYlM6H2!%FFdZf21V77RRc(Nh3}N zaf2g3S({p4E+`dduTu#ZJ_O?J)H8xn2noDD$-j3(0TJK|PFC|M$_&zGS*l$CG(&Ae zLqfD5uy9xp8V$ONh+P8jOAKIDhE&=@-yPe&lnO~BAPWY!()Wy9GI`J*qmg-^ZEk96 ziZ6=@n>4FqvLCV3DgrK>;o;5T|L)&EGtSHtl_hu;W0asBAUi(MGC08# zz9r)8iyFv(ex%VM|CwRLW9)@s7GAZztDgcbg$0OV&Qm2tQ>xqoEr4eg8s2oRsmXu_}&L2fWxkkb{Vn zUhJcx(Vm49e}@)%6}XOuT;MYfm#le%$f76|<|uwz8JqDfqC*Xijm^jsMLQZuiG#h{ z{v9l>N`_GJhVx^Ws|=Puhnj~!SwHezv-0yXmBJs}F`2D>;(PNZoaikSimqoSh%EDC zN2pUPLkruwF3-fs7@*fQzruDs?aF8@5MsTNMm4$Tj~BAmJ9z4|Tt`chs+WFj{E2W2 zrg+4s1O$A*XUZ8Ncw=}Hxmn)Em9F)=%Mwo%KM_Nch@s3pj3czH8saDwe@A{ft&|qN z=(^6YcEd}f2rH8mj)*2S#P_|27W0U76-|-Xl??9=Ui6bI=Ao5e1))Sm-?`C+o;luB zEJcrGcesZ^Alu1lzwbTV4QZEdHq8zEOJ-6&q!3E^KZqbgySCv&$C71-991{PZCEb^ zH7X6twfHEdoJ1Ix!}-4)?YTyb*+W=q{qj&~V^!UkyvYmJqhw+J0w~F{IBVE$K(VFEynjn>Y*QLV zfLcXZO7AHX3L|L!9Gq59WCw6qMkpE}|L1Uu0IM%-NiCXYOco6E28WQ zHly{t;`^-^M|$5DP~?#`Dm~kN=w?tEarKEXA8v4$aX1zP^hypF57PuaC+m+>=K?q- zAA1_Q^EQKB5oH5V85~yh1A>Rpj}b_YY@$Jdv-{iKHe3@Kk(+nd5vsv_*7Kz9q#UX` z&`h{RaqE7ou*gV*czLEnERcpOpIr{YRclw5G0Sx%b|4&a_uQIGK$h-IuDx{W63U%= zdgLBIao;zHf99!+o563hjG*JsP-#V}ti5?MkI8VUL=Cqtx(Fe`$S=5cqMtGG=gDN# zczeN1aRuqjw&-WW=1upCh^QCehDw;h%n_^?zA7ufmayn0E7(XO*hxq!{z+B3(E^Yhpdj6zVOpYB_?$3OBTnmC?L!&pf2jG?h((n3(yQq^&@wLiiLv( zwlXjVhphyHdhR-O1kb_DPIs1=meG1_Y6v;8cHwX23 zHmeE%16H0mTy6MKU#o&EJR1SqazM)gppBVJ=4tai$c7>6^P55xD_;#2pJg$BsDk7V z@fI=(+Lp>hLAF8e6M@DFDkFro7-Fm}D=9B6<@>WTVqXzx?z?G^CKJP~#U}vrGF;UyjuX5Ii<@r3XcMeMs@6U8;0bF>7v7o}0uGk5&` zSw#b&u1!*ofCwovzZMK)>9Z+#gi2rnq5W9KmgGU_1)i%T^TR5^}`1t9-cF38c`kg z&JN>PPn0&#HAsIe&C-1lXV%cQ^Mf=4(=R(%M=H3E%Ms^B^`dj*-_ns{b$^g_q{+_^ zBnW#wco_7dqjT9Ic}WLP4aGv1<&S^>q8o0AYiMjlF(2sb>%%21sMY#KZr1AKtGXi} zjr~>(NU#$Z01>I)DNg!rfW|_BK-&PPMch7{uzKzCwBW$NXBc}hZJt=YIYJ#%Gw28Q z`AC}>qSom;-jqVt=M%~>gx~^m4_6$T#R?atY^zhT_5(G0h=#_<@DrR5(3@yEbUoN( z$g3j_zlvxXei47%lBTOkNtWn?;m!_oR~5iX_8);my|n)^aA?NR>iH*(ZUs;p!>s{_ z6;f;PAU1X!B#i#EHEl1>YZiyL-S4_!z1DXo8JQ#qYQnWMzBg_FB`X9r1Iz@rW8!$m zO{40MkAjZJeTSDXUsmbZL|Sk3EErwU=UBF$QdF!4wuRpTUluae2nP?Y9nJ$27+cU4 zdGi!vfY29Qx1>M{4lH!90CeFIrZyX1xc#R(cFohLeC}udEzzi&jWbuIGi0S9emJ^_ zvdO<7^26p3gp&ayCeAA)zF$CVx#G~OHEWFX9TUqgu$+oIu=FBm^q%F{@!`?8f{!)E zM**#;D>9W2%o|IfGTUt97XBvd4Rw#_@(nv)_m{>jYn}RGZf$K1w`Xn@UZlWiEH(V@ zojaRhox)o~pgK+x=s*iW+M>x}=9ZNa5KtaD2*oM}7PE8Q-NIO}2bQ)qOgyigR^o5D zePB`HluTuA`w|b)M>rBfLDNE^N5m^w5=2%7$`biyrn1Ko&G)vqL_p5%(wgO)?B`~C z!68Gy1f;MNNECoJ2r=-G;4R996>RHP1jeBqK_qm!pOIz^?5z)&Ty*~yw265Xb-r?9 zq{}OYG?L7+7~p{Gfh$t?^ej|OTFuA^4A$ev=u3R1Pw)wgu8z~U1iemhI2-~v0g~+A zJF2!m=Trq%29rV5Jd^Wy=Od-J>e>^4*UZrE0PJYTY`8+T*ENz zV0+V0fw1wg@X(;(q2bO>Vo3?rb;OK>Ffx!eC@28WOYLHOkKmRC2Ru#SScrPDfE*p$ z0AhFG*Dyu|)V^$4ssq(Bu*`OJlxPuP=UenP;820b`ZTZ+tcD96=`NMm5N1wl6GlO- zz&|nXr#9WVaRZz-VPhKR!pG|Q&TQCe7Y+&de-8z+Gzr9q|DTeDMmm6>?u5&^2 z0tqax3;6{i2TD+Q*x@h*t7rwbURn8WP?TuLZG$htun&PA1NUya16`67C=kGc&QeBj zz5w#^ue-B`?ep&<)Z$G7N-yOprX-iNPn&2Dpt;FtqU|6^OO-02{YzPDaRbG?WC2fQ&x>V~JmhLs{UP0GRZ!EHeF6$tM zA0l~$ZUcayh4Go;U_~#S&UEGyZ z-ij5p_~*M<-VCBTq~U0?eRCIKHhS+G8=bI0@X7Hji5&{=;9l60lzbNr5?ED?fBf+* zJs_h8&>PB!RLmGi2^{-Q|M)`ej$g(V@|OJbXI_B30v57Yn0Qe)&!-KcFQ+B}AbR=i zFvS5nZnPtqN$;ld{Qgw0_vMezZf_?+#V`IsP>JQt61uC=yV0@ZZKLraN^6{Bi4=$u ze-gSId_PueY;5iKzcYUhUcRgLHWYDw4;e_jjr|j}Aq%L*{WZ$b63+-*Hpu+@cU|SY zjt{#RA6Dzoe~F-zi_ly0{FeZ|?^)G+&{v;7s i|MKU5N1oGP3(K^Mjt%9HHZO)tDI8NhnsNAy_x}U51aPVV literal 0 HcmV?d00001 diff --git a/DCVC-family/DCVC-RT/assets/complexity.png b/DCVC-family/DCVC-RT/assets/complexity.png new file mode 100644 index 0000000000000000000000000000000000000000..8bee3258cbeffdd2d15f2466abe63efa59e768ef GIT binary patch literal 268846 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

C&8^0@$@yj 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

cciYfk!<}BrGqgow}ZH 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 My2d&Mdk>%g7o*CfzyJUM literal 0 HcmV?d00001 diff --git a/DCVC-family/DCVC-RT/assets/intra_compare.png b/DCVC-family/DCVC-RT/assets/intra_compare.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cf9b13d1c299dd2d5bd3616f4d54a5392101b2 GIT binary patch literal 151574 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%0D(6)qiV^J>Y5(hq0%Vw98+eh_?8jbsY)EqJ(# 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 BdZhpW literal 0 HcmV?d00001 diff --git a/DCVC-family/DCVC-RT/assets/practical_performance.png b/DCVC-family/DCVC-RT/assets/practical_performance.png new file mode 100644 index 0000000000000000000000000000000000000000..31675dcf6c896def4a443b30155682c62a4c80f5 GIT binary patch literal 173943 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/DCVC-family/DCVC-RT/checkpoints/.gitkeep b/DCVC-family/DCVC-RT/checkpoints/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/dataset_config_example_yuv420.json b/DCVC-family/DCVC-RT/dataset_config_example_yuv420.json similarity index 100% rename from dataset_config_example_yuv420.json rename to DCVC-family/DCVC-RT/dataset_config_example_yuv420.json diff --git a/DCVC-family/DCVC-RT/requirements.txt b/DCVC-family/DCVC-RT/requirements.txt new file mode 100644 index 0000000..21ad776 --- /dev/null +++ b/DCVC-family/DCVC-RT/requirements.txt @@ -0,0 +1,7 @@ +numpy>=1.20.0 +scipy +matplotlib +tqdm +bd-metric +pillow +pybind11 diff --git a/DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.cpp b/DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.cpp new file mode 100644 index 0000000..1f5d047 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.cpp @@ -0,0 +1,393 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "py_rans.h" + +#include +#include +#include +#include +#include + +namespace py = pybind11; + +RansEncoder::RansEncoder() +{ + m_encoder0 = std::make_shared(); + m_encoder1 = std::make_shared(); +} + +void RansEncoder::encode_y(const py::array_t& symbols, const int cdf_group_index) +{ + py::buffer_info symbols_buf = symbols.request(); + int16_t* symbols_ptr = static_cast(symbols_buf.ptr); + + int symbolSize = static_cast(symbols.size()); + if (m_use_two_encoders) { + int symbolSize0 = symbolSize / 2; + int symbolSize1 = symbolSize - symbolSize0; + + auto vec_symbols0 = std::make_shared>(symbolSize0); + memcpy(vec_symbols0->data(), symbols_ptr, symbolSize0 * sizeof(int16_t)); + m_encoder0->encode_y(vec_symbols0, cdf_group_index); + auto vec_symbols1 = std::make_shared>(symbolSize1); + memcpy(vec_symbols1->data(), symbols_ptr + symbolSize0, symbolSize1 * sizeof(int16_t)); + m_encoder1->encode_y(vec_symbols1, cdf_group_index); + } else { + auto vec_symbols0 = std::make_shared>(symbolSize); + memcpy(vec_symbols0->data(), symbols_ptr, symbolSize * sizeof(int16_t)); + m_encoder0->encode_y(vec_symbols0, cdf_group_index); + } +} + +void RansEncoder::encode_z(const py::array_t& symbols, const int cdf_group_index, + const int start_offset, const int per_channel_size) +{ + py::buffer_info symbols_buf = symbols.request(); + int8_t* symbols_ptr = static_cast(symbols_buf.ptr); + + int symbolSize = static_cast(symbols.size()); + if (m_use_two_encoders) { + int symbolSize0 = symbolSize / 2; + int symbolSize1 = symbolSize - symbolSize0; + int channel_half = symbolSize0 / per_channel_size; + + auto vec_symbols0 = std::make_shared>(symbolSize0); + memcpy(vec_symbols0->data(), symbols_ptr, symbolSize0 * sizeof(int8_t)); + m_encoder0->encode_z(vec_symbols0, cdf_group_index, start_offset, per_channel_size); + auto vec_symbols1 = std::make_shared>(symbolSize1); + memcpy(vec_symbols1->data(), symbols_ptr + symbolSize0, symbolSize1 * sizeof(int8_t)); + m_encoder1->encode_z(vec_symbols1, cdf_group_index, start_offset + channel_half, + per_channel_size); + } else { + auto vec_symbols0 = std::make_shared>(symbolSize); + memcpy(vec_symbols0->data(), symbols_ptr, symbolSize * sizeof(int8_t)); + m_encoder0->encode_z(vec_symbols0, cdf_group_index, start_offset, per_channel_size); + } +} + +int RansEncoder::add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const py::array_t& offsets) +{ + py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); + py::buffer_info offsets_buf = offsets.request(); + int32_t* cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); + int32_t* offsets_ptr = static_cast(offsets_buf.ptr); + + int cdf_num = static_cast(cdfs_sizes.size()); + auto vec_cdfs_sizes = std::make_shared>(cdf_num); + memcpy(vec_cdfs_sizes->data(), cdfs_sizes_ptr, sizeof(int32_t) * cdf_num); + auto vec_offsets = std::make_shared>(offsets.size()); + memcpy(vec_offsets->data(), offsets_ptr, sizeof(int32_t) * offsets.size()); + + int per_vector_size = static_cast(cdfs.size() / cdf_num); + auto vec_cdfs = std::make_shared>>(cdf_num); + auto cdfs_raw = cdfs.unchecked<2>(); + for (int i = 0; i < cdf_num; i++) { + std::vector t(per_vector_size); + memcpy(t.data(), cdfs_raw.data(i, 0), sizeof(int32_t) * per_vector_size); + vec_cdfs->at(i) = t; + } + + int cdf_idx = m_encoder0->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); + m_encoder1->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); + return cdf_idx; +} + +void RansEncoder::empty_cdf_buffer() +{ + m_encoder0->empty_cdf_buffer(); + m_encoder1->empty_cdf_buffer(); +} + +void RansEncoder::flush() +{ + m_encoder0->flush(); + m_encoder1->flush(); +} + +py::array_t RansEncoder::get_encoded_stream() +{ + if (m_use_two_encoders) { + auto result0 = m_encoder0->get_encoded_stream(); + int nbytes0 = static_cast(result0->size()); + auto result1 = m_encoder1->get_encoded_stream(); + int nbytes1 = static_cast(result1->size()); + + int identical_bytes = 0; + int check_bytes = std::min(nbytes0, nbytes1); + check_bytes = std::min(check_bytes, 8); + for (int i = 0; i < check_bytes; i++) { + if (result0->at(nbytes0 - 1 - i) != 0) { + break; + } + if (result1->at(nbytes1 - 1 - i) != 0) { + break; + } + identical_bytes++; + } + if (identical_bytes == 0 && result0->at(nbytes0 - 1) == result1->at(nbytes1 - 1)) { + identical_bytes = 1; + } + + py::array_t stream(nbytes0 + nbytes1 - identical_bytes); + py::buffer_info stream_buf = stream.request(); + uint8_t* stream_ptr = static_cast(stream_buf.ptr); + + std::copy(result0->begin(), result0->end(), stream_ptr); + std::reverse_copy(result1->begin(), result1->end() - identical_bytes, stream_ptr + nbytes0); + return stream; + } + + auto result0 = m_encoder0->get_encoded_stream(); + int nbytes0 = static_cast(result0->size()); + + py::array_t stream(nbytes0); + py::buffer_info stream_buf = stream.request(); + uint8_t* stream_ptr = static_cast(stream_buf.ptr); + + std::copy(result0->begin(), result0->end(), stream_ptr); + return stream; +} + +void RansEncoder::reset() +{ + m_encoder0->reset(); + m_encoder1->reset(); +} + +void RansEncoder::set_use_two_encoders(bool b) +{ + m_use_two_encoders = b; +} + +bool RansEncoder::get_use_two_encoders() +{ + return m_use_two_encoders; +} + +RansDecoder::RansDecoder() +{ + m_decoder0 = std::make_shared(); + m_decoder1 = std::make_shared(); +} + +void RansDecoder::set_stream(const py::array_t& encoded) +{ + py::buffer_info encoded_buf = encoded.request(); + const uint8_t* encoded_ptr = static_cast(encoded_buf.ptr); + const int encoded_size = static_cast(encoded.size()); + auto stream0 = std::make_shared>(encoded.size()); + std::copy(encoded_ptr, encoded_ptr + encoded_size, stream0->data()); + m_decoder0->set_stream(stream0); + if (m_use_two_decoders) { + auto stream1 = std::make_shared>(encoded.size()); + std::reverse_copy(encoded_ptr, encoded_ptr + encoded_size, stream1->data()); + m_decoder1->set_stream(stream1); + } +} + +void RansDecoder::decode_y(const py::array_t& indexes, const int cdf_group_index) +{ + py::buffer_info indexes_buf = indexes.request(); + uint8_t* indexes_ptr = static_cast(indexes_buf.ptr); + + int indexSize = static_cast(indexes.size()); + if (m_use_two_decoders) { + int indexSize0 = indexSize / 2; + int indexSize1 = indexSize - indexSize0; + + auto vec_indexes0 = std::make_shared>(indexSize0); + std::copy(indexes_ptr, indexes_ptr + indexSize0, vec_indexes0->data()); + m_decoder0->decode_y(vec_indexes0, cdf_group_index); + + auto vec_indexes1 = std::make_shared>(indexSize1); + std::copy(indexes_ptr + indexSize0, indexes_ptr + indexSize, vec_indexes1->data()); + m_decoder1->decode_y(vec_indexes1, cdf_group_index); + } else { + auto vec_indexes0 = std::make_shared>(indexSize); + std::copy(indexes_ptr, indexes_ptr + indexSize, vec_indexes0->data()); + m_decoder0->decode_y(vec_indexes0, cdf_group_index); + } +} + +py::array_t RansDecoder::decode_and_get_y(const py::array_t& indexes, + const int cdf_group_index) +{ + decode_y(indexes, cdf_group_index); + return get_decoded_tensor(); +} + +void RansDecoder::decode_z(const int total_size, const int cdf_group_index, const int start_offset, + const int per_channel_size) +{ + if (m_use_two_decoders) { + int symbolSize0 = total_size / 2; + int symbolSize1 = total_size - symbolSize0; + int channel_half = symbolSize0 / per_channel_size; + m_decoder0->decode_z(symbolSize0, cdf_group_index, start_offset, per_channel_size); + m_decoder1->decode_z(symbolSize1, cdf_group_index, start_offset + channel_half, + per_channel_size); + } else { + m_decoder0->decode_z(total_size, cdf_group_index, start_offset, per_channel_size); + } +} + +py::array_t RansDecoder::get_decoded_tensor() +{ + if (m_use_two_decoders) { + auto result0 = m_decoder0->get_decoded_tensor(); + const int total_size0 = static_cast(result0->size()); + + auto result1 = m_decoder1->get_decoded_tensor(); + const int total_size1 = static_cast(result1->size()); + py::array_t output(total_size0 + total_size1); + py::buffer_info buf = output.request(); + int8_t* buf_ptr = static_cast(buf.ptr); + std::copy(result0->begin(), result0->end(), buf_ptr); + std::copy(result1->begin(), result1->end(), buf_ptr + total_size0); + + return output; + } + + auto result0 = m_decoder0->get_decoded_tensor(); + const int total_size0 = static_cast(result0->size()); + + py::array_t output(total_size0); + py::buffer_info buf = output.request(); + int8_t* buf_ptr = static_cast(buf.ptr); + std::copy(result0->begin(), result0->end(), buf_ptr); + + return output; +} + +int RansDecoder::add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const py::array_t& offsets) +{ + py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); + py::buffer_info offsets_buf = offsets.request(); + int32_t* cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); + int32_t* offsets_ptr = static_cast(offsets_buf.ptr); + + int cdf_num = static_cast(cdfs_sizes.size()); + auto vec_cdfs_sizes = std::make_shared>(cdf_num); + memcpy(vec_cdfs_sizes->data(), cdfs_sizes_ptr, sizeof(int32_t) * cdf_num); + auto vec_offsets = std::make_shared>(offsets.size()); + memcpy(vec_offsets->data(), offsets_ptr, sizeof(int32_t) * offsets.size()); + + int per_vector_size = static_cast(cdfs.size() / cdf_num); + auto vec_cdfs = std::make_shared>>(cdf_num); + auto cdfs_raw = cdfs.unchecked<2>(); + for (int i = 0; i < cdf_num; i++) { + std::vector t(per_vector_size); + memcpy(t.data(), cdfs_raw.data(i, 0), sizeof(int32_t) * per_vector_size); + vec_cdfs->at(i) = t; + } + int cdf_idx = m_decoder0->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); + m_decoder1->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); + return cdf_idx; +} + +void RansDecoder::empty_cdf_buffer() +{ + m_decoder0->empty_cdf_buffer(); + m_decoder1->empty_cdf_buffer(); +} + +void RansDecoder::set_use_two_decoders(bool b) +{ + m_use_two_decoders = b; +} + +bool RansDecoder::get_use_two_decoders() +{ + return m_use_two_decoders; +} + +std::vector pmf_to_quantized_cdf(const std::vector& pmf, int precision) +{ + /* NOTE(begaintj): ported from `ryg_rans` public implementation. Not optimal + * although it's only run once per model after training. See TF/compression + * implementation for an optimized version. */ + + std::vector cdf(pmf.size() + 1); + cdf[0] = 0; /* freq 0 */ + + std::transform(pmf.begin(), pmf.end(), cdf.begin() + 1, [=](float p) { + return static_cast(std::round(p * (1 << precision)) + 0.5); + }); + + const uint32_t total = std::accumulate(cdf.begin(), cdf.end(), 0); + + std::transform(cdf.begin(), cdf.end(), cdf.begin(), [precision, total](uint32_t p) { + return static_cast((((1ull << precision) * p) / total)); + }); + + std::partial_sum(cdf.begin(), cdf.end(), cdf.begin()); + cdf.back() = 1 << precision; + + for (int i = 0; i < static_cast(cdf.size() - 1); ++i) { + if (cdf[i] == cdf[i + 1]) { + /* Try to steal frequency from low-frequency symbols */ + uint32_t best_freq = ~0u; + int best_steal = -1; + for (int j = 0; j < static_cast(cdf.size()) - 1; ++j) { + uint32_t freq = cdf[j + 1] - cdf[j]; + if (freq > 1 && freq < best_freq) { + best_freq = freq; + best_steal = j; + } + } + + assert(best_steal != -1); + + if (best_steal < i) { + for (int j = best_steal + 1; j <= i; ++j) { + cdf[j]--; + } + } else { + assert(best_steal > i); + for (int j = i + 1; j <= best_steal; ++j) { + cdf[j]++; + } + } + } + } + + assert(cdf[0] == 0); + assert(cdf.back() == (1u << precision)); + for (int i = 0; i < static_cast(cdf.size()) - 1; ++i) { + assert(cdf[i + 1] > cdf[i]); + } + + return cdf; +} + +PYBIND11_MODULE(MLCodec_extensions_cpp, m) +{ + py::class_(m, "RansEncoder") + .def(py::init<>()) + .def("encode_y", &RansEncoder::encode_y) + .def("encode_z", &RansEncoder::encode_z) + .def("flush", &RansEncoder::flush) + .def("get_encoded_stream", &RansEncoder::get_encoded_stream) + .def("reset", &RansEncoder::reset) + .def("add_cdf", &RansEncoder::add_cdf) + .def("empty_cdf_buffer", &RansEncoder::empty_cdf_buffer) + .def("set_use_two_encoders", &RansEncoder::set_use_two_encoders) + .def("get_use_two_encoders", &RansEncoder::get_use_two_encoders); + + py::class_(m, "RansDecoder") + .def(py::init<>()) + .def("set_stream", &RansDecoder::set_stream) + .def("decode_y", &RansDecoder::decode_y) + .def("decode_and_get_y", &RansDecoder::decode_and_get_y) + .def("decode_z", &RansDecoder::decode_z) + .def("get_decoded_tensor", &RansDecoder::get_decoded_tensor) + .def("add_cdf", &RansDecoder::add_cdf) + .def("empty_cdf_buffer", &RansDecoder::empty_cdf_buffer) + .def("set_use_two_decoders", &RansDecoder::set_use_two_decoders) + .def("get_use_two_decoders", &RansDecoder::get_use_two_decoders); + + m.def("pmf_to_quantized_cdf", &pmf_to_quantized_cdf, "Return quantized CDF for a given PMF"); +} diff --git a/DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.h b/DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.h new file mode 100644 index 0000000..c7d223a --- /dev/null +++ b/DCVC-family/DCVC-RT/src/cpp/py_rans/py_rans.h @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once +#include "rans.h" +#include + +#include +#include +#include + +namespace py = pybind11; + +// the classes in this file only perform the type conversion +// from python type (numpy) to C++ type (vector) +class RansEncoder { +public: + RansEncoder(); + + RansEncoder(const RansEncoder&) = delete; + RansEncoder(RansEncoder&&) = delete; + RansEncoder& operator=(const RansEncoder&) = delete; + RansEncoder& operator=(RansEncoder&&) = delete; + + void encode_y(const py::array_t& symbols, const int cdf_group_index); + void encode_z(const py::array_t& symbols, const int cdf_group_index, + const int start_offset, const int per_channel_size); + void flush(); + py::array_t get_encoded_stream(); + void reset(); + int add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const py::array_t& offsets); + void empty_cdf_buffer(); + void set_use_two_encoders(bool b); + bool get_use_two_encoders(); + +private: + std::shared_ptr m_encoder0; + std::shared_ptr m_encoder1; + bool m_use_two_encoders{ false }; +}; + +class RansDecoder { +public: + RansDecoder(); + + RansDecoder(const RansDecoder&) = delete; + RansDecoder(RansDecoder&&) = delete; + RansDecoder& operator=(const RansDecoder&) = delete; + RansDecoder& operator=(RansDecoder&&) = delete; + + void set_stream(const py::array_t&); + + void decode_y(const py::array_t& indexes, const int cdf_group_index); + py::array_t decode_and_get_y(const py::array_t& indexes, const int cdf_group_index); + void decode_z(const int total_size, const int cdf_group_index, const int start_offset, + const int per_channel_size); + py::array_t get_decoded_tensor(); + int add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const py::array_t& offsets); + void empty_cdf_buffer(); + void set_use_two_decoders(bool b); + bool get_use_two_decoders(); + +private: + std::shared_ptr m_decoder0; + std::shared_ptr m_decoder1; + bool m_use_two_decoders{ false }; +}; + +std::vector pmf_to_quantized_cdf(const std::vector& pmf, int precision); diff --git a/DCVC-family/DCVC-RT/src/cpp/py_rans/rans.cpp b/DCVC-family/DCVC-RT/src/cpp/py_rans/rans.cpp new file mode 100644 index 0000000..11eb342 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/cpp/py_rans/rans.cpp @@ -0,0 +1,534 @@ +/* Copyright 2020 InterDigital Communications, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Rans64 extensions from: + * https://fgiesen.wordpress.com/2015/12/21/rans-in-practice/ + * Unbounded range coding from: + * https://github.com/tensorflow/compression/blob/master/tensorflow_compression/cc/kernels/unbounded_index_range_coding_kernels.cc + **/ + +#include "rans.h" + +#include +#include +#include + +constexpr uint16_t bypass_precision = 2; /* number of bits in bypass mode */ +constexpr uint16_t max_bypass_val = (1 << bypass_precision) - 1; + +inline void RansEncPutBits(RansState& r, uint8_t*& ptr, uint32_t val) +{ + RansAssert(bypass_precision <= 8); + RansAssert(val < (1u << bypass_precision)); + + constexpr uint32_t freq = 1 << (SCALE_BITS - bypass_precision); + constexpr uint32_t x_max = freq << ENC_RENORM_SHIFT_BITS; + while (r >= x_max) { + *(--ptr) = static_cast(r & 0xff); + r >>= 8; + } + + r = (r << bypass_precision) | val; +} + +inline uint32_t RansDecGetBits(RansState& r, uint8_t*& ptr) +{ + uint32_t val = r & ((1u << bypass_precision) - 1); + + /* Re-normalize */ + r = r >> bypass_precision; + if (r < RANS_BYTE_L) { + r = (r << 8) | *ptr++; + RansAssert(r >= RANS_BYTE_L); + } + + return val; +} + +RansEncoderLib::RansEncoderLib() +{ + _stream = std::make_shared>(); +} + +int RansEncoderLib::add_cdf(const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets) +{ + + auto ransSymbols = std::make_shared>>(cdfs->size()); + for (int i = 0; i < static_cast(cdfs->size()); i++) { + const int32_t* cdf = cdfs->at(i).data(); + std::vector ransSym(cdfs->at(i).size()); + const int ransSize = static_cast(ransSym.size() - 1); + for (int j = 0; j < ransSize; j++) { + ransSym[j] = RansSymbol( + { static_cast(cdf[j]), static_cast(cdf[j + 1] - cdf[j]) }); + } + ransSymbols->at(i) = ransSym; + } + + _ransSymbols.push_back(ransSymbols); + _cdfs_sizes.push_back(cdfs_sizes); + _offsets.push_back(offsets); + return static_cast(_ransSymbols.size()) - 1; +} + +void RansEncoderLib::empty_cdf_buffer() +{ + _ransSymbols.clear(); + _cdfs_sizes.clear(); + _offsets.clear(); +} + +FORCE_INLINE void RansEncoderLib::encode_one_symbol(uint8_t*& ptr, RansState& rans, const int32_t symbol, + const int32_t cdf_size, const int32_t offset, + const std::vector& ransSymbols) +{ + const int32_t max_value = cdf_size - 2; + int32_t value = symbol - offset; + + uint32_t raw_val = 0; + if (value < 0) { + raw_val = -2 * value - 1; + value = max_value; + } else if (value >= max_value) { + raw_val = 2 * (value - max_value); + value = max_value; + } + + if (value == max_value) { + std::vector bypassBins; + bypassBins.reserve(20); + /* Determine the number of bypasses (in bypass_precision size) needed to + * encode the raw value. */ + int32_t n_bypass = 0; + while ((raw_val >> (n_bypass * bypass_precision)) != 0) { + ++n_bypass; + } + + /* Encode number of bypasses */ + int32_t val = n_bypass; + while (val >= max_bypass_val) { + bypassBins.push_back(max_bypass_val); + val -= max_bypass_val; + } + bypassBins.push_back(static_cast(val)); + + /* Encode raw value */ + for (int32_t j = 0; j < n_bypass; ++j) { + const int32_t val1 = (raw_val >> (j * bypass_precision)) & max_bypass_val; + bypassBins.push_back(static_cast(val1)); + } + + for (auto it = bypassBins.rbegin(); it < bypassBins.rend(); it++) { + RansEncPutBits(rans, ptr, *it); + } + } + RansEncPut(rans, ptr, ransSymbols[value].start, ransSymbols[value].range); +} + +void RansEncoderLib::encode_y(const std::shared_ptr> symbols, + const int cdf_group_index) +{ + PendingTask p; + p.workType = WorkType::EncodeDecodeY; + p.symbols_y = symbols; + p.cdf_group_index = cdf_group_index; + m_pendingEncodingList.push_back(p); +} + +void RansEncoderLib::encode_z(const std::shared_ptr> symbols, + const int cdf_group_index, const int start_offset, + const int per_channel_size) +{ + PendingTask p; + p.workType = WorkType::EncodeDecodeZ; + p.symbols_z = symbols; + p.cdf_group_index = cdf_group_index; + p.start_offset = start_offset; + p.per_channel_size = per_channel_size; + m_pendingEncodingList.push_back(p); +} +#include +FORCE_INLINE void RansEncoderLib::encode_y_internal(uint8_t*& ptr, RansState& rans, + const std::shared_ptr> symbols, + const int cdf_group_index) +{ + // backward loop on symbols from the end; + const int16_t* symbols_ptr = symbols->data(); + const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); + const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); + const int symbol_size = static_cast(symbols->size()); + + for (int i = symbol_size - 1; i >= 0; i--) { + const int32_t combined_symbol = symbols_ptr[i]; + const int32_t cdf_idx = combined_symbol & 0xff; + const int32_t s = combined_symbol >> 8; + encode_one_symbol(ptr, rans, s, cdfs_sizes_ptr[cdf_idx], offsets_ptr[cdf_idx], + _ransSymbols[cdf_group_index]->at(cdf_idx)); + } +} + +FORCE_INLINE void RansEncoderLib::encode_z_internal(uint8_t*& ptr, RansState& rans, + const std::shared_ptr> symbols, + const int cdf_group_index, const int start_offset, + const int per_channel_size) +{ + // backward loop on symbols from the end; + const int8_t* symbols_ptr = symbols->data(); + const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); + const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); + const int symbol_size = static_cast(symbols->size()); + + for (int i = symbol_size - 1; i >= 0; i--) { + const int32_t cdf_idx = i / per_channel_size + start_offset; + encode_one_symbol(ptr, rans, symbols_ptr[i], cdfs_sizes_ptr[cdf_idx], offsets_ptr[cdf_idx], + _ransSymbols[cdf_group_index]->at(cdf_idx)); + } +} + +void RansEncoderLib::flush() +{ + RansState rans; + RansEncInit(rans); + + int32_t total_symbol_size = 0; + for (auto it = m_pendingEncodingList.begin(); it != m_pendingEncodingList.end(); it++) { + if (it->workType == WorkType::EncodeDecodeY) { + total_symbol_size += static_cast(it->symbols_y->size()); + } else if (it->workType == WorkType::EncodeDecodeZ) { + total_symbol_size += static_cast(it->symbols_z->size()); + } + } + + if (total_symbol_size == 0) { + _stream->resize(0); + return; + } + + uint8_t* output = new uint8_t[total_symbol_size]; // too much space ? + uint8_t* ptrEnd = output + total_symbol_size; + uint8_t* ptr = ptrEnd; + assert(ptr != nullptr); + + for (auto it = m_pendingEncodingList.rbegin(); it != m_pendingEncodingList.rend(); it++) { + PendingTask p = *it; + if (p.workType == WorkType::EncodeDecodeY) { + encode_y_internal(ptr, rans, p.symbols_y, p.cdf_group_index); + } else if (p.workType == WorkType::EncodeDecodeZ) { + encode_z_internal(ptr, rans, p.symbols_z, p.cdf_group_index, p.start_offset, + p.per_channel_size); + } + } + + RansEncFlush(rans, ptr); + + const int nbytes = static_cast(std::distance(ptr, ptrEnd)); + + _stream->resize(nbytes); + memcpy(_stream->data(), ptr, nbytes); + delete[] output; +} + +std::shared_ptr> RansEncoderLib::get_encoded_stream() +{ + return _stream; +} + +void RansEncoderLib::reset() +{ + m_pendingEncodingList.clear(); + _stream->clear(); +} + +RansEncoderLibMultiThread::RansEncoderLibMultiThread() + : RansEncoderLib() + , m_finish(false) + , m_result_ready(false) +{ + m_thread = std::thread(&RansEncoderLibMultiThread::worker, this); +} +RansEncoderLibMultiThread::~RansEncoderLibMultiThread() +{ + { + std::lock_guard lk(m_mutex_pending); + std::lock_guard lk1(m_mutex_result); + m_finish = true; + } + m_cv_pending.notify_one(); + m_cv_result.notify_one(); + m_thread.join(); +} + +void RansEncoderLibMultiThread::flush() +{ + PendingTask p; + p.workType = WorkType::Flush; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push_back(p); + } + m_cv_pending.notify_one(); +} + +std::shared_ptr> RansEncoderLibMultiThread::get_encoded_stream() +{ + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + return RansEncoderLib::get_encoded_stream(); +} + +void RansEncoderLibMultiThread::reset() +{ + RansEncoderLib::reset(); + std::lock_guard lk(m_mutex_result); + m_result_ready = false; +} + +void RansEncoderLibMultiThread::worker() +{ + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending.size() > 0 || m_finish; }); + if (m_finish) { + lk.unlock(); + break; + } + if (m_pending.size() == 0) { + lk.unlock(); + // std::cout << "contine in worker" << std::endl; + continue; + } + while (m_pending.size() > 0) { + auto p = m_pending.front(); + m_pending.pop_front(); + lk.unlock(); + if (p.workType == WorkType::Flush) { + RansEncoderLib::flush(); + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + } + lk.lock(); + } + lk.unlock(); + } +} + +void RansDecoderLib::set_stream(const std::shared_ptr> encoded) +{ + _stream = encoded; + _ptr8 = (uint8_t*)(_stream->data()); + RansDecInit(_rans, _ptr8); +} + +int RansDecoderLib::add_cdf(const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets) +{ + _cdfs.push_back(cdfs); + _cdfs_sizes.push_back(cdfs_sizes); + _offsets.push_back(offsets); + return static_cast(_cdfs.size()) - 1; +} + +void RansDecoderLib::empty_cdf_buffer() +{ + _cdfs.clear(); + _cdfs_sizes.clear(); + _offsets.clear(); +} + +FORCE_INLINE int8_t RansDecoderLib::decode_one_symbol(const int32_t* cdf, const int32_t cdf_size, + const int32_t offset) +{ + const int32_t max_value = cdf_size - 2; + const int32_t cum_freq = static_cast(RansDecGet(_rans)); + + int s = 1; + while (cdf[s++] <= cum_freq) { + } + s -= 2; + + RansDecAdvance(_rans, _ptr8, cdf[s], cdf[s + 1] - cdf[s]); + + int32_t value = static_cast(s); + + if (value == max_value) { + /* Bypass decoding mode */ + int32_t val = RansDecGetBits(_rans, _ptr8); + int32_t n_bypass = val; + + while (val == max_bypass_val) { + val = RansDecGetBits(_rans, _ptr8); + n_bypass += val; + } + + int32_t raw_val = 0; + for (int j = 0; j < n_bypass; ++j) { + val = RansDecGetBits(_rans, _ptr8); + raw_val |= val << (j * bypass_precision); + } + value = raw_val >> 1; + if (raw_val & 1) { + value = -value - 1; + } else { + value += max_value; + } + } + + return static_cast(value + offset); +} + +void RansDecoderLib::decode_y(const std::shared_ptr> indexes, + const int cdf_group_index) +{ + int index_size = static_cast(indexes->size()); + m_decoded = std::make_shared>(index_size); + + int8_t* outout_ptr = m_decoded->data(); + const uint8_t* indexes_ptr = indexes->data(); + const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); + const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); + const auto& cdfs = _cdfs[cdf_group_index]; + for (int i = 0; i < index_size; ++i) { + const int32_t cdf_idx = indexes_ptr[i]; + outout_ptr[i] = decode_one_symbol(cdfs->at(cdf_idx).data(), cdfs_sizes_ptr[cdf_idx], + offsets_ptr[cdf_idx]); + } +} + +void RansDecoderLib::decode_z(const int total_size, const int cdf_group_index, + const int start_offset, const int per_channel_size) +{ + m_decoded = std::make_shared>(total_size); + + int8_t* outout_ptr = m_decoded->data(); + const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); + const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); + const auto& cdfs = _cdfs[cdf_group_index]; + for (int i = 0; i < total_size; ++i) { + const int32_t cdf_idx = i / per_channel_size + start_offset; + outout_ptr[i] = decode_one_symbol(cdfs->at(cdf_idx).data(), cdfs_sizes_ptr[cdf_idx], + offsets_ptr[cdf_idx]); + } +} + +std::shared_ptr> RansDecoderLib::get_decoded_tensor() +{ + return m_decoded; +} + +RansDecoderLibMultiThread::RansDecoderLibMultiThread() + : RansDecoderLib() + , m_finish(false) + , m_result_ready(false) +{ + m_thread = std::thread(&RansDecoderLibMultiThread::worker, this); +} + +RansDecoderLibMultiThread::~RansDecoderLibMultiThread() +{ + { + std::lock_guard lk(m_mutex_pending); + std::lock_guard lk1(m_mutex_result); + m_finish = true; + } + m_cv_pending.notify_one(); + m_cv_result.notify_one(); + m_thread.join(); +} + +void RansDecoderLibMultiThread::decode_y(const std::shared_ptr> indexes, + const int cdf_group_index) +{ + { + std::lock_guard lk(m_mutex_result); + m_result_ready = false; + } + PendingTask p; + p.workType = WorkType::EncodeDecodeY; + p.indexes = indexes; + p.cdf_group_index = cdf_group_index; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push_back(p); + } + m_cv_pending.notify_one(); +} + +void RansDecoderLibMultiThread::decode_z(const int total_size, const int cdf_group_index, + const int start_offset, const int per_channel_size) +{ + { + std::lock_guard lk(m_mutex_result); + m_result_ready = false; + } + PendingTask p; + p.workType = WorkType::EncodeDecodeZ; + p.total_size = total_size; + p.cdf_group_index = cdf_group_index; + p.start_offset = start_offset; + p.per_channel_size = per_channel_size; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push_back(p); + } + m_cv_pending.notify_one(); +} + +std::shared_ptr> RansDecoderLibMultiThread::get_decoded_tensor() +{ + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + return RansDecoderLib::get_decoded_tensor(); +} + +void RansDecoderLibMultiThread::worker() +{ + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending.size() > 0 || m_finish; }); + if (m_finish) { + lk.unlock(); + break; + } + if (m_pending.size() == 0) { + lk.unlock(); + // std::cout << "contine in worker" << std::endl; + continue; + } + while (m_pending.size() > 0) { + auto p = m_pending.front(); + m_pending.pop_front(); + lk.unlock(); + if (p.workType == WorkType::EncodeDecodeY) { + RansDecoderLib::decode_y(p.indexes, p.cdf_group_index); + } else if (p.workType == WorkType::EncodeDecodeZ) { + RansDecoderLib::decode_z(p.total_size, p.cdf_group_index, p.start_offset, + p.per_channel_size); + } + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + lk.lock(); + } + lk.unlock(); + } +} diff --git a/DCVC-family/DCVC-RT/src/cpp/py_rans/rans.h b/DCVC-family/DCVC-RT/src/cpp/py_rans/rans.h new file mode 100644 index 0000000..995dfee --- /dev/null +++ b/DCVC-family/DCVC-RT/src/cpp/py_rans/rans.h @@ -0,0 +1,201 @@ +/* Copyright 2020 InterDigital Communications, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include + +#ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" + #pragma GCC diagnostic ignored "-Wsign-compare" +#endif + +#ifdef _MSC_VER + #pragma warning(disable : 4244) +#endif + +#include "rans_byte.h" + +#ifdef _MSC_VER + #pragma warning(default : 4244) +#endif + +#ifdef __GNUC__ + #pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER + #define FORCE_INLINE __forceinline +#endif + +#ifdef __GNUC__ + #define FORCE_INLINE __attribute__((always_inline)) inline +#endif + +struct RansSymbol { + uint16_t start; + uint16_t range; // range for normal coding and 0 for bypass coding +}; + +enum class WorkType { + EncodeDecodeY, + EncodeDecodeZ, + Flush, +}; + +struct PendingTask { + WorkType workType; + std::shared_ptr> symbols_y; + std::shared_ptr> symbols_z; + std::shared_ptr> indexes; + int total_size{ 0 }; + int cdf_group_index{ 0 }; + int start_offset{ 0 }; + int per_channel_size{ 0 }; +}; + +/* NOTE: Warning, we buffer everything for now... In case of large files we + * should split the bitstream into chunks... Or for a memory-bounded encoder + **/ +class RansEncoderLib { +public: + RansEncoderLib(); + virtual ~RansEncoderLib() = default; + + RansEncoderLib(const RansEncoderLib&) = delete; + RansEncoderLib(RansEncoderLib&&) = delete; + RansEncoderLib& operator=(const RansEncoderLib&) = delete; + RansEncoderLib& operator=(RansEncoderLib&&) = delete; + + void encode_y(const std::shared_ptr> symbols, const int cdf_group_index); + void encode_z(const std::shared_ptr> symbols, const int cdf_group_index, + const int start_offset, const int per_channel_size); + + FORCE_INLINE void encode_y_internal(uint8_t*& ptr, RansState& rans, + const std::shared_ptr> symbols, + const int cdf_group_index); + FORCE_INLINE void encode_z_internal(uint8_t*& ptr, RansState& rans, + const std::shared_ptr> symbols, + const int cdf_group_index, const int start_offset, + const int per_channel_size); + FORCE_INLINE void encode_one_symbol(uint8_t*& ptr, RansState& rans, const int32_t symbol, + const int32_t cdf_size, const int32_t offset, + const std::vector& ransSymbols); + virtual void flush(); + virtual std::shared_ptr> get_encoded_stream(); + virtual void reset(); + virtual int add_cdf(const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets); + virtual void empty_cdf_buffer(); + +private: + std::shared_ptr> _stream; + + std::vector>>> _ransSymbols; + std::vector>> _cdfs_sizes; + std::vector>> _offsets; + + std::list m_pendingEncodingList; +}; + +class RansEncoderLibMultiThread : public RansEncoderLib { +public: + RansEncoderLibMultiThread(); + virtual ~RansEncoderLibMultiThread(); + virtual void flush() override; + virtual std::shared_ptr> get_encoded_stream() override; + virtual void reset() override; + + void worker(); + +private: + bool m_finish; + bool m_result_ready; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + std::list m_pending; +}; + +class RansDecoderLib { +public: + RansDecoderLib() {} + virtual ~RansDecoderLib() = default; + + RansDecoderLib(const RansDecoderLib&) = delete; + RansDecoderLib(RansDecoderLib&&) = delete; + RansDecoderLib& operator=(const RansDecoderLib&) = delete; + RansDecoderLib& operator=(RansDecoderLib&&) = delete; + + virtual void set_stream(const std::shared_ptr> encoded); + + FORCE_INLINE int8_t decode_one_symbol(const int32_t* cdf, const int32_t cdf_size, + const int32_t offset); + + virtual void decode_y(const std::shared_ptr> indexes, + const int cdf_group_index); + virtual void decode_z(const int total_size, const int cdf_group_index, const int start_offset, + const int per_channel_size); + + virtual std::shared_ptr> get_decoded_tensor(); + + virtual int add_cdf(const std::shared_ptr>> cdfs, + const std::shared_ptr> cdfs_sizes, + const std::shared_ptr> offsets); + virtual void empty_cdf_buffer(); + +private: + RansState _rans; + uint8_t* _ptr8; + std::shared_ptr> _stream; + std::shared_ptr> m_decoded; + + std::vector>>> _cdfs; + std::vector>> _cdfs_sizes; + std::vector>> _offsets; +}; + +class RansDecoderLibMultiThread : public RansDecoderLib { +public: + RansDecoderLibMultiThread(); + virtual ~RansDecoderLibMultiThread(); + + virtual void decode_y(const std::shared_ptr> indexes, + const int cdf_group_index) override; + + virtual void decode_z(const int total_size, const int cdf_group_index, const int start_offset, + const int per_channel_size) override; + + virtual std::shared_ptr> get_decoded_tensor() override; + + void worker(); + +private: + bool m_finish; + bool m_result_ready; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + std::list m_pending; +}; \ No newline at end of file diff --git a/src/cpp/py_rans/rans_byte.h b/DCVC-family/DCVC-RT/src/cpp/py_rans/rans_byte.h similarity index 100% rename from src/cpp/py_rans/rans_byte.h rename to DCVC-family/DCVC-RT/src/cpp/py_rans/rans_byte.h diff --git a/DCVC-family/DCVC-RT/src/cpp/setup.py b/DCVC-family/DCVC-RT/src/cpp/setup.py new file mode 100644 index 0000000..7e1b036 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/cpp/setup.py @@ -0,0 +1,31 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import glob +import sys +from setuptools import setup +from pybind11.setup_helpers import Pybind11Extension, build_ext + + +if sys.platform == "win32": + extra_compile_args = ['/std:c++17', '/O2', '/W4', '/WX', '/wd4100'] + extra_link_args = [] +else: + extra_compile_args = ['-std=c++17', '-O3', '-fPIC', '-Wall', '-Wextra', '-Werror'] + extra_link_args = [] + + +setup( + name="MLCodec_extensions_cpp", + ext_modules=[ + Pybind11Extension( + name='MLCodec_extensions_cpp', + sources=glob.glob('py_rans/*.cpp'), + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args, + ), + ], + cmdclass={"build_ext": build_ext}, + zip_safe=False, + python_requires=">=3.12", +) diff --git a/src/layers/cuda_inference.py b/DCVC-family/DCVC-RT/src/layers/cuda_inference.py similarity index 100% rename from src/layers/cuda_inference.py rename to DCVC-family/DCVC-RT/src/layers/cuda_inference.py diff --git a/DCVC-family/DCVC-RT/src/layers/extensions/inference/bind.cpp b/DCVC-family/DCVC-RT/src/layers/extensions/inference/bind.cpp new file mode 100644 index 0000000..0bc8e24 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/layers/extensions/inference/bind.cpp @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "def.h" +#include + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ + m.def("process_with_mask_cuda", &process_with_mask_cuda); + m.def("combine_for_reading_2x_cuda", &combine_for_reading_2x_cuda); + m.def("restore_y_2x_cuda", &restore_y_2x_cuda); + m.def("restore_y_4x_cuda", &restore_y_4x_cuda); + m.def("build_index_dec_cuda", &build_index_dec_cuda); + m.def("build_index_enc_cuda", &build_index_enc_cuda); + m.def("bias_quant_cuda", &bias_quant_cuda); + m.def("round_and_to_int8_cuda", &round_and_to_int8_cuda); + m.def("clamp_reciprocal_with_quant_cuda", &clamp_reciprocal_with_quant_cuda); + m.def("add_and_multiply_cuda", &add_and_multiply_cuda); + m.def("bias_pixel_shuffle_8_cuda", &bias_pixel_shuffle_8_cuda); + m.def("replicate_pad_cuda", &replicate_pad_cuda); + m.def("bias_wsilu_depthwise_conv2d_cuda", &bias_wsilu_depthwise_conv2d_cuda); + + py::class_(m, "DepthConvProxy") + .def(py::init<>()) + .def("set_param", &DepthConvProxy::set_param) + .def("set_param_with_adaptor", &DepthConvProxy::set_param_with_adaptor) + .def("forward", &DepthConvProxy::forward) + .def("forward_with_quant_step", &DepthConvProxy::forward_with_quant_step) + .def("forward_with_cat", &DepthConvProxy::forward_with_cat); + + py::class_(m, "SubpelConv2xProxy") + .def(py::init<>()) + .def("set_param", &SubpelConv2xProxy::set_param) + .def("forward", &SubpelConv2xProxy::forward) + .def("forward_with_cat", &SubpelConv2xProxy::forward_with_cat); +} diff --git a/src/layers/extensions/inference/common.h b/DCVC-family/DCVC-RT/src/layers/extensions/inference/common.h similarity index 100% rename from src/layers/extensions/inference/common.h rename to DCVC-family/DCVC-RT/src/layers/extensions/inference/common.h diff --git a/src/layers/extensions/inference/def.h b/DCVC-family/DCVC-RT/src/layers/extensions/inference/def.h similarity index 100% rename from src/layers/extensions/inference/def.h rename to DCVC-family/DCVC-RT/src/layers/extensions/inference/def.h diff --git a/src/layers/extensions/inference/impl.cpp b/DCVC-family/DCVC-RT/src/layers/extensions/inference/impl.cpp similarity index 100% rename from src/layers/extensions/inference/impl.cpp rename to DCVC-family/DCVC-RT/src/layers/extensions/inference/impl.cpp diff --git a/src/layers/extensions/inference/kernel.cu b/DCVC-family/DCVC-RT/src/layers/extensions/inference/kernel.cu similarity index 100% rename from src/layers/extensions/inference/kernel.cu rename to DCVC-family/DCVC-RT/src/layers/extensions/inference/kernel.cu diff --git a/DCVC-family/DCVC-RT/src/layers/extensions/inference/setup.py b/DCVC-family/DCVC-RT/src/layers/extensions/inference/setup.py new file mode 100644 index 0000000..6a25fd5 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/layers/extensions/inference/setup.py @@ -0,0 +1,32 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import glob +import sys +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + + +cxx_flags = ["-O3"] +nvcc_flags = ["-O3", "--use_fast_math", "--extra-device-vectorization", "-arch=native"] +if sys.platform == 'win32': + cxx_flags = ["/O2"] + + +setup( + name='inference_extensions_cuda', + ext_modules=[ + CUDAExtension( + name='inference_extensions_cuda', + sources=glob.glob('*.cpp') + glob.glob('*.cu'), + extra_compile_args={ + "cxx": cxx_flags, + "nvcc": nvcc_flags, + }, + ), + ], + cmdclass={ + 'build_ext': BuildExtension + } +) diff --git a/DCVC-family/DCVC-RT/src/layers/layers.py b/DCVC-family/DCVC-RT/src/layers/layers.py new file mode 100644 index 0000000..a51e93d --- /dev/null +++ b/DCVC-family/DCVC-RT/src/layers/layers.py @@ -0,0 +1,156 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import torch +from torch import nn +from .cuda_inference import CUSTOMIZED_CUDA_INFERENCE +if CUSTOMIZED_CUDA_INFERENCE: + from .cuda_inference import DepthConvProxy, SubpelConv2xProxy + + +class WSiLU(nn.Module): + def __init__(self): + super().__init__() + + def forward(self, x): + return torch.sigmoid(4.0 * x) * x + + +class WSiLUChunkAdd(nn.Module): + def __init__(self): + super().__init__() + self.silu = WSiLU() + + def forward(self, x): + x1, x2 = self.silu(x).chunk(2, 1) + return x1 + x2 + + +class SubpelConv2x(nn.Module): + def __init__(self, in_ch, out_ch, kernel_size, padding=0): + super().__init__() + self.conv = nn.Sequential( + nn.Conv2d(in_ch, out_ch * 4, kernel_size=kernel_size, padding=padding), + nn.PixelShuffle(2), + ) + self.padding = padding + + self.proxy = None + + def forward(self, x, to_cat=None, cat_at_front=True): + if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: + return self.forward_torch(x, to_cat, cat_at_front) + + return self.forward_cuda(x, to_cat, cat_at_front) + + def forward_torch(self, x, to_cat=None, cat_at_front=True): + out = self.conv(x) + if to_cat is None: + return out + if cat_at_front: + return torch.cat((to_cat, out), dim=1) + return torch.cat((out, to_cat), dim=1) + + def forward_cuda(self, x, to_cat=None, cat_at_front=True): + if self.proxy is None: + self.proxy = SubpelConv2xProxy() + self.proxy.set_param(self.conv[0].weight, self.conv[0].bias, self.padding) + + if to_cat is None: + return self.proxy.forward(x) + + return self.proxy.forward_with_cat(x, to_cat, cat_at_front) + + +class DepthConvBlock(nn.Module): + def __init__(self, in_ch, out_ch, shortcut=False, force_adaptor=False): + super().__init__() + self.adaptor = None + if in_ch != out_ch or force_adaptor: + self.adaptor = nn.Conv2d(in_ch, out_ch, 1) + self.shortcut = shortcut + self.dc = nn.Sequential( + nn.Conv2d(out_ch, out_ch, 1), + WSiLU(), + nn.Conv2d(out_ch, out_ch, 3, padding=1, groups=out_ch), + nn.Conv2d(out_ch, out_ch, 1), + ) + self.ffn = nn.Sequential( + nn.Conv2d(out_ch, out_ch * 4, 1), + WSiLUChunkAdd(), + nn.Conv2d(out_ch * 2, out_ch, 1), + ) + + self.proxy = None + + def forward(self, x, quant_step=None, to_cat=None, cat_at_front=True): + if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: + return self.forward_torch(x, quant_step, to_cat, cat_at_front) + + return self.forward_cuda(x, quant_step, to_cat, cat_at_front) + + def forward_torch(self, x, quant_step=None, to_cat=None, cat_at_front=True): + if self.adaptor is not None: + x = self.adaptor(x) + out = self.dc(x) + x + out = self.ffn(out) + out + if self.shortcut: + out = out + x + if quant_step is not None: + out = out * quant_step + if to_cat is not None: + if cat_at_front: + out = torch.cat((to_cat, out), dim=1) + else: + out = torch.cat((out, to_cat), dim=1) + return out + + def forward_cuda(self, x, quant_step=None, to_cat=None, cat_at_front=True): + if self.proxy is None: + self.proxy = DepthConvProxy() + if self.adaptor is not None: + self.proxy.set_param_with_adaptor(self.dc[0].weight, self.dc[0].bias, + self.dc[2].weight, self.dc[2].bias, + self.dc[3].weight, self.dc[3].bias, + self.ffn[0].weight, self.ffn[0].bias, + self.ffn[2].weight, self.ffn[2].bias, + self.adaptor.weight, self.adaptor.bias, + self.shortcut) + else: + self.proxy.set_param(self.dc[0].weight, self.dc[0].bias, + self.dc[2].weight, self.dc[2].bias, + self.dc[3].weight, self.dc[3].bias, + self.ffn[0].weight, self.ffn[0].bias, + self.ffn[2].weight, self.ffn[2].bias, + self.shortcut) + + if quant_step is not None: + return self.proxy.forward_with_quant_step(x, quant_step) + if to_cat is not None: + return self.proxy.forward_with_cat(x, to_cat, cat_at_front) + + return self.proxy.forward(x) + + +class ResidualBlockWithStride2(nn.Module): + def __init__(self, in_ch, out_ch): + super().__init__() + self.down = nn.Conv2d(in_ch, out_ch, 2, stride=2) + self.conv = DepthConvBlock(out_ch, out_ch, shortcut=True) + + def forward(self, x): + x = self.down(x) + out = self.conv(x) + return out + + +class ResidualBlockUpsample(nn.Module): + def __init__(self, in_ch, out_ch): + super().__init__() + self.up = SubpelConv2x(in_ch, out_ch, 1) + self.conv = DepthConvBlock(out_ch, out_ch, shortcut=True) + + def forward(self, x): + out = self.up(x) + out = self.conv(out) + return out diff --git a/DCVC-family/DCVC-RT/src/models/common_model.py b/DCVC-family/DCVC-RT/src/models/common_model.py new file mode 100644 index 0000000..dc18b65 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/models/common_model.py @@ -0,0 +1,296 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import torch +from torch import nn + +from ..layers.cuda_inference import combine_for_reading_2x, \ + restore_y_2x, restore_y_2x_with_cat_after, add_and_multiply, \ + replicate_pad, restore_y_4x, clamp_reciprocal_with_quant +from .entropy_models import BitEstimator, GaussianEncoder, EntropyCoder + + +class CompressionModel(nn.Module): + def __init__(self, z_channel, extra_qp=0): + super().__init__() + + self.z_channel = z_channel + self.entropy_coder = None + self.bit_estimator_z = BitEstimator(64 + extra_qp, z_channel) + self.gaussian_encoder = GaussianEncoder() + + self.masks = {} + self.cuda_streams = {} + + def get_cuda_stream(self, device, idx=0, priority=0): + key = f"{device}_{priority}_{idx}" + if key not in self.cuda_streams: + self.cuda_streams[key] = torch.cuda.Stream(device, priority=priority) + return self.cuda_streams[key] + + @staticmethod + def get_qp_num(): + return 64 + + @staticmethod + def get_padding_size(height, width, p=64): + new_h = (height + p - 1) // p * p + new_w = (width + p - 1) // p * p + padding_right = new_w - width + padding_bottom = new_h - height + return padding_right, padding_bottom + + @staticmethod + def get_downsampled_shape(height, width, p): + new_h = (height + p - 1) // p * p + new_w = (width + p - 1) // p * p + return int(new_h / p + 0.5), int(new_w / p + 0.5) + + def update(self, force_zero_thres=None): + self.entropy_coder = EntropyCoder() + self.gaussian_encoder.update(self.entropy_coder, force_zero_thres=force_zero_thres) + self.bit_estimator_z.update(self.entropy_coder) + + def set_use_two_entropy_coders(self, use_two_entropy_coders): + self.entropy_coder.set_use_two_entropy_coders(use_two_entropy_coders) + + def pad_for_y(self, y): + _, _, H, W = y.size() + padding_r, padding_b = self.get_padding_size(H, W, 4) + y_pad = replicate_pad(y, padding_b, padding_r) + return y_pad + + def separate_prior(self, params, is_video=False): + if is_video: + quant_step, scales, means = params.chunk(3, 1) + quant_step = torch.clamp_min(quant_step, 0.5) + q_enc = 1. / quant_step + q_dec = quant_step + else: + q = params[:, :2, :, :] + q_enc, q_dec = (torch.sigmoid(q) * 1.5 + 0.5).chunk(2, 1) + scales, means = params[:, 2:, :, :].chunk(2, 1) + return q_enc, q_dec, scales, means + + @staticmethod + def separate_prior_for_video_encoding(params, y): + q_dec, scales, means = params.chunk(3, 1) + q_dec, y = clamp_reciprocal_with_quant(q_dec, y, 0.5) + return y, q_dec, scales, means + + @staticmethod + def separate_prior_for_video_decoding(params): + quant_step, scales, means = params.chunk(3, 1) + quant_step = torch.clamp_min(quant_step, 0.5) + return quant_step, scales, means + + def process_with_mask(self, y, scales, means, mask): + return self.gaussian_encoder.process_with_mask(y, scales, means, mask) + + @staticmethod + def get_one_mask(micro_mask, height, width, dtype, device): + mask = torch.tensor(micro_mask, dtype=dtype, device=device) + mask = mask.repeat((height + 1) // 2, (width + 1) // 2) + mask = mask[:height, :width] + mask = torch.unsqueeze(mask, 0) + mask = torch.unsqueeze(mask, 0) + return mask + + def get_mask_4x(self, batch, channel, height, width, dtype, device): + curr_mask_str = f"{batch}_{channel}_{width}_{height}_4x" + with torch.no_grad(): + if curr_mask_str not in self.masks: + assert channel % 4 == 0 + m = torch.ones((batch, channel // 4, height, width), dtype=dtype, device=device) + m0 = self.get_one_mask(((1, 0), (0, 0)), height, width, dtype, device) + m1 = self.get_one_mask(((0, 1), (0, 0)), height, width, dtype, device) + m2 = self.get_one_mask(((0, 0), (1, 0)), height, width, dtype, device) + m3 = self.get_one_mask(((0, 0), (0, 1)), height, width, dtype, device) + + mask_0 = torch.cat((m * m0, m * m1, m * m2, m * m3), dim=1) + mask_1 = torch.cat((m * m3, m * m2, m * m1, m * m0), dim=1) + mask_2 = torch.cat((m * m2, m * m3, m * m0, m * m1), dim=1) + mask_3 = torch.cat((m * m1, m * m0, m * m3, m * m2), dim=1) + + self.masks[curr_mask_str] = [mask_0, mask_1, mask_2, mask_3] + return self.masks[curr_mask_str] + + def get_mask_2x(self, batch, channel, height, width, dtype, device): + curr_mask_str = f"{batch}_{channel}_{width}_{height}_2x" + with torch.no_grad(): + if curr_mask_str not in self.masks: + assert channel % 2 == 0 + m = torch.ones((batch, channel // 2, height, width), dtype=dtype, device=device) + m0 = self.get_one_mask(((1, 0), (0, 1)), height, width, dtype, device) + m1 = self.get_one_mask(((0, 1), (1, 0)), height, width, dtype, device) + + mask_0 = torch.cat((m * m0, m * m1), dim=1) + mask_1 = torch.cat((m * m1, m * m0), dim=1) + + self.masks[curr_mask_str] = [mask_0, mask_1] + return self.masks[curr_mask_str] + + @staticmethod + def single_part_for_writing_4x(x): + x0, x1, x2, x3 = x.chunk(4, 1) + return (x0 + x1) + (x2 + x3) + + @staticmethod + def single_part_for_writing_2x(x): + x0, x1 = x.chunk(2, 1) + return x0 + x1 + + def compress_prior_2x(self, y, common_params, y_spatial_prior): + y, q_dec, scales, means = self.separate_prior_for_video_encoding(common_params, y) + dtype = y.dtype + device = y.device + B, C, H, W = y.size() + mask_0, mask_1 = self.get_mask_2x(B, C, H, W, dtype, device) + + _, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) + cat_params = torch.cat((y_hat_0, common_params), dim=1) + scales, means = y_spatial_prior(cat_params).chunk(2, 1) + _, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) + + y_hat = add_and_multiply(y_hat_0, y_hat_1, q_dec) + + y_q_w_0 = self.single_part_for_writing_2x(y_q_0) + y_q_w_1 = self.single_part_for_writing_2x(y_q_1) + s_w_0 = self.single_part_for_writing_2x(s_hat_0) + s_w_1 = self.single_part_for_writing_2x(s_hat_1) + return y_q_w_0, y_q_w_1, s_w_0, s_w_1, y_hat + + def decompress_prior_2x(self, common_params, y_spatial_prior): + infos = self.decompress_prior_2x_part1(common_params) + y_hat = self.decompress_prior_2x_part2(common_params, y_spatial_prior, infos) + return y_hat + + def decompress_prior_2x_part1(self, common_params): + q_dec, scales, means = self.separate_prior_for_video_decoding(common_params) + dtype = means.dtype + device = means.device + B, C, H, W = means.size() + mask_0, mask_1 = self.get_mask_2x(B, C, H, W, dtype, device) + + scales_r = combine_for_reading_2x(scales, mask_0, inplace=False) + indexes, skip_cond = self.gaussian_encoder.build_indexes_decoder(scales_r) + self.gaussian_encoder.decode_y(indexes) + infos = { + "q_dec": q_dec, + "mask_0": mask_0, + "mask_1": mask_1, + "means": means, + "scales_r": scales_r, + "skip_cond": skip_cond, + "indexes": indexes, + } + return infos + + def decompress_prior_2x_part2(self, common_params, y_spatial_prior, infos): + dtype = common_params.dtype + device = common_params.device + y_q_r = self.gaussian_encoder.get_y(infos["scales_r"].shape, + infos["scales_r"].numel(), + dtype, device, + infos["skip_cond"], infos["indexes"]) + y_hat_0, cat_params = restore_y_2x_with_cat_after(y_q_r, infos["means"], infos["mask_0"], + common_params) + scales, means = y_spatial_prior(cat_params).chunk(2, 1) + scales_r = combine_for_reading_2x(scales, infos["mask_1"], inplace=True) + y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) + y_hat_1 = restore_y_2x(y_q_r, means, infos["mask_1"]) + + y_hat = add_and_multiply(y_hat_0, y_hat_1, infos["q_dec"]) + return y_hat + + def compress_prior_4x(self, y, common_params, y_spatial_prior_reduction, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior): + ''' + y_0 means split in channel, the 0/4 quater + y_1 means split in channel, the 1/4 quater + y_2 means split in channel, the 2/4 quater + y_3 means split in channel, the 3/4 quater + y_?_0, means multiply with mask_0 + y_?_1, means multiply with mask_1 + y_?_2, means multiply with mask_2 + y_?_3, means multiply with mask_3 + ''' + q_enc, q_dec, scales, means = self.separate_prior(common_params, False) + common_params = y_spatial_prior_reduction(common_params) + dtype = y.dtype + device = y.device + B, C, H, W = y.size() + mask_0, mask_1, mask_2, mask_3 = self.get_mask_4x(B, C, H, W, dtype, device) + + y = y * q_enc + + _, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) + + y_hat_so_far = y_hat_0 + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) + _, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) + + y_hat_so_far = y_hat_so_far + y_hat_1 + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) + _, y_q_2, y_hat_2, s_hat_2 = self.process_with_mask(y, scales, means, mask_2) + + y_hat_so_far = y_hat_so_far + y_hat_2 + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) + _, y_q_3, y_hat_3, s_hat_3 = self.process_with_mask(y, scales, means, mask_3) + + y_hat = y_hat_so_far + y_hat_3 + y_hat = y_hat * q_dec + + y_q_w_0 = self.single_part_for_writing_4x(y_q_0) + y_q_w_1 = self.single_part_for_writing_4x(y_q_1) + y_q_w_2 = self.single_part_for_writing_4x(y_q_2) + y_q_w_3 = self.single_part_for_writing_4x(y_q_3) + s_w_0 = self.single_part_for_writing_4x(s_hat_0) + s_w_1 = self.single_part_for_writing_4x(s_hat_1) + s_w_2 = self.single_part_for_writing_4x(s_hat_2) + s_w_3 = self.single_part_for_writing_4x(s_hat_3) + return y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, s_w_0, s_w_1, s_w_2, s_w_3, y_hat + + def decompress_prior_4x(self, common_params, y_spatial_prior_reduction, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior): + _, quant_step, scales, means = self.separate_prior(common_params, False) + common_params = y_spatial_prior_reduction(common_params) + dtype = means.dtype + device = means.device + B, C, H, W = means.size() + mask_0, mask_1, mask_2, mask_3 = self.get_mask_4x(B, C, H, W, dtype, device) + + scales_r = self.single_part_for_writing_4x(scales * mask_0) + y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) + y_hat_curr_step = restore_y_4x(y_q_r, means, mask_0) + y_hat_so_far = y_hat_curr_step + + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) + scales_r = self.single_part_for_writing_4x(scales * mask_1) + y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) + y_hat_curr_step = restore_y_4x(y_q_r, means, mask_1) + y_hat_so_far = y_hat_so_far + y_hat_curr_step + + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) + scales_r = self.single_part_for_writing_4x(scales * mask_2) + y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) + y_hat_curr_step = restore_y_4x(y_q_r, means, mask_2) + y_hat_so_far = y_hat_so_far + y_hat_curr_step + + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) + scales_r = self.single_part_for_writing_4x(scales * mask_3) + y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) + y_hat_curr_step = restore_y_4x(y_q_r, means, mask_3) + y_hat_so_far = y_hat_so_far + y_hat_curr_step + + y_hat = y_hat_so_far * quant_step + + return y_hat diff --git a/DCVC-family/DCVC-RT/src/models/entropy_models.py b/DCVC-family/DCVC-RT/src/models/entropy_models.py new file mode 100644 index 0000000..9b64d28 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/models/entropy_models.py @@ -0,0 +1,341 @@ +import math + +import torch +import numpy as np +from torch import nn +import torch.nn.functional as F + +from ..layers.cuda_inference import build_index_dec, build_index_enc, process_with_mask + + +class EntropyCoder(): + def __init__(self): + super().__init__() + + from MLCodec_extensions_cpp import RansEncoder, RansDecoder + self.encoder = RansEncoder() + self.decoder = RansDecoder() + + @staticmethod + def pmf_to_quantized_cdf(pmf, precision=16): + from MLCodec_extensions_cpp import pmf_to_quantized_cdf as _pmf_to_cdf + cdf = _pmf_to_cdf(pmf.tolist(), precision) + cdf = torch.IntTensor(cdf) + return cdf + + @staticmethod + def pmf_to_cdf(pmf, tail_mass, pmf_length, max_length): + entropy_coder_precision = 16 + cdf = torch.zeros((len(pmf_length), max_length + 2), dtype=torch.int32) + for i, p in enumerate(pmf): + prob = torch.cat((p[: pmf_length[i]], tail_mass[i]), dim=0) + _cdf = EntropyCoder.pmf_to_quantized_cdf(prob, entropy_coder_precision) + cdf[i, : _cdf.size(0)] = _cdf + return cdf + + def reset(self): + self.encoder.reset() + + def add_cdf(self, cdf, cdf_length, offset): + enc_cdf_idx = self.encoder.add_cdf(cdf, cdf_length, offset) + dec_cdf_idx = self.decoder.add_cdf(cdf, cdf_length, offset) + assert enc_cdf_idx == dec_cdf_idx + return enc_cdf_idx + + def encode_y(self, symbols, cdf_group_index): + # symbols: int16, high 8 bits: int8 symbol to be encoded; low 8 bits: uint8 index to use + assert symbols.dtype == torch.int16 + self.encoder.encode_y(symbols.cpu().numpy(), cdf_group_index) + + def encode_z(self, symbols, cdf_group_index, start_offset, per_channel_size): + self.encoder.encode_z(symbols.to(torch.int8).cpu().numpy(), + cdf_group_index, start_offset, per_channel_size) + + def flush(self): + self.encoder.flush() + + def get_encoded_stream(self): + return self.encoder.get_encoded_stream().tobytes() + + def set_stream(self, stream): + self.decoder.set_stream((np.frombuffer(stream, dtype=np.uint8))) + + def decode_y(self, indexes, cdf_group_index): + self.decoder.decode_y(indexes.to(torch.uint8).cpu().numpy(), cdf_group_index) + + def decode_and_get_y(self, indexes, cdf_group_index, device, dtype): + rv = self.decoder.decode_and_get_y(indexes.to(torch.uint8).cpu().numpy(), cdf_group_index) + rv = torch.as_tensor(rv) + return rv.to(device).to(dtype) + + def decode_z(self, total_size, cdf_group_index, start_offset, per_channel_size): + self.decoder.decode_z(total_size, cdf_group_index, start_offset, per_channel_size) + + def get_decoded_tensor(self, device, dtype, non_blocking=False): + rv = self.decoder.get_decoded_tensor() + rv = torch.as_tensor(rv) + return rv.to(device, non_blocking=non_blocking).to(dtype) + + def set_use_two_entropy_coders(self, use_two_entropy_coders): + self.encoder.set_use_two_encoders(use_two_entropy_coders) + self.decoder.set_use_two_decoders(use_two_entropy_coders) + + +class Bitparm(nn.Module): + def __init__(self, qp_num, channel, final=False): + super().__init__() + self.final = final + self.h = nn.Parameter(torch.nn.init.normal_( + torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) + self.b = nn.Parameter(torch.nn.init.normal_( + torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) + if not final: + self.a = nn.Parameter(torch.nn.init.normal_( + torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) + else: + self.a = None + + def forward(self, x, index): + h = torch.index_select(self.h, 0, index) + b = torch.index_select(self.b, 0, index) + x = x * F.softplus(h) + b + if self.final: + return x + + a = torch.index_select(self.a, 0, index) + return x + torch.tanh(x) * torch.tanh(a) + + +class AEHelper(): + def __init__(self): + super().__init__() + self.entropy_coder = None + self.cdf_group_index = None + self._offset = None + self._quantized_cdf = None + self._cdf_length = None + + def set_cdf_info(self, quantized_cdf, cdf_length, offset): + self._quantized_cdf = quantized_cdf.cpu().numpy() + self._cdf_length = cdf_length.reshape(-1).int().cpu().numpy() + self._offset = offset.reshape(-1).int().cpu().numpy() + + def get_cdf_info(self): + return self._quantized_cdf, \ + self._cdf_length, \ + self._offset + + +class BitEstimator(AEHelper, nn.Module): + def __init__(self, qp_num, channel): + super().__init__() + self.f1 = Bitparm(qp_num, channel) + self.f2 = Bitparm(qp_num, channel) + self.f3 = Bitparm(qp_num, channel) + self.f4 = Bitparm(qp_num, channel, True) + self.qp_num = qp_num + self.channel = channel + + def forward(self, x, index): + return self.get_cdf(x, index) + + def get_logits_cdf(self, x, index): + x = self.f1(x, index) + x = self.f2(x, index) + x = self.f3(x, index) + x = self.f4(x, index) + return x + + def get_cdf(self, x, index): + return torch.sigmoid(self.get_logits_cdf(x, index)) + + def update(self, entropy_coder): + self.entropy_coder = entropy_coder + + with torch.no_grad(): + device = next(self.parameters()).device + medians = torch.zeros((self.qp_num, self.channel, 1, 1), device=device) + index = torch.arange(self.qp_num, device=device, dtype=torch.int32) + + minima = medians + 8 + for i in range(8, 1, -1): + samples = torch.zeros_like(medians) - i + probs = self.forward(samples, index) + minima = torch.where(probs < torch.zeros_like(medians) + 0.0001, + torch.zeros_like(medians) + i, minima) + + maxima = medians + 8 + for i in range(8, 1, -1): + samples = torch.zeros_like(medians) + i + probs = self.forward(samples, index) + maxima = torch.where(probs > torch.zeros_like(medians) + 0.9999, + torch.zeros_like(medians) + i, maxima) + + minima = minima.int() + maxima = maxima.int() + + offset = -minima + + pmf_start = medians - minima + pmf_length = maxima + minima + 1 + + max_length = pmf_length.max() + device = pmf_start.device + samples = torch.arange(max_length, device=device) + + samples = samples[None, None, None, :] + pmf_start + + half = float(0.5) + + lower = self.forward(samples - half, index) + upper = self.forward(samples + half, index) + pmf = upper - lower + + pmf = pmf[:, :, 0, :] + upper = self.forward(maxima.to(torch.float32), index) + tail_mass = lower[:, :, 0, :1] + (1.0 - upper[:, :, 0, -1:]) + + pmf = pmf.reshape([-1, max_length]) + tail_mass = tail_mass.reshape([-1, 1]) + pmf_length = pmf_length.reshape([-1]) + offset = offset.reshape([-1]) + quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) + cdf_length = pmf_length + 2 + self.set_cdf_info(quantized_cdf, cdf_length, offset) + self.cdf_group_index = self.entropy_coder.add_cdf(*self.get_cdf_info()) + + def build_indexes(self, size, qp): + B, C, H, W = size + indexes = torch.arange(C, dtype=torch.int).view(1, -1, 1, 1) + qp * self.channel + return indexes.repeat(B, 1, H, W) + + def encode_z(self, x, qp): + _, _, H, W = x.size() + return self.entropy_coder.encode_z(x.reshape(-1), self.cdf_group_index, qp * self.channel, + H * W) + + def decode_z(self, size, qp): + self.entropy_coder.decode_z(self.channel * size[0] * size[1], self.cdf_group_index, + qp * self.channel, size[0] * size[1]) + + def get_z(self, size, device, dtype): + output_size = (1, self.channel, size[0], size[1]) + val = self.entropy_coder.get_decoded_tensor(device, dtype, non_blocking=True) + return val.reshape(output_size) + + +class GaussianEncoder(AEHelper): + def __init__(self): + super().__init__() + self.scale_min = 0.11 + self.scale_max = 16.0 + self.scale_level = 128 # <= 256 + self.scale_table = self.get_scale_table(self.scale_min, self.scale_max, self.scale_level) + + self.log_scale_min = math.log(self.scale_min) + self.log_scale_max = math.log(self.scale_max) + self.log_scale_step = (self.log_scale_max - self.log_scale_min) / (self.scale_level - 1) + self.log_step_recip = 1. / self.log_scale_step + + self.force_zero_thres = None + self.decode_index_cache = {} + self.decode_zeros_cache = {} + + @staticmethod + def get_scale_table(min_val, max_val, levels): + return torch.exp(torch.linspace(math.log(min_val), math.log(max_val), levels)) + + def update(self, entropy_coder, force_zero_thres=None): + self.entropy_coder = entropy_coder + self.force_zero_thres = force_zero_thres + + pmf_center = torch.zeros_like(self.scale_table) + 8 + scales = torch.zeros_like(pmf_center) + self.scale_table + cdf_distribution = torch.distributions.normal.Normal(0., scales) + for i in range(8, 1, -1): + samples = torch.zeros_like(pmf_center) + i + probs = cdf_distribution.cdf(samples) + probs = torch.squeeze(probs) + pmf_center = torch.where(probs > torch.zeros_like(pmf_center) + 0.9999, + torch.zeros_like(pmf_center) + i, pmf_center) + + pmf_center = pmf_center.int() + pmf_length = 2 * pmf_center + 1 + max_length = torch.max(pmf_length).item() + + device = pmf_center.device + samples = torch.arange(max_length, device=device) - pmf_center[:, None] + samples = samples.float() + + scales = torch.zeros_like(samples) + self.scale_table[:, None] + cdf_distribution = torch.distributions.normal.Normal(0., scales) + + upper = cdf_distribution.cdf(samples + 0.5) + lower = cdf_distribution.cdf(samples - 0.5) + pmf = upper - lower + + tail_mass = 2 * lower[:, :1] + + quantized_cdf = torch.Tensor(len(pmf_length), max_length + 2) + quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) + + self.set_cdf_info(quantized_cdf, pmf_length+2, -pmf_center) + self.cdf_group_index = self.entropy_coder.add_cdf(*self.get_cdf_info()) + + def process_with_mask(self, y, scales, means, mask): + return process_with_mask(y, scales, means, mask, self.force_zero_thres) + + def build_indexes_decoder(self, scales): + scales = scales.reshape(-1) + indexes, skip_cond = build_index_dec(scales, self.scale_min, self.scale_max, + self.log_scale_min, self.log_step_recip, + self.force_zero_thres) + if self.force_zero_thres is not None: + indexes = indexes[skip_cond] + return indexes, skip_cond + + def build_indexes_encoder(self, symbols, scales): + symbols = symbols.reshape(-1) + scales = scales.reshape(-1) + symbols = build_index_enc(symbols, scales, self.scale_min, self.scale_max, + self.log_scale_min, self.log_step_recip, self.force_zero_thres) + return symbols + + def encode_y(self, x, scales): + symbols = self.build_indexes_encoder(x, scales) + return self.entropy_coder.encode_y(symbols, self.cdf_group_index) + + def get_decode_index_cache(self, num, device): + if num not in self.decode_index_cache: + c = torch.arange(0, num, dtype=torch.int32, device=device) + self.decode_index_cache[num] = c + + return self.decode_index_cache[num] + + def get_decode_zeros_cache(self, num, device): + if num not in self.decode_zeros_cache: + c = torch.zeros(num, dtype=torch.int32, device=device) + self.decode_zeros_cache[num] = c + + return self.decode_zeros_cache[num].clone() + + def decode_and_get_y(self, scales, dtype, device): + indexes, skip_cond = self.build_indexes_decoder(scales) + self.decode_y(indexes) + return self.get_y(scales.shape, scales.numel(), dtype, device, skip_cond, indexes) + + def decode_y(self, indexes): + self.entropy_coder.decode_y(indexes, self.cdf_group_index) + + def get_y(self, shape, numel, dtype, device, skip_cond, indexes): + if len(indexes) == 0: + return torch.zeros(shape, dtype=dtype, device=device) + if skip_cond is not None: + curr_index = self.get_decode_index_cache(numel, device) + back_index = self.get_decode_zeros_cache(numel, device) + back_index.masked_scatter_(skip_cond, curr_index) + val = self.entropy_coder.get_decoded_tensor(device, dtype, non_blocking=True) + if skip_cond is not None: + y = torch.index_select(val, 0, back_index) * skip_cond + return y.reshape(shape) + return val.reshape(shape) diff --git a/DCVC-family/DCVC-RT/src/models/image_model.py b/DCVC-family/DCVC-RT/src/models/image_model.py new file mode 100644 index 0000000..fa1ea67 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/models/image_model.py @@ -0,0 +1,209 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import torch +from torch import nn +import torch.nn.functional as F + + +from .common_model import CompressionModel +from ..layers.layers import DepthConvBlock, ResidualBlockUpsample, ResidualBlockWithStride2 +from ..layers.cuda_inference import CUSTOMIZED_CUDA_INFERENCE, round_and_to_int8 + +g_ch_src = 3 * 8 * 8 +g_ch_enc_dec = 368 + + +class IntraEncoder(nn.Module): + def __init__(self, N): + super().__init__() + + self.enc_1 = DepthConvBlock(g_ch_src, g_ch_enc_dec) + self.enc_2 = nn.Sequential( + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + nn.Conv2d(g_ch_enc_dec, N, 3, stride=2, padding=1), + ) + + def forward(self, x, quant_step): + out = F.pixel_unshuffle(x, 8) + if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: + return self.forward_torch(out, quant_step) + + return self.forward_cuda(out, quant_step) + + def forward_torch(self, out, quant_step): + out = self.enc_1(out) + out = out * quant_step + return self.enc_2(out) + + def forward_cuda(self, out, quant_step): + out = self.enc_1(out, quant_step=quant_step) + return self.enc_2(out) + + +class IntraDecoder(nn.Module): + def __init__(self, N): + super().__init__() + + self.dec_1 = nn.Sequential( + ResidualBlockUpsample(N, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + ) + self.dec_2 = DepthConvBlock(g_ch_enc_dec, g_ch_src) + + def forward(self, x, quant_step): + if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: + return self.forward_torch(x, quant_step) + + return self.forward_cuda(x, quant_step) + + def forward_torch(self, x, quant_step): + out = self.dec_1(x) + out = out * quant_step + out = self.dec_2(out) + out = F.pixel_shuffle(out, 8) + return out + + def forward_cuda(self, x, quant_step): + out = self.dec_1[0](x) + out = self.dec_1[1](out) + out = self.dec_1[2](out) + out = self.dec_1[3](out) + out = self.dec_1[4](out) + out = self.dec_1[5](out) + out = self.dec_1[6](out) + out = self.dec_1[7](out) + out = self.dec_1[8](out) + out = self.dec_1[9](out) + out = self.dec_1[10](out) + out = self.dec_1[11](out) + out = self.dec_1[12](out, quant_step=quant_step) + out = self.dec_2(out) + out = F.pixel_shuffle(out, 8) + return out + + +class DMCI(CompressionModel): + def __init__(self, N=256, z_channel=128): + super().__init__(z_channel=z_channel) + + self.enc = IntraEncoder(N) + + self.hyper_enc = nn.Sequential( + DepthConvBlock(N, z_channel), + ResidualBlockWithStride2(z_channel, z_channel), + ResidualBlockWithStride2(z_channel, z_channel), + ) + + self.hyper_dec = nn.Sequential( + ResidualBlockUpsample(z_channel, z_channel), + ResidualBlockUpsample(z_channel, z_channel), + DepthConvBlock(z_channel, N), + ) + + self.y_prior_fusion = nn.Sequential( + DepthConvBlock(N, N * 2), + DepthConvBlock(N * 2, N * 2), + DepthConvBlock(N * 2, N * 2), + nn.Conv2d(N * 2, N * 2 + 2, 1), + ) + + self.y_spatial_prior_reduction = nn.Conv2d(N * 2 + 2, N * 1, 1) + self.y_spatial_prior_adaptor_1 = DepthConvBlock(N * 2, N * 2, force_adaptor=True) + self.y_spatial_prior_adaptor_2 = DepthConvBlock(N * 2, N * 2, force_adaptor=True) + self.y_spatial_prior_adaptor_3 = DepthConvBlock(N * 2, N * 2, force_adaptor=True) + self.y_spatial_prior = nn.Sequential( + DepthConvBlock(N * 2, N * 2), + DepthConvBlock(N * 2, N * 2), + DepthConvBlock(N * 2, N * 2), + nn.Conv2d(N * 2, N * 2, 1), + ) + + self.dec = IntraDecoder(N) + + self.q_scale_enc = nn.Parameter(torch.ones((self.get_qp_num(), g_ch_enc_dec, 1, 1))) + self.q_scale_dec = nn.Parameter(torch.ones((self.get_qp_num(), g_ch_enc_dec, 1, 1))) + + def compress(self, x, qp): + device = x.device + curr_q_enc = self.q_scale_enc[qp:qp+1, :, :, :] + curr_q_dec = self.q_scale_dec[qp:qp+1, :, :, :] + + y = self.enc(x, curr_q_enc) + y_pad = self.pad_for_y(y) + z = self.hyper_enc(y_pad) + z_hat, z_hat_write = round_and_to_int8(z) + + params = self.hyper_dec(z_hat) + params = self.y_prior_fusion(params) + _, _, yH, yW = y.shape + params = params[:, :, :yH, :yW].contiguous() + y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, s_w_0, s_w_1, s_w_2, s_w_3, y_hat = \ + self.compress_prior_4x( + y, params, self.y_spatial_prior_reduction, + self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior) + + cuda_event = torch.cuda.Event() + cuda_event.record() + x_hat = self.dec(y_hat, curr_q_dec).clamp_(0, 1) + + cuda_stream = self.get_cuda_stream(device=device, priority=-1) + with torch.cuda.stream(cuda_stream): + cuda_event.wait() + self.entropy_coder.reset() + self.bit_estimator_z.encode_z(z_hat_write, qp) + self.gaussian_encoder.encode_y(y_q_w_0, s_w_0) + self.gaussian_encoder.encode_y(y_q_w_1, s_w_1) + self.gaussian_encoder.encode_y(y_q_w_2, s_w_2) + self.gaussian_encoder.encode_y(y_q_w_3, s_w_3) + self.entropy_coder.flush() + + bit_stream = self.entropy_coder.get_encoded_stream() + + torch.cuda.synchronize(device=device) + result = { + "bit_stream": bit_stream, + "x_hat": x_hat, + } + return result + + def decompress(self, bit_stream, sps, qp): + dtype = next(self.parameters()).dtype + device = next(self.parameters()).device + curr_q_dec = self.q_scale_dec[qp:qp+1, :, :, :] + + self.entropy_coder.set_use_two_entropy_coders(sps['ec_part'] == 1) + self.entropy_coder.set_stream(bit_stream) + z_size = self.get_downsampled_shape(sps['height'], sps['width'], 64) + y_height, y_width = self.get_downsampled_shape(sps['height'], sps['width'], 16) + self.bit_estimator_z.decode_z(z_size, qp) + z_q = self.bit_estimator_z.get_z(z_size, device, dtype) + z_hat = z_q + + params = self.hyper_dec(z_hat) + params = self.y_prior_fusion(params) + params = params[:, :, :y_height, :y_width].contiguous() + y_hat = self.decompress_prior_4x(params, self.y_spatial_prior_reduction, + self.y_spatial_prior_adaptor_1, + self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior) + + x_hat = self.dec(y_hat, curr_q_dec).clamp_(0, 1) + return {"x_hat": x_hat} diff --git a/src/models/video_model.py b/DCVC-family/DCVC-RT/src/models/video_model.py similarity index 100% rename from src/models/video_model.py rename to DCVC-family/DCVC-RT/src/models/video_model.py diff --git a/DCVC-family/DCVC-RT/src/utils/common.py b/DCVC-family/DCVC-RT/src/utils/common.py new file mode 100644 index 0000000..a7599c0 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/utils/common.py @@ -0,0 +1,177 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import json +import os +from unittest.mock import patch + +import torch +from torch.nn.modules.utils import consume_prefix_in_state_dict_if_present +import numpy as np + + +def str2bool(v): + return str(v).lower() in ("yes", "y", "true", "t", "1") + + +def set_torch_env(): + os.environ['CUBLAS_WORKSPACE_CONFIG'] = ":4096:8" + torch.backends.cudnn.enabled = True + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + torch.manual_seed(0) + torch.set_num_threads(1) + np.random.seed(seed=0) + try: + # require pytorch >= 2.2.0 + torch.utils.deterministic.fill_uninitialized_memory = False + except Exception: # pylint: disable=W0718 + pass + + +def create_folder(path, print_if_create=False): + if not os.path.exists(path): + os.makedirs(path) + if print_if_create: + print(f"created folder: {path}") + + +def get_state_dict(ckpt_path): + ckpt = torch.load(ckpt_path, map_location=torch.device('cpu'), weights_only=True) + if "state_dict" in ckpt: + ckpt = ckpt['state_dict'] + if "net" in ckpt: + ckpt = ckpt["net"] + consume_prefix_in_state_dict_if_present(ckpt, prefix="module.") + return ckpt + + +@patch('json.encoder.c_make_encoder', None) +def dump_json(obj, fid, float_digits=-1, **kwargs): + of = json.encoder._make_iterencode # pylint: disable=W0212 + + def inner(*args, **kwargs): + args = list(args) + # fifth argument is float formater which we will replace + args[4] = lambda o: format(o, '.%df' % float_digits) + return of(*args, **kwargs) + + with patch('json.encoder._make_iterencode', wraps=inner): + json.dump(obj, fid, **kwargs) + + +def generate_log_json(frame_num, frame_pixel_num, test_time, frame_types, bits, psnrs, ssims, + verbose=False, avg_encoding_time=None, avg_decoding_time=None): + include_yuv = len(psnrs[0]) > 1 + assert not include_yuv or (len(psnrs[0]) == 4 and len(ssims[0]) == 4) + i_bits = 0 + i_psnr = 0 + i_psnr_y = 0 + i_psnr_u = 0 + i_psnr_v = 0 + i_ssim = 0 + i_ssim_y = 0 + i_ssim_u = 0 + i_ssim_v = 0 + p_bits = 0 + p_psnr = 0 + p_psnr_y = 0 + p_psnr_u = 0 + p_psnr_v = 0 + p_ssim = 0 + p_ssim_y = 0 + p_ssim_u = 0 + p_ssim_v = 0 + i_num = 0 + p_num = 0 + for idx in range(frame_num): + if frame_types[idx] == 0: + i_bits += bits[idx] + i_psnr += psnrs[idx][0] + i_ssim += ssims[idx][0] + i_num += 1 + if include_yuv: + i_psnr_y += psnrs[idx][1] + i_psnr_u += psnrs[idx][2] + i_psnr_v += psnrs[idx][3] + i_ssim_y += ssims[idx][1] + i_ssim_u += ssims[idx][2] + i_ssim_v += ssims[idx][3] + else: + p_bits += bits[idx] + p_psnr += psnrs[idx][0] + p_ssim += ssims[idx][0] + p_num += 1 + if include_yuv: + p_psnr_y += psnrs[idx][1] + p_psnr_u += psnrs[idx][2] + p_psnr_v += psnrs[idx][3] + p_ssim_y += ssims[idx][1] + p_ssim_u += ssims[idx][2] + p_ssim_v += ssims[idx][3] + + log_result = {} + log_result['frame_pixel_num'] = frame_pixel_num + log_result['i_frame_num'] = i_num + log_result['p_frame_num'] = p_num + log_result['ave_i_frame_bpp'] = i_bits / i_num / frame_pixel_num + log_result['ave_i_frame_psnr'] = i_psnr / i_num + log_result['ave_i_frame_msssim'] = i_ssim / i_num + if include_yuv: + log_result['ave_i_frame_psnr_y'] = i_psnr_y / i_num + log_result['ave_i_frame_psnr_u'] = i_psnr_u / i_num + log_result['ave_i_frame_psnr_v'] = i_psnr_v / i_num + log_result['ave_i_frame_msssim_y'] = i_ssim_y / i_num + log_result['ave_i_frame_msssim_u'] = i_ssim_u / i_num + log_result['ave_i_frame_msssim_v'] = i_ssim_v / i_num + if verbose: + log_result['frame_bpp'] = list(np.array(bits) / frame_pixel_num) + log_result['frame_psnr'] = [v[0] for v in psnrs] + log_result['frame_msssim'] = [v[0] for v in ssims] + log_result['frame_type'] = frame_types + if include_yuv: + log_result['frame_psnr_y'] = [v[1] for v in psnrs] + log_result['frame_psnr_u'] = [v[2] for v in psnrs] + log_result['frame_psnr_v'] = [v[3] for v in psnrs] + log_result['frame_msssim_y'] = [v[1] for v in ssims] + log_result['frame_msssim_u'] = [v[2] for v in ssims] + log_result['frame_msssim_v'] = [v[3] for v in ssims] + log_result['test_time'] = test_time + if p_num > 0: + total_p_pixel_num = p_num * frame_pixel_num + log_result['ave_p_frame_bpp'] = p_bits / total_p_pixel_num + log_result['ave_p_frame_psnr'] = p_psnr / p_num + log_result['ave_p_frame_msssim'] = p_ssim / p_num + if include_yuv: + log_result['ave_p_frame_psnr_y'] = p_psnr_y / p_num + log_result['ave_p_frame_psnr_u'] = p_psnr_u / p_num + log_result['ave_p_frame_psnr_v'] = p_psnr_v / p_num + log_result['ave_p_frame_msssim_y'] = p_ssim_y / p_num + log_result['ave_p_frame_msssim_u'] = p_ssim_u / p_num + log_result['ave_p_frame_msssim_v'] = p_ssim_v / p_num + else: + log_result['ave_p_frame_bpp'] = 0 + log_result['ave_p_frame_psnr'] = 0 + log_result['ave_p_frame_msssim'] = 0 + if include_yuv: + log_result['ave_p_frame_psnr_y'] = 0 + log_result['ave_p_frame_psnr_u'] = 0 + log_result['ave_p_frame_psnr_v'] = 0 + log_result['ave_p_frame_msssim_y'] = 0 + log_result['ave_p_frame_msssim_u'] = 0 + log_result['ave_p_frame_msssim_v'] = 0 + log_result['ave_all_frame_bpp'] = (i_bits + p_bits) / (frame_num * frame_pixel_num) + log_result['ave_all_frame_psnr'] = (i_psnr + p_psnr) / frame_num + log_result['ave_all_frame_msssim'] = (i_ssim + p_ssim) / frame_num + if avg_encoding_time is not None and avg_decoding_time is not None: + log_result['avg_frame_encoding_time'] = avg_encoding_time + log_result['avg_frame_decoding_time'] = avg_decoding_time + if include_yuv: + log_result['ave_all_frame_psnr_y'] = (i_psnr_y + p_psnr_y) / frame_num + log_result['ave_all_frame_psnr_u'] = (i_psnr_u + p_psnr_u) / frame_num + log_result['ave_all_frame_psnr_v'] = (i_psnr_v + p_psnr_v) / frame_num + log_result['ave_all_frame_msssim_y'] = (i_ssim_y + p_ssim_y) / frame_num + log_result['ave_all_frame_msssim_u'] = (i_ssim_u + p_ssim_u) / frame_num + log_result['ave_all_frame_msssim_v'] = (i_ssim_v + p_ssim_v) / frame_num + + return log_result diff --git a/DCVC-family/DCVC-RT/src/utils/metrics.py b/DCVC-family/DCVC-RT/src/utils/metrics.py new file mode 100644 index 0000000..869a9ab --- /dev/null +++ b/DCVC-family/DCVC-RT/src/utils/metrics.py @@ -0,0 +1,96 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import numpy as np +from scipy import signal +from scipy import ndimage + + +def fspecial_gauss(size, sigma): + x, y = np.mgrid[-size // 2 + 1:size // 2 + 1, -size // 2 + 1:size // 2 + 1] + g = np.exp(-((x**2 + y**2) / (2.0 * sigma**2))) + return g / g.sum() + + +def calc_ssim(img1, img2, data_range=255): + img1 = img1.astype(np.float64) + img2 = img2.astype(np.float64) + size = 11 + sigma = 1.5 + window = fspecial_gauss(size, sigma) + K1 = 0.01 + K2 = 0.03 + C1 = (K1 * data_range)**2 + C2 = (K2 * data_range)**2 + mu1 = signal.fftconvolve(window, img1, mode='valid') + mu2 = signal.fftconvolve(window, img2, mode='valid') + mu1_sq = mu1 * mu1 + mu2_sq = mu2 * mu2 + mu1_mu2 = mu1 * mu2 + sigma1_sq = signal.fftconvolve(window, img1 * img1, mode='valid') - mu1_sq + sigma2_sq = signal.fftconvolve(window, img2 * img2, mode='valid') - mu2_sq + sigma12 = signal.fftconvolve(window, img1 * img2, mode='valid') - mu1_mu2 + + return (((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * + (sigma1_sq + sigma2_sq + C2)), + (2.0 * sigma12 + C2) / (sigma1_sq + sigma2_sq + C2)) + + +def calc_msssim(img1, img2, data_range=255): + ''' + img1 and img2 are 2D arrays + ''' + level = 5 + weight = np.array([0.0448, 0.2856, 0.3001, 0.2363, 0.1333]) + height, width = img1.shape + if height < 176 or width < 176: + # according to HM implementation + level = 4 + weight = np.array([0.0517, 0.3295, 0.3462, 0.2726]) + if height < 88 or width < 88: + assert False + downsample_filter = np.ones((2, 2)) / 4.0 + im1 = img1.astype(np.float64) + im2 = img2.astype(np.float64) + mssim = np.array([]) + mcs = np.array([]) + for _ in range(level): + ssim_map, cs_map = calc_ssim(im1, im2, data_range=data_range) + mssim = np.append(mssim, ssim_map.mean()) + mcs = np.append(mcs, cs_map.mean()) + filtered_im1 = ndimage.filters.convolve(im1, downsample_filter, + mode='reflect') + filtered_im2 = ndimage.filters.convolve(im2, downsample_filter, + mode='reflect') + im1 = filtered_im1[::2, ::2] + im2 = filtered_im2[::2, ::2] + return (np.prod(mcs[0:level - 1]**weight[0:level - 1]) * + (mssim[level - 1]**weight[level - 1])) + + +def calc_msssim_rgb(img1, img2, data_range=255): + ''' + img1 and img2 are arrays with 3xHxW + ''' + msssim = 0 + for i in range(3): + msssim += calc_msssim(img1[i, :, :], img2[i, :, :], data_range) + return msssim / 3 + + +def calc_psnr(img1, img2, data_range=255): + ''' + img1 and img2 are arrays with same shape + ''' + img1 = img1.astype(np.float64) + img2 = img2.astype(np.float64) + mse = np.mean(np.square(img1 - img2)) + if np.isnan(mse) or np.isinf(mse): + return -999.9 + if mse > 1e-10: + psnr = 10 * np.log10(data_range * data_range / mse) + else: + psnr = 999.9 + if psnr > 99.9: + psnr = 99.9 + return psnr diff --git a/DCVC-family/DCVC-RT/src/utils/stream_helper.py b/DCVC-family/DCVC-RT/src/utils/stream_helper.py new file mode 100644 index 0000000..1450782 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/utils/stream_helper.py @@ -0,0 +1,217 @@ +# Copyright 2020 InterDigital Communications, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import enum +import struct +from pathlib import Path + + +def filesize(filepath: str) -> int: + if not Path(filepath).is_file(): + raise ValueError(f'Invalid file "{filepath}".') + return Path(filepath).stat().st_size + + +def write_uints(fd, values, fmt=">{:d}I"): + fd.write(struct.pack(fmt.format(len(values)), *values)) + return len(values) * 4 + + +def write_uchars(fd, values, fmt=">{:d}B"): + fd.write(struct.pack(fmt.format(len(values)), *values)) + return len(values) + + +def read_uints(fd, n, fmt=">{:d}I"): + sz = struct.calcsize("I") + return struct.unpack(fmt.format(n), fd.read(n * sz)) + + +def read_uchars(fd, n, fmt=">{:d}B"): + sz = struct.calcsize("B") + return struct.unpack(fmt.format(n), fd.read(n * sz)) + + +def write_bytes(fd, values, fmt=">{:d}s"): + if len(values) == 0: + return 0 + fd.write(struct.pack(fmt.format(len(values)), values)) + return len(values) + + +def read_bytes(fd, n, fmt=">{:d}s"): + sz = struct.calcsize("s") + return struct.unpack(fmt.format(n), fd.read(n * sz))[0] + + +def write_ushorts(fd, values, fmt=">{:d}H"): + fd.write(struct.pack(fmt.format(len(values)), *values)) + return len(values) * 2 + + +def read_ushorts(fd, n, fmt=">{:d}H"): + sz = struct.calcsize("H") + return struct.unpack(fmt.format(n), fd.read(n * sz)) + + +def write_uint_adaptive(f, a): + if a < (1 << 7): + a0 = (a >> 0) & 0xff + a0 = a0 | (0x00 << 7) + write_uchars(f, (a0,)) + return 1 + + if a < (1 << 14): + a0 = (a >> 0) & 0xff + a1 = (a >> 8) & 0xff + a1 = a1 | (0x02 << 6) + write_uchars(f, (a1, a0)) + return 2 + + assert a < (1 << 30) + a0 = (a >> 0) & 0xff + a1 = (a >> 8) & 0xff + a2 = (a >> 16) & 0xff + a3 = (a >> 24) & 0xff + a3 = a3 | (0x03 << 6) + write_uchars(f, (a3, a2, a1, a0)) + return 4 + + +def read_uint_adaptive(f): + a3 = read_uchars(f, 1)[0] + if (a3 >> 7) == 0: + return a3 + + a2 = read_uchars(f, 1)[0] + + if (a3 >> 6) == 0x02: + a3 = a3 & 0x3f + return (a3 << 8) + a2 + a3 = a3 & 0x3f + a1 = read_uchars(f, 1)[0] + a0 = read_uchars(f, 1)[0] + return (a3 << 24) + (a2 << 16) + (a1 << 8) + a0 + + +class NalType(enum.IntEnum): + NAL_SPS = 0 + NAL_I = 1 + NAL_P = 2 + + +class SPSHelper(): + def __init__(self): + super().__init__() + self.spss = [] + + def get_sps_id(self, target_sps): + min_id = -1 + for sps in self.spss: + if sps['height'] == target_sps['height'] and sps['width'] == target_sps['width'] and \ + sps['use_ada_i'] == target_sps['use_ada_i'] and \ + sps['ec_part'] == target_sps['ec_part']: + return sps['sps_id'], False + if sps['sps_id'] > min_id: + min_id = sps['sps_id'] + assert min_id < 15 + sps = target_sps.copy() + sps['sps_id'] = min_id + 1 + self.spss.append(sps) + return sps['sps_id'], True + + def add_sps_by_id(self, sps): + for i in range(len(self.spss)): + if self.spss[i]['sps_id'] == sps['sps_id']: + self.spss[i] = sps.copy() + return + self.spss.append(sps.copy()) + + def get_sps_by_id(self, sps_id): + for sps in self.spss: + if sps['sps_id'] == sps_id: + return sps + return None + + +def write_sps(f, sps): + # nal_type(4), sps_id(4) + # height (variable) + # width (vairable) + # 0(6), ec_part(1) use_ada_i(1) + assert sps['sps_id'] < 16 + assert sps['use_ada_i'] < 2 + written = 0 + flag = int((NalType.NAL_SPS << 4) + sps['sps_id']) + written += write_uchars(f, (flag,)) + written += write_uint_adaptive(f, sps['height']) + written += write_uint_adaptive(f, sps['width']) + flag = (sps['ec_part'] << 2) + sps['use_ada_i'] + written += write_uchars(f, (flag,)) + return written + + +def read_header(f): + header = {} + flag = read_uchars(f, 1)[0] + nal_type = flag >> 4 + header['nal_type'] = NalType(nal_type) + if nal_type < 3: + header['sps_id'] = flag & 0x0f + return header + + frame_num_minus1 = flag & 0x0f + frame_num = frame_num_minus1 + 1 + header['frame_num'] = frame_num + sps_ids = [] + for _ in range(0, frame_num, 2): + flag = read_uchars(f, 1)[0] + sps_ids.append(flag >> 4) + sps_ids.append(flag & 0x0f) + sps_ids = sps_ids[:frame_num] + header['sps_ids'] = sps_ids + return header + + +def read_sps_remaining(f, sps_id): + sps = {} + sps['sps_id'] = sps_id + sps['height'] = read_uint_adaptive(f) + sps['width'] = read_uint_adaptive(f) + flag = read_uchars(f, 1)[0] + sps['ec_part'] = (flag >> 2) & 0x01 + sps['use_ada_i'] = flag & 0x01 + return sps + + +def write_ip(f, is_i_frame, sps_id, qp, bit_stream): + written = 0 + flag = (int(NalType.NAL_I if is_i_frame else NalType.NAL_P) << 4) + sps_id + written += write_uchars(f, (flag,)) + assert qp < 256 and qp >= 0 + flag = qp + written += write_uchars(f, (flag,)) + # we write all the streams in the same file, thus, we need to write the per-frame length + # if packed independently, we do not need to write it + written += write_uint_adaptive(f, len(bit_stream)) + written += write_bytes(f, bit_stream) + return written + + +def read_ip_remaining(f): + flag = read_uchars(f, 1)[0] + qp = flag + stream_length = read_uint_adaptive(f) + bit_stream = read_bytes(f, stream_length) + return qp, bit_stream diff --git a/DCVC-family/DCVC-RT/src/utils/transforms.py b/DCVC-family/DCVC-RT/src/utils/transforms.py new file mode 100644 index 0000000..9b96d17 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/utils/transforms.py @@ -0,0 +1,63 @@ +import numpy as np +import scipy.ndimage +import torch +import torch.nn.functional as F + + +YCBCR_WEIGHTS = { + # Spec: (K_r, K_g, K_b) with K_g = 1 - K_r - K_b + "ITU-R_BT.709": (0.2126, 0.7152, 0.0722) +} + + +def ycbcr420_to_444_np(y, uv, order=0, separate=False): + ''' + y is 1xhxw Y float numpy array + uv is 2x(h/2)x(w/2) UV float numpy array + order: 0 nearest neighbor (default), 1: binear + return value is 3xhxw YCbCr float numpy array + ''' + uv = scipy.ndimage.zoom(uv, (1, 2, 2), order=order) + if separate: + return y, uv + yuv = np.concatenate((y, uv), axis=0) + return yuv + + +def rgb2ycbcr(rgb, is_bgr=False): + if is_bgr: + b, g, r = rgb.chunk(3, -3) + else: + r, g, b = rgb.chunk(3, -3) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + y = Kr * r + Kg * g + Kb * b + cb = 0.5 * (b - y) / (1 - Kb) + 0.5 + cr = 0.5 * (r - y) / (1 - Kr) + 0.5 + ycbcr = torch.cat((y, cb, cr), dim=-3) + ycbcr = torch.clamp(ycbcr, 0., 1.) + return ycbcr + + +def ycbcr2rgb(ycbcr, is_bgr=False, clamp=True): + y, cb, cr = ycbcr.chunk(3, -3) + Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] + r = y + (2 - 2 * Kr) * (cr - 0.5) + b = y + (2 - 2 * Kb) * (cb - 0.5) + g = (y - Kr * r - Kb * b) / Kg + if is_bgr: + rgb = torch.cat((b, g, r), dim=-3) + else: + rgb = torch.cat((r, g, b), dim=-3) + if clamp: + rgb = torch.clamp(rgb, 0., 1.) + return rgb + + +def yuv_444_to_420(yuv): + def _downsample(tensor): + return F.avg_pool2d(tensor, kernel_size=2, stride=2) + + y = yuv[:, :1, :, :] + uv = yuv[:, 1:, :, :] + + return y, _downsample(uv) diff --git a/DCVC-family/DCVC-RT/src/utils/video_reader.py b/DCVC-family/DCVC-RT/src/utils/video_reader.py new file mode 100644 index 0000000..a251845 --- /dev/null +++ b/DCVC-family/DCVC-RT/src/utils/video_reader.py @@ -0,0 +1,90 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os + +import numpy as np +from PIL import Image + + +class PNGReader(): + def __init__(self, src_path, width, height, start_num=1): + self.eof = False + self.src_path = src_path + self.width = width + self.height = height + pngs = os.listdir(self.src_path) + if 'im1.png' in pngs: + self.padding = 1 + elif 'im00001.png' in pngs: + self.padding = 5 + else: + raise ValueError('unknown image naming convention; please specify') + self.current_frame_index = start_num + + def read_one_frame(self): + # rgb: 3xhxw uint8 numpy array + if self.eof: + return None + + png_path = os.path.join(self.src_path, + f"im{str(self.current_frame_index).zfill(self.padding)}.png" + ) + if not os.path.exists(png_path): + self.eof = True + return None + + rgb = Image.open(png_path).convert('RGB') + rgb = np.asarray(rgb).astype(np.uint8).transpose(2, 0, 1) + _, height, width = rgb.shape + assert height == self.height + assert width == self.width + + self.current_frame_index += 1 + return rgb + + def close(self): + self.current_frame_index = 1 + + +class YUV420Reader(): + def __init__(self, src_path, width, height, skip_frame=0): + self.eof = False + if not src_path.endswith('.yuv'): + src_path = src_path + '.yuv' + self.src_path = src_path + + self.y_size = width * height + self.y_width = width + self.y_height = height + self.uv_size = width * height // 2 + self.uv_width = width // 2 + self.uv_height = height // 2 + # pylint: disable=R1732 + self.file = open(src_path, "rb") + # pylint: enable=R1732 + skipped_frame = 0 + while not self.eof and skipped_frame < skip_frame: + y = self.file.read(self.y_size) + uv = self.file.read(self.uv_size) + if not y or not uv: + self.eof = True + skipped_frame += 1 + + def read_one_frame(self): + # y: 1xhxw uint8 numpy array + # uv: 2x(h/2)x(w/2) uint8 numpy array + if self.eof: + return None, None + y = self.file.read(self.y_size) + uv = self.file.read(self.uv_size) + if not y or not uv: + self.eof = True + return None, None + y = np.frombuffer(y, dtype=np.uint8).copy().reshape(1, self.y_height, self.y_width) + uv = np.frombuffer(uv, dtype=np.uint8).copy().reshape(2, self.uv_height, self.uv_width) + + return y, uv + + def close(self): + self.file.close() diff --git a/DCVC-family/DCVC-RT/src/utils/video_writer.py b/DCVC-family/DCVC-RT/src/utils/video_writer.py new file mode 100644 index 0000000..d61089d --- /dev/null +++ b/DCVC-family/DCVC-RT/src/utils/video_writer.py @@ -0,0 +1,52 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os + +from PIL import Image + + +class PNGWriter(): + def __init__(self, dst_path, width, height): + self.dst_path = dst_path + self.width = width + self.height = height + self.padding = 5 + self.current_frame_index = 1 + os.makedirs(dst_path, exist_ok=True) + + def write_one_frame(self, rgb): + # rgb: 3xhxw uint8 numpy array + rgb = rgb.transpose(1, 2, 0) + + png_path = os.path.join(self.dst_path, + f"im{str(self.current_frame_index).zfill(self.padding)}.png" + ) + Image.fromarray(rgb).save(png_path) + + self.current_frame_index += 1 + + def close(self): + self.current_frame_index = 1 + + +class YUV420Writer(): + def __init__(self, dst_path, width, height): + if not dst_path.endswith('.yuv'): + dst_path = dst_path + '/out.yuv' + self.dst_path = dst_path + self.width = width + self.height = height + + # pylint: disable=R1732 + self.file = open(dst_path, "wb") + # pylint: enable=R1732 + + def write_one_frame(self, y, uv): + # y: 1xhxw uint8 numpy array + # uv: 2x(h/2)x(w/2) uint8 numpy array + self.file.write(y.tobytes()) + self.file.write(uv.tobytes()) + + def close(self): + self.file.close() diff --git a/DCVC-family/DCVC-RT/test_video.py b/DCVC-family/DCVC-RT/test_video.py new file mode 100644 index 0000000..8658569 --- /dev/null +++ b/DCVC-family/DCVC-RT/test_video.py @@ -0,0 +1,541 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +import concurrent.futures +import io +import json +import multiprocessing +import os +import time + +import torch +import numpy as np +from tqdm import tqdm + +from src.layers.cuda_inference import replicate_pad +from src.models.video_model import DMC +from src.models.image_model import DMCI +from src.utils.common import str2bool, create_folder, generate_log_json, get_state_dict, \ + dump_json, set_torch_env +from src.utils.stream_helper import SPSHelper, NalType, write_sps, read_header, \ + read_sps_remaining, read_ip_remaining, write_ip +from src.utils.video_reader import PNGReader, YUV420Reader +from src.utils.video_writer import PNGWriter, YUV420Writer +from src.utils.metrics import calc_psnr, calc_msssim, calc_msssim_rgb +from src.utils.transforms import rgb2ycbcr, ycbcr2rgb, yuv_444_to_420, ycbcr420_to_444_np + + +def parse_args(): + parser = argparse.ArgumentParser(description="Example testing script") + + parser.add_argument('--force_zero_thres', type=float, default=None, required=False) + parser.add_argument('--model_path_i', type=str) + parser.add_argument('--model_path_p', type=str) + parser.add_argument('--rate_num', type=int, default=4) + parser.add_argument('--qp_i', type=int, nargs="+") + parser.add_argument('--qp_p', type=int, nargs="+") + parser.add_argument("--force_intra", type=str2bool, default=False) + parser.add_argument("--force_frame_num", type=int, default=-1) + parser.add_argument("--force_intra_period", type=int, default=-1) + parser.add_argument('--reset_interval', type=int, default=32, required=False) + parser.add_argument('--test_config', type=str, required=True) + parser.add_argument('--force_root_path', type=str, default=None, required=False) + parser.add_argument("--worker", "-w", type=int, default=1, help="worker number") + parser.add_argument("--cuda", type=str2bool, default=False) + parser.add_argument('--cuda_idx', type=int, nargs="+", help='GPU indexes to use') + parser.add_argument('--calc_ssim', type=str2bool, default=False, required=False) + parser.add_argument('--write_stream', type=str2bool, default=False) + parser.add_argument('--check_existing', type=str2bool, default=False) + parser.add_argument('--stream_path', type=str, default="out_bin") + parser.add_argument('--save_decoded_frame', type=str2bool, default=False) + parser.add_argument('--output_path', type=str, required=True) + parser.add_argument('--verbose_json', type=str2bool, default=False) + parser.add_argument('--verbose', type=int, default=0) + + args = parser.parse_args() + return args + + +def np_image_to_tensor(img, device): + image = torch.from_numpy(img).to(device=device).to(dtype=torch.float32) / 255.0 + image = image.unsqueeze(0) + return image + + +def get_src_reader(args): + if args['src_type'] == 'png': + src_reader = PNGReader(args['src_path'], args['src_width'], args['src_height']) + elif args['src_type'] == 'yuv420': + src_reader = YUV420Reader(args['src_path'], args['src_width'], args['src_height']) + return src_reader + + +def get_src_frame(args, src_reader, device): + if args['src_type'] == 'yuv420': + y, uv = src_reader.read_one_frame() + yuv = ycbcr420_to_444_np(y, uv) + x = np_image_to_tensor(yuv, device) + y = y[0, :, :] + u = uv[0, :, :] + v = uv[1, :, :] + rgb = None + else: + assert args['src_type'] == 'png' + rgb = src_reader.read_one_frame() + x = np_image_to_tensor(rgb, device) + x = rgb2ycbcr(x) + y, u, v = None, None, None + + x = x.to(torch.float16) + return x, y, u, v, rgb + + +def get_distortion(args, x_hat, y, u, v, rgb): + if args['src_type'] == 'yuv420': + y_rec, uv_rec = yuv_444_to_420(x_hat) + y_rec = torch.clamp(y_rec * 255, 0, 255).squeeze(0).cpu().numpy() + uv_rec = torch.clamp(uv_rec * 255, 0, 255).squeeze(0).cpu().numpy() + y_rec = y_rec[0, :, :] + u_rec = uv_rec[0, :, :] + v_rec = uv_rec[1, :, :] + psnr_y = calc_psnr(y, y_rec) + psnr_u = calc_psnr(u, u_rec) + psnr_v = calc_psnr(v, v_rec) + psnr = (6 * psnr_y + psnr_u + psnr_v) / 8 + if args['calc_ssim']: + ssim_y = calc_msssim(y, y_rec) + ssim_u = calc_msssim(u, u_rec) + ssim_v = calc_msssim(v, v_rec) + else: + ssim_y, ssim_u, ssim_v = 0., 0., 0. + ssim = (6 * ssim_y + ssim_u + ssim_v) / 8 + + curr_psnr = [psnr, psnr_y, psnr_u, psnr_v] + curr_ssim = [ssim, ssim_y, ssim_u, ssim_v] + else: + assert args['src_type'] == 'png' + rgb_rec = ycbcr2rgb(x_hat) + rgb_rec = torch.clamp(rgb_rec * 255, 0, 255).squeeze(0).cpu().numpy() + psnr = calc_psnr(rgb, rgb_rec) + if args['calc_ssim']: + msssim = calc_msssim_rgb(rgb, rgb_rec) + else: + msssim = 0. + curr_psnr = [psnr] + curr_ssim = [msssim] + return curr_psnr, curr_ssim + + +def run_one_point_with_stream(p_frame_net, i_frame_net, args): + if args['check_existing'] and os.path.exists(args['curr_json_path']) and \ + os.path.exists(args['curr_bin_path']): + with open(args['curr_json_path']) as f: + log_result = json.load(f) + if log_result['i_frame_num'] + log_result['p_frame_num'] == args['frame_num']: + return log_result + print(f"incorrect log for {args['curr_json_path']}, try to rerun.") + + frame_num = args['frame_num'] + save_decoded_frame = args['save_decoded_frame'] + verbose = args['verbose'] + reset_interval = args['reset_interval'] + intra_period = args['intra_period'] + verbose_json = args['verbose_json'] + device = next(i_frame_net.parameters()).device + + src_reader = get_src_reader(args) + pic_height = args['src_height'] + pic_width = args['src_width'] + padding_r, padding_b = DMCI.get_padding_size(pic_height, pic_width, 16) + + use_two_entropy_coders = pic_height * pic_width > 1280 * 720 + i_frame_net.set_use_two_entropy_coders(use_two_entropy_coders) + p_frame_net.set_use_two_entropy_coders(use_two_entropy_coders) + + frame_types = [] + psnrs = [] + msssims = [] + bits = [] + + start_time = time.time() + encoding_time = [] + decoding_time = [] + index_map = [0, 1, 0, 2, 0, 2, 0, 2] + + output_buff = io.BytesIO() + sps_helper = SPSHelper() + + p_frame_net.set_curr_poc(0) + with torch.no_grad(): + last_qp = 0 + for frame_idx in range(frame_num): + x, y, u, v, rgb = get_src_frame(args, src_reader, device) + + torch.cuda.synchronize(device=device) + frame_start_time = time.time() + + # pad if necessary + x_padded = replicate_pad(x, padding_b, padding_r) + + is_i_frame = False + if frame_idx == 0 or (intra_period > 0 and frame_idx % intra_period == 0): + is_i_frame = True + curr_qp = args['qp_i'] + sps = { + 'sps_id': -1, + 'height': pic_height, + 'width': pic_width, + 'ec_part': 1 if use_two_entropy_coders else 0, + 'use_ada_i': 0, + } + encoded = i_frame_net.compress(x_padded, args['qp_i']) + p_frame_net.clear_dpb() + p_frame_net.add_ref_frame(None, encoded['x_hat']) + frame_types.append(0) + else: + fa_idx = index_map[frame_idx % 8] + if reset_interval > 0 and frame_idx % reset_interval == 1: + use_ada_i = 1 + p_frame_net.prepare_feature_adaptor_i(last_qp) + else: + use_ada_i = 0 + curr_qp = p_frame_net.shift_qp(args['qp_p'], fa_idx) + sps = { + 'sps_id': -1, + 'height': pic_height, + 'width': pic_width, + 'ec_part': 1 if use_two_entropy_coders else 0, + 'use_ada_i': use_ada_i, + } + + encoded = p_frame_net.compress(x_padded, curr_qp) + last_qp = curr_qp + frame_types.append(1) + + sps_id, sps_new = sps_helper.get_sps_id(sps) + sps['sps_id'] = sps_id + sps_bytes = 0 + if sps_new: + sps_bytes = write_sps(output_buff, sps) + if verbose >= 2: + print("new sps", sps) + stream_bytes = write_ip(output_buff, is_i_frame, sps_id, curr_qp, encoded['bit_stream']) + bits.append(stream_bytes * 8 + sps_bytes * 8) + + torch.cuda.synchronize(device=device) + frame_end_time = time.time() + + frame_time = frame_end_time - frame_start_time + encoding_time.append(frame_time) + + if verbose >= 2: + print(f"frame {frame_idx} encoded, {frame_time * 1000:.3f} ms, " + f"bits: {bits[-1]}") + + src_reader.close() + with open(args['curr_bin_path'], "wb") as output_file: + bytes_buffer = output_buff.getbuffer() + output_file.write(bytes_buffer) + total_bytes = bytes_buffer.nbytes + bytes_buffer.release() + total_kbps = int(total_bytes * 8 / (frame_num / 30) / 1000) # assume 30 fps + output_buff.close() + sps_helper = SPSHelper() + input_file = open(args['curr_bin_path'], "rb") + with open(args['curr_bin_path'], "rb") as input_file: + input_buff = io.BytesIO(input_file.read()) + decoded_frame_number = 0 + src_reader = get_src_reader(args) + + if save_decoded_frame: + if args['src_type'] == 'png': + recon_writer = PNGWriter(args['bin_folder'], args['src_width'], args['src_height']) + elif args['src_type'] == 'yuv420': + output_yuv_path = args['curr_rec_path'].replace('.yuv', f'_{total_kbps}kbps.yuv') + recon_writer = YUV420Writer(output_yuv_path, args['src_width'], args['src_height']) + + p_frame_net.set_curr_poc(0) + with torch.no_grad(): + while decoded_frame_number < frame_num: + x, y, u, v, rgb = get_src_frame(args, src_reader, device) + torch.cuda.synchronize(device=device) + frame_start_time = time.time() + + header = read_header(input_buff) + while header['nal_type'] == NalType.NAL_SPS: + sps = read_sps_remaining(input_buff, header['sps_id']) + sps_helper.add_sps_by_id(sps) + if verbose >= 2: + print("new sps", sps) + header = read_header(input_buff) + continue + sps_id = header['sps_id'] + + sps = sps_helper.get_sps_by_id(sps_id) + qp, bit_stream = read_ip_remaining(input_buff) + + if header['nal_type'] == NalType.NAL_I: + decoded = i_frame_net.decompress(bit_stream, sps, qp) + p_frame_net.clear_dpb() + p_frame_net.add_ref_frame(None, decoded['x_hat']) + elif header['nal_type'] == NalType.NAL_P: + if sps['use_ada_i']: + p_frame_net.reset_ref_feature() + decoded = p_frame_net.decompress(bit_stream, sps, qp) + + recon_frame = decoded['x_hat'] + x_hat = recon_frame[:, :, :pic_height, :pic_width] + + torch.cuda.synchronize(device=device) + frame_end_time = time.time() + + frame_time = frame_end_time - frame_start_time + decoding_time.append(frame_time) + + curr_psnr, curr_ssim = get_distortion(args, x_hat, y, u, v, rgb) + psnrs.append(curr_psnr) + msssims.append(curr_ssim) + + if verbose >= 2: + stream_length = 0 if bit_stream is None else len(bit_stream) * 8 + print(f"frame {decoded_frame_number} decoded, {frame_time * 1000:.3f} ms, " + f"bits: {stream_length}, PSNR: {curr_psnr[0]:.4f} ") + + if save_decoded_frame: + if args['src_type'] == 'yuv420': + y_rec, uv_rec = yuv_444_to_420(x_hat) + y_rec = torch.clamp(y_rec * 255, 0, 255).round().to(dtype=torch.uint8) + y_rec = y_rec.squeeze(0).cpu().numpy() + uv_rec = torch.clamp(uv_rec * 255, 0, 255).to(dtype=torch.uint8) + uv_rec = uv_rec.squeeze(0).cpu().numpy() + recon_writer.write_one_frame(y_rec, uv_rec) + else: + assert args['src_type'] == 'png' + rgb_rec = ycbcr2rgb(x_hat) + rgb_rec = torch.clamp(rgb_rec * 255, 0, 255).round().to(dtype=torch.uint8) + rgb_rec = rgb_rec.squeeze(0).cpu().numpy() + recon_writer.write_one_frame(rgb_rec) + decoded_frame_number += 1 + input_buff.close() + src_reader.close() + + if save_decoded_frame: + recon_writer.close() + + test_time = time.time() - start_time + test_time_frame_numuber = len(encoding_time) + time_bypass_frame_num = 10 # bypass the first 10 frames as warmup + if verbose >= 1 and test_time_frame_numuber > time_bypass_frame_num: + encoding_time = encoding_time[time_bypass_frame_num:] + decoding_time = decoding_time[time_bypass_frame_num:] + avg_encoding_time = sum(encoding_time)/len(encoding_time) + avg_decoding_time = sum(decoding_time)/len(decoding_time) + print(f"encoding/decoding {test_time_frame_numuber} frames, " + f"average encoding time {avg_encoding_time * 1000:.3f} ms, " + f"average decoding time {avg_decoding_time * 1000:.3f} ms.") + else: + avg_encoding_time = None + avg_decoding_time = None + + log_result = generate_log_json(frame_num, pic_height * pic_width, test_time, + frame_types, bits, psnrs, msssims, verbose=verbose_json, + avg_encoding_time=avg_encoding_time, + avg_decoding_time=avg_decoding_time,) + with open(args['curr_json_path'], 'w') as fp: + json.dump(log_result, fp, indent=2) + return log_result + + +i_frame_net = None # the model is initialized after each process is spawn, thus OK for multiprocess +p_frame_net = None + + +def worker(args): + global i_frame_net + global p_frame_net + + sub_dir_name = args['seq'] + bin_folder = os.path.join(args['stream_path'], args['ds_name']) + assert args['write_stream'], "" + create_folder(bin_folder, True) + + args['src_path'] = os.path.join(args['dataset_path'], sub_dir_name) + args['bin_folder'] = bin_folder + args['curr_bin_path'] = os.path.join(bin_folder, + f"{args['seq']}_q{args['qp_i']}.bin") + args['curr_rec_path'] = args['curr_bin_path'].replace('.bin', '.yuv') + args['curr_json_path'] = args['curr_bin_path'].replace('.bin', '.json') + + result = run_one_point_with_stream(p_frame_net, i_frame_net, args) + + result['ds_name'] = args['ds_name'] + result['seq'] = args['seq'] + result['rate_idx'] = args['rate_idx'] + result['qp_i'] = args['qp_i'] + result['qp_p'] = args['qp_p'] if 'qp_p' in args else args['qp_i'] + + return result + + +def init_func(args, gpu_num): + set_torch_env() + + process_name = multiprocessing.current_process().name + process_idx = int(process_name[process_name.rfind('-') + 1:]) + gpu_id = -1 + if gpu_num > 0: + gpu_id = process_idx % gpu_num + if gpu_id >= 0: + if args.cuda_idx is not None: + gpu_id = args.cuda_idx[gpu_id] + os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id) + device = "cuda:0" + else: + device = "cpu" + + global i_frame_net + i_frame_net = DMCI() + i_state_dict = get_state_dict(args.model_path_i) + i_frame_net.load_state_dict(i_state_dict) + i_frame_net = i_frame_net.to(device) + i_frame_net.eval() + i_frame_net.update(args.force_zero_thres) + i_frame_net.half() + + global p_frame_net + p_frame_net = DMC() + if not args.force_intra: + p_state_dict = get_state_dict(args.model_path_p) + p_frame_net.load_state_dict(p_state_dict) + p_frame_net = p_frame_net.to(device) + p_frame_net.eval() + p_frame_net.update(args.force_zero_thres) + p_frame_net.half() + + +def main(): + begin_time = time.time() + + args = parse_args() + + if args.force_zero_thres is not None and args.force_zero_thres < 0: + args.force_zero_thres = None + + if args.cuda_idx is not None: + cuda_device = ','.join([str(s) for s in args.cuda_idx]) + os.environ['CUDA_VISIBLE_DEVICES'] = cuda_device + + worker_num = args.worker + assert worker_num >= 1 + + with open(args.test_config) as f: + config = json.load(f) + + gpu_num = 0 + if args.cuda: + gpu_num = torch.cuda.device_count() + + multiprocessing.set_start_method("spawn") + threadpool_executor = concurrent.futures.ProcessPoolExecutor(max_workers=worker_num, + initializer=init_func, + initargs=(args, gpu_num)) + objs = [] + + count_frames = 0 + count_sequences = 0 + + rate_num = args.rate_num + qp_i = [] + if args.qp_i is not None: + assert len(args.qp_i) == rate_num + qp_i = args.qp_i + else: + assert 2 <= rate_num <= DMC.get_qp_num() + for i in np.linspace(0, DMC.get_qp_num() - 1, num=rate_num): + qp_i.append(int(i+0.5)) + + if not args.force_intra: + if args.qp_p is not None: + assert len(args.qp_p) == rate_num + qp_p = args.qp_p + else: + qp_p = qp_i + + print(f"testing {rate_num} rates, using qp: ", end='') + for q in qp_i: + print(f"{q}, ", end='') + print() + + root_path = args.force_root_path if args.force_root_path is not None else config['root_path'] + config = config['test_classes'] + for ds_name in config: + if config[ds_name]['test'] == 0: + continue + for seq in config[ds_name]['sequences']: + count_sequences += 1 + for rate_idx in range(rate_num): + cur_args = {} + cur_args['rate_idx'] = rate_idx + cur_args['qp_i'] = qp_i[rate_idx] + if not args.force_intra: + cur_args['qp_p'] = qp_p[rate_idx] + cur_args['force_intra'] = args.force_intra + cur_args['reset_interval'] = args.reset_interval + cur_args['seq'] = seq + cur_args['src_type'] = config[ds_name]['src_type'] + cur_args['src_height'] = config[ds_name]['sequences'][seq]['height'] + cur_args['src_width'] = config[ds_name]['sequences'][seq]['width'] + cur_args['intra_period'] = config[ds_name]['sequences'][seq]['intra_period'] + if args.force_intra: + cur_args['intra_period'] = 1 + if args.force_intra_period > 0: + cur_args['intra_period'] = args.force_intra_period + cur_args['frame_num'] = config[ds_name]['sequences'][seq]['frames'] + if args.force_frame_num > 0: + cur_args['frame_num'] = args.force_frame_num + cur_args['calc_ssim'] = args.calc_ssim + cur_args['dataset_path'] = os.path.join(root_path, config[ds_name]['base_path']) + cur_args['write_stream'] = args.write_stream + cur_args['check_existing'] = args.check_existing + cur_args['stream_path'] = args.stream_path + cur_args['save_decoded_frame'] = args.save_decoded_frame + cur_args['ds_name'] = ds_name + cur_args['verbose'] = args.verbose + cur_args['verbose_json'] = args.verbose_json + + count_frames += cur_args['frame_num'] + + obj = threadpool_executor.submit(worker, cur_args) + objs.append(obj) + + results = [] + for obj in tqdm(objs): + result = obj.result() + results.append(result) + + log_result = {} + for ds_name in config: + if config[ds_name]['test'] == 0: + continue + log_result[ds_name] = {} + for seq in config[ds_name]['sequences']: + log_result[ds_name][seq] = {} + + for res in results: + log_result[res['ds_name']][res['seq']][f"{res['rate_idx']:03d}"] = res + + out_json_dir = os.path.dirname(args.output_path) + if len(out_json_dir) > 0: + create_folder(out_json_dir, True) + with open(args.output_path, 'w') as fp: + dump_json(log_result, fp, float_digits=6, indent=2) + + total_minutes = (time.time() - begin_time) / 60 + print('Test finished') + print(f'Tested {count_frames} frames from {count_sequences} sequences') + print(f'Total elapsed time: {total_minutes:.1f} min') + + +if __name__ == "__main__": + main() diff --git a/DCVC-family/README.md b/DCVC-family/README.md index 0565ebf..364441f 100644 --- a/DCVC-family/README.md +++ b/DCVC-family/README.md @@ -103,7 +103,7 @@ Paper (arXiv) - Code + Code Checkpoints @@ -116,6 +116,24 @@

  • The first end-to-end neural video codec achieving 100+ FPS 1080p coding and 4K real-time coding with a comparable compression ratio with ECM. + + DCVC-UF + + Paper (arXiv) + + Code + Checkpoints + + + + Propose an Ultra-Fast neural video codec with a chunk-based coding framework that eliminates explicit motion vector coding. + + + + +
  • Chunk-based framework processes multiple frames simultaneously, achieving ultra-fast encoding and decoding speeds on general-purpose GPUs that scale automatically with GPU generations. + + EVC @@ -190,6 +208,14 @@ year={2025} } +@inproceedings{li2026ultra, + title={Ultra-Fast Neural Video Compression}, + author={Li, Jiahao and Xie, Wenxuan and Jia, Zhaoyang and Li, Bin and Guo, Zongyu and Zhang, Xiaoyi and Lu, Yan}, + booktitle={{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2026, Denver, CO, USA, June 3-7, 2026}, + year={2026} +} + @inproceedings{wang2023EVC, title={EVC: Towards Real-Time Neural Image Compression with Mask Decay}, author={Wang, Guo-Hua and Li, Jiahao and Li, Bin and Lu, Yan}, diff --git a/assets/RGB_different_settings.png b/DCVC-family/assets/RGB_different_settings.png similarity index 100% rename from assets/RGB_different_settings.png rename to DCVC-family/assets/RGB_different_settings.png diff --git a/assets/test_pipeline.png b/DCVC-family/assets/test_pipeline.png similarity index 100% rename from assets/test_pipeline.png rename to DCVC-family/assets/test_pipeline.png diff --git a/test_conditions.md b/DCVC-family/test_conditions.md similarity index 100% rename from test_conditions.md rename to DCVC-family/test_conditions.md diff --git a/NOTICE .txt b/NOTICE.txt similarity index 100% rename from NOTICE .txt rename to NOTICE.txt diff --git a/README.md b/README.md index c411e62..8e0f7f2 100644 --- a/README.md +++ b/README.md @@ -1,139 +1,134 @@
    -# DCVC-RT: Towards Practical Real-Time Neural Video Compression +# DCVC-UF: Ultra-Fast Neural Video Compression -**CVPR2025** +**CVPR2026**
    -[![page](https://img.shields.io/badge/Project-Page-blue?logo=github&logoSvg)](https://dcvccodec.github.io//) -[![arXiv](https://img.shields.io/badge/arXiv-2502.20762-b31b1b.svg)](https://arxiv.org/abs/2502.20762) +[![page](https://img.shields.io/badge/Project-Page-blue?logo=github)](https://dcvccodec.github.io/) +[![arXiv](https://img.shields.io/badge/arXiv-2606.04410-b31b1b.svg)](https://arxiv.org/abs/2606.04410) -**DCVC-RT is the first neural video codec (NVC) achieving 100+ FPS 1080p coding and 4K real-time coding with a comparable compression ratio with ECM. Beyond this, DCVC-RT pursue a more practical neural video codec solution and supports various practical features, including:** -- **Wide bitrate range in single model**: A single model enables continuous and controllable bitrate adjustments. DCVC-RT can compress at a wide bitrate range for different coding scenarios. -- **Rate control**: By adjusting quantization parameters, DCVC-RT effectively supports dynamic and various network conditions during real communication scenario. -- **Unified YUV and RGB coding**: While DCVC-RT is primarily optimized for the widely adopted YUV format, it can seamlessly adapt to RGB content coding. +> [!IMPORTANT] +> # 🎉 News: training code released — see [training.md](training.md). + +**DCVC-UF is an end-to-end neural video codec (NVC) introducing a chunk-based coding framework that achieves ultra-fast encoding and decoding speeds while maintaining high compression efficiency.** + +**DCVC-UF supports various practical features, including:** +- **Wide bitrate range in single model**: A single model with 64 QP levels enables continuous and fine-grained bitrate adjustments across a wide bitrate range. +- **Rate control**: By adjusting quantization parameters, DCVC-UF effectively supports dynamic and various network conditions during real communication scenario. +- **Unified YUV and RGB coding**: While DCVC-UF is primarily optimized for the widely adopted YUV420 format, it can seamlessly adapt to RGB content coding. We are continuously exploring additional practical functionalities and will provide further NVC solutions in this repository. ## :book: Overview -Welcome to the official implementation of DCVC-RT and the broader [DCVC-family](DCVC-family/README.md) models. The DCVC (Deep Contextual Video Compression) family is designed to push the boundaries of high-performance practical neural video codecs, delivering cutting-edge compression efficiency, real-time capabilities, and versatile functionalities. +Welcome to the official implementation of DCVC-UF and the broader [DCVC-family](DCVC-family/README.md) models. The DCVC (Deep Contextual Video Compression) family is designed to push the boundaries of high-performance practical neural video codecs, delivering cutting-edge compression efficiency, ultra-fast coding speeds, and versatile functionalities. -:rocket: In this section, we provide a brief overview of DCVC-RT. For an in-depth understanding, we encourage you to read our [paper](https://arxiv.org/abs/2502.20762). +:rocket: In this section, we provide a brief overview of DCVC-UF. For an in-depth understanding, we encourage you to read our [paper](https://arxiv.org/abs/2606.04410). -:hammer: Ready to get started? Head over to the [usage](#hammer-usage) to start using this repo. +:hammer: Ready to get started? Head over to the [usage](#hammer-usage) to start using this repo. :page_facing_up: If you find our work helpful, feel free to [cite](#page_facing_up-citation) us. We truly appreciate your support. - ### Abstract -We introduce a practical real-time neural video codec (NVC) designed to deliver high compression ratio, low latency and broad versatility. In practice, the coding speed of NVCs depends on 1) computational costs, and 2) non-computational operational costs, such as memory I/O and the number of function calls. While most efficient NVCs prioritize reducing computational cost, we identify operational cost as the primary bottleneck to achieving higher coding speed. Leveraging this insight, we introduce a set of efficiency-driven design improvements focused on minimizing operational costs. Specifically, we employ implicit temporal modeling to eliminate complex explicit motion modules, and use single low-resolution latent representations rather than progressive downsampling. These innovations significantly accelerate NVC without sacrificing compression quality. Additionally, we implement model integerization for consistent cross-device coding and a module-bank-based rate control scheme to improve practical adaptability. Experiments show our proposed DCVC-RT achieves an impressive average encoding/decoding speed at 125.2/112.8 fps (frames per second) for 1080p video, while saving an average of 21\% in bitrate compared to H.266/VTM. - +While neural video codecs (NVCs) have demonstrated superior compression ratio, their prohibitive computational complexity remains a critical barrier to real-world deployment. This paper introduces a chunk-based coding framework designed to significantly improve the rate-distortion-complexity trade-off. Instead of processing frames sequentially, our approach encodes a chunk of multiple frames into a single compact latent representation and decodes them simultaneously. This is enabled by cross-frame interaction modules for joint spatial-temporal modeling and frame-specific decoders for parallel reconstruction. This paradigm not only dramatically enhances coding throughput but also facilitates more effective modeling of long-term temporal correlations. To further boost speed, we propose a streamlined entropy coding mechanism that consolidates bit-stream interactions into a single step, substantially reducing decoding overhead. Building on these innovations, we present DCVC-UF (Ultra-Fast), a new NVC that sets a new SOTA in performance. Our experiments show that DCVC-UF can achieve ultra-fast encoding and decoding speeds, significantly outperforming previous leading codecs. DCVC-UF serves as a notable landmark in the journey of NVC evolution. Both training and testing codes will be released. ### Video Compression Performance -Bit saving over VTM-17.0 (UVG all frames with single intra-frame setting (i.e. intra-period = –1) and YUV420 colorspace.) - +Bit saving over VTM-17.0 on UVG (all frames, single intra-frame setting with intra-period = -1, YUV420 colorspace). -The BD-Rate and 1080p encoding/decoding speed on NVIDIA A100 GPU + - +BD-Rate and 1080p encoding/decoding speed on NVIDIA 4090 GPU: + -The complexity analysis and encoding/decoding speed evaluation across various resolutions and devices. +Complexity analysis and encoding/decoding speed across various resolutions and devices: - ### Image Compression Performance -Notably, the intra-frame codec in DCVC-RT also delivers impressive performance. On Kodak, DCVC-RT-Intra achieves an 11.1% bitrate reduction compared to VTM, with a over 10× faster decoding speed than previous state-of-the-art learned image codecs. For encoding, DCVC-RT-Intra also offers a similar speed advantage. For 1080p content, DCVC-RT-Intra achieves an impressive encoding/decoding speed of 40.7 FPS / 44.2 FPS on an NVIDIA A100 GPU. +Notably, the intra-frame codec in DCVC-UF also delivers impressive performance. On Kodak, DCVC-UF-Intra achieves an 10.6% bitrate reduction compared to VTM, with an over 40× faster decoding speed than previous state-of-the-art learned image codecs. For encoding, DCVC-UF-Intra also offers a similar speed advantage. For 1080p content, DCVC-UF-Intra achieves an impressive encoding/decoding speed of 81.5 FPS / 95.0 FPS on an NVIDIA A100 GPU. - ## :hammer: Usage -For each step, click it to expand and view details. +Click any step below to expand its details.
    - Prerequisites
    +Prerequisites
    * Python 3.12 and conda, get [Conda](https://www.anaconda.com/) -* CUDA 12.6 (other versions may also work. Make sure the CUDA version matches with pytorch.) -* pytorch (We have tested that pytorch-2.6 works. Other versions may also work.) +* CUDA 13.0 (other versions may also work. Make sure the CUDA version matches with pytorch.) +* pytorch (We have tested that pytorch-2.9.1 works. Other versions may also work.) * Environment ``` conda create -n $YOUR_PY_ENV_NAME python=3.12 conda activate $YOUR_PY_ENV_NAME - pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126 + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130 pip install -r requirements.txt ```
    +Build the project
    - Build the project
    +Two C++/CUDA extensions must be built: -Please build the C++ code to support bitstream writing and customized CUDA kernels to fuse operations. +1. **MLCodec_extensions_cpp** — rANS entropy coder (pybind11) +2. **inference_extensions_cuda** — Fused inference kernels (CUTLASS-based) ```bash -sudo apt-get install cmake g++ ninja-build -conda activate $YOUR_PY_ENV_NAME -cd ./src/cpp/ -pip install . +git clone https://github.com/NVIDIA/cutlass third_party/cutlass +cd third_party/cutlass +git checkout v4.4.1 +cd ../../src/cpp/ +bash install.sh cd ../layers/extensions/inference/ -pip install . +bash install.sh ``` - -If the CUDA kernels fail to load successfully in infererence, the standard output will display: ```cannot import cuda implementation for inference, fallback to pytorch.``` -
    +CPU performance scaling
    - CPU performance scaling
    +The arithmetic coding runs on the CPU. Make sure your CPU runs at maximum frequency while encoding/decoding actual bitstreams, otherwise the entropy coding may bottleneck throughput. After each reboot, the CPU scaling governor may reset. -Note that the arithmetic coding runs on the CPU, please make sure your CPU runs at high performance while writing the actual bitstream. Otherwise, the arithmetic coding may take a long time. - -Check the CPU frequency by -``` +Check current CPU frequency: +```bash grep -E '^model name|^cpu MHz' /proc/cpuinfo ``` -Run the following command to maximum CPU frequency -``` +Set high-performance mode: +```bash echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor ``` -Run the following command to recover the default frequency -``` +Restore default: +```bash echo ondemand | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor ``` -
    +Pretrained models
    - Pretrained models
    - -* Download [our pretrained models](https://1drv.ms/f/c/2866592d5c55df8c/Esu0KJ-I2kxCjEP565ARx_YB88i0UnR6XnODqFcvZs4LcA?e=by8CO8) and put them into ./checkpoints folder. -* There are 2 models, one for image coding and the other for video coding. +* Download [our pretrained models](https://1drv.ms/f/c/2866592d5c55df8c/IgAalzb_985lQ79GkXyW2P5OASPpZHHcrcGWEVQxO-mQCVg?e=qyvMN6) and put them into `./checkpoints` folder. +* There are 4 checkpoints, one for image coding and three for video coding (HT-L, HT-S, LD variants). * As a backup, all the pretrained models could be found [here](https://1drv.ms/f/c/2866592d5c55df8c/EozfVVwtWWYggCitBAAAAAABbT4z2Z10fMXISnan72UtSA?e=BID7DA). - -
    - - Test dataset
    +Test dataset
    We support arbitrary original resolution. The input video resolution will be padded automatically. The reconstructed video will be cropped back to the original size. The distortion (PSNR) is calculated at original resolution. @@ -141,44 +136,106 @@ We support arbitrary original resolution. The input video resolution will be pad Put *.yuv in the folder structure similar to the following structure. - /media/data/HEVC_B/ - - BQTerrace_1920x1080_60.yuv - - BasketballDrive_1920x1080_50.yuv - - ... - /media/data/HEVC_D/ - /media/data/HEVC_C/ - ... +``` +/data/test_sequences/ +├── UVG/ +│ ├── Beauty_1920x1080_120fps_420_8bit_YUV.yuv +│ ├── Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv +│ └── ... +├── MCL-JCV/ +│ ├── videoSRC01_1920x1080_30.yuv +│ └── ... +└── ... +``` -The dataset structure can be seen in dataset_config_example_yuv420.json. +The dataset structure can be seen in `test_cfg/all_yuv420.json`. #### RGB content -We highly suggest testing YUV420 content. To test RGB content, please refer to the [DCVC-FM](DCVC-family/DCVC-FM) folder. +Organize PNG sequences with numbered filenames (`im00001.png`, `im00002.png`, ...). The dataset structure can be seen in `test_cfg/all_RGB.json`.
    +Test the models
    + +```bash +python test_video.py \ + --model_path_i checkpoints/cvpr2026_image.pth.tar \ + --model_path_p checkpoints/cvpr2026_video_hts.pth.tar \ + --model_structure hts \ + --rate_num 4 \ + --test_config test_cfg/all_yuv420.json \ + --output_path output.json \ + --cuda_idx 0 \ + -w 1 \ + --verbose 0 \ + --skip_thres 0.15 \ + --force_intra 0 \ + --reset_interval 128 +``` - Test the models
    +**Parameters:** +- `--model_structure {htl, hts, ld}`: Select the video model variant (HT-L, HT-S, or LD). +- `--rate_num N`: Number of rate points to test. QP values are uniformly sampled from the 64 available levels. You can also specify exact QP values with `--qp_i` and `--qp_p`. +- `--cuda_idx ID [ID ...]`: GPU device indices to use (e.g., `--cuda_idx 0 1 3`). Workers are distributed across the specified GPUs. +- `-w N`: Number of parallel workers (processes). Workers are equally spread among GPUs. +- `--verbose {0, 1, 2}`: Timing verbosity. `0` = no timing, `1` = per-sequence summary, `2` = per-frame timing. +- `--skip_thres T`: Skip threshold for adaptive entropy coding (default: 0). +- `--force_intra 1`: Test image coding only (I-frames only). + +**Output:** A JSON file with per-sequence BPP, PSNR (RGB and YUV components), MS-SSIM, and encoding/decoding timing. +
    + +
    +Measure compression speed
    -Example to test pretrained model with four rate points: ```bash - python test_video.py --model_path_i ./checkpoints/cvpr2025_image.pth.tar --model_path_p ./checkpoints/cvpr2025_video.pth.tar --rate_num 4 --test_config ./dataset_config_example_yuv420.json --cuda 1 -w 1 --write_stream 1 --force_zero_thres 0.12 --output_path output.json --force_intra_period -1 --reset_interval 64 --force_frame_num -1 --check_existing 0 --verbose 0 +python test_compress_time.py --model_structure hts ``` -It is recommended that the ```-w``` number is equal to your GPU number. +**Parameters:** +- `--model_structure {htl, hts, ld}`: Select the video model variant (HT-L, HT-S, or LD). -You can also specify different ```--rate_num``` values (2~64) to test finer bitrate adjustment. +This runs the codec on a benchmark configuration and reports average encoding/decoding time (ms/frame) and throughput (fps), accounting for chunk size. -To measure coding speed, you can set ```--verbose``` value to `1` (sequence-level measuring) or `2` (frame-level measuring). This will automatically measure encoding and decoding speeds, print them in the terminal, and record the average speeds in ```avg_frame_encoding_time``` and ```avg_frame_decoding_time``` in the output JSON file. -- Note that ```test_time``` is the total testing time for the entire sequence, which includes I/O time, encoding time, decoding time, and distortion calculation time. The overhead from I/O and distortion calculation is much larger than the encoding/decoding time itself, so we exclude these overheads to measure the precise coding time. -- Additionally, please make sure ```time.time()``` provides sufficient precision on the tested platform. For instance, our experience is that the precision is adequate on our Ubuntu device, but insufficient on our Windows device. +> **⚠️ Note:** The coding speed has been profiled and optimized for the following resolutions: 3840x2160, 1920x1080, 1280x720, 832x480, and 416x240, on the following NVIDIA GPUs: 2080Ti, 4090, A100, H100, and B200. For other resolutions and devices, the coding speed is not guaranteed to be optimal.
    +Compare models (BD-rate)
    + +First test each model with `test_video.py` and save results to JSON files. Then compare: - On the comparison
    +```bash +python compare_bd_rate.py \ + --compare_between class \ + --compare_frame_type all \ + --output_path stdout \ + --base_method VTM \ + --log_paths VTM anchors/vtm_17.0_yuv420_LB_allf_ip0.json \ + DMC-test output.json \ + --plot_rd_curve 1 \ + --plot_path test_room/figs \ + --distortion_metrics psnr +``` + +**Parameters:** +- `--compare_between {class, sequence}`: Aggregate BD-rate by class or report per-sequence. +- `--compare_frame_type {default, all}`: Frame type for BD-rate comparison. `default` compares I-frame, P-frame, and all-frame separately; `all` compares all-frame only. +- `--output_path PATH`: Output destination. Use `stdout` to print to console, or specify a `.txt`/`.csv` file path. +- `--base_method NAME`: Name of the anchor method. Must match one of the names in `--log_paths`. +- `--log_paths NAME PATH [NAME PATH ...]`: Pairs of method name and JSON result file path (e.g., `VTM anchors/vtm_17.0_yuv420_LB_allf_ip0.json DMC output.json`). The anchor VTM_17.0 results are provided under `anchors/`. +- `--plot_rd_curve {0, 1}`: Set to `1` to generate RD curve plots (default: `1`). +- `--plot_path DIR`: Directory to save the RD curve plots. +- `--distortion_metrics`: One or more of `psnr`, `msssim`, `psnr_y`, `psnr_u`, `psnr_v`, `msssim_y`, `msssim_u`, `msssim_v`. + +For more arguments, refer to `compare_bd_rate.py`. +
    + +
    +On the comparison
    Please note that different methods may use different configurations to test different models, such as * Source video may be different, e.g., cropped or padded to the desired resolution. @@ -187,14 +244,13 @@ Please note that different methods may use different configurations to test diff So, it does not make sense to compare the numbers in different methods directly, unless making sure they are using same test conditions. -Please find more details on the [test conditions](./test_conditions.md). +Please find more details on the [test conditions](DCVC-family/test_conditions.md).
    - ## :clipboard: DCVC-family -DCVC-RT builds on the success of the DCVC family of models. The details of DCVC family models can be found in [DCVC-family](DCVC-family/README.md). +DCVC-UF builds on the success of the DCVC family of models. The details of DCVC family models can be found in [DCVC-family](DCVC-family/README.md). @@ -205,17 +261,17 @@ DCVC-RT builds on the success of the DCVC family of models. The details of DCVC - - + @@ -224,7 +280,7 @@ DCVC-RT builds on the success of the DCVC family of models. The details of DCVC @@ -233,7 +289,7 @@ DCVC-RT builds on the success of the DCVC family of models. The details of DCVC @@ -242,7 +298,7 @@ DCVC-RT builds on the success of the DCVC family of models. The details of DCVC @@ -251,16 +307,25 @@ DCVC-RT builds on the success of the DCVC family of models. The details of DCVC - + + + + + + + @@ -275,7 +340,7 @@ If you find this work useful for your research, please cite:
    - BibTeX (click to expand)
    +BibTeX (click to expand)
    ``` @article{li2021deep, @@ -321,10 +386,18 @@ If you find this work useful for your research, please cite: title={Towards Practical Real-Time Neural Video Compression}, author={Jia, Zhaoyang and Li, Bin and Li, Jiahao and Xie, Wenxuan and Qi, Linfeng and Li, Houqiang and Lu, Yan}, booktitle={{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, - {CVPR} 2025, Nashville, TN, USA, June 11-25, 2024}, + {CVPR} 2025, Nashville, TN, USA, June 11-15, 2025}, year={2025} } +@inproceedings{li2026ultra, + title={Ultra-Fast Neural Video Compression}, + author={Li, Jiahao and Xie, Wenxuan and Jia, Zhaoyang and Li, Bin and Guo, Zongyu and Zhang, Xiaoyi and Lu, Yan}, + booktitle={{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2026, Denver, CO, USA, June 3-7, 2026}, + year={2026} +} + @inproceedings{wang2023EVC, title={EVC: Towards Real-Time Neural Image Compression with Mask Decay}, author={Wang, Guo-Hua and Li, Jiahao and Li, Bin and Lu, Yan}, @@ -334,10 +407,9 @@ If you find this work useful for your research, please cite: ```
    - ## Acknowledgement -The implementation of DCVC-RT is based on [CompressAI](https://github.com/InterDigitalInc/CompressAI). +The implementation of DCVC-UF is based on [CompressAI](https://github.com/InterDigitalInc/CompressAI). ## Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies. diff --git a/anchors/vtm_17.0_yuv420_LB_allf_ip0.json b/anchors/vtm_17.0_yuv420_LB_allf_ip0.json new file mode 100644 index 0000000..c86f68f --- /dev/null +++ b/anchors/vtm_17.0_yuv420_LB_allf_ip0.json @@ -0,0 +1,19200 @@ +{ + "UVG": { + "Beauty_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.057281, + "ave_i_frame_psnr": 40.086706, + "ave_i_frame_msssim": 0.982000, + "ave_i_frame_psnr_y": 39.919552, + "ave_i_frame_psnr_u": 39.437203, + "ave_i_frame_psnr_v": 41.739133, + "ave_i_frame_msssim_y": 0.982587, + "ave_i_frame_msssim_u": 0.975404, + "ave_i_frame_msssim_v": 0.985074, + "test_time": 438611.844260, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.057281, + "ave_all_frame_psnr": 40.086706, + "ave_all_frame_msssim": 0.982000, + "ave_all_frame_psnr_y": 39.919552, + "ave_all_frame_psnr_u": 39.437203, + "ave_all_frame_psnr_v": 41.739133, + "ave_all_frame_msssim_y": 0.982587, + "ave_all_frame_msssim_u": 0.975404, + "ave_all_frame_msssim_v": 0.985074, + "qp": 22, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022714, + "ave_i_frame_psnr": 39.693770, + "ave_i_frame_msssim": 0.979285, + "ave_i_frame_psnr_y": 39.458265, + "ave_i_frame_psnr_u": 39.269646, + "ave_i_frame_psnr_v": 41.530927, + "ave_i_frame_msssim_y": 0.979465, + "ave_i_frame_msssim_u": 0.973671, + "ave_i_frame_msssim_v": 0.983817, + "test_time": 270763.891115, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022714, + "ave_all_frame_psnr": 39.693770, + "ave_all_frame_msssim": 0.979285, + "ave_all_frame_psnr_y": 39.458265, + "ave_all_frame_psnr_u": 39.269646, + "ave_all_frame_psnr_v": 41.530927, + "ave_all_frame_msssim_y": 0.979465, + "ave_all_frame_msssim_u": 0.973671, + "ave_all_frame_msssim_v": 0.983817, + "qp": 25, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013001, + "ave_i_frame_psnr": 39.320024, + "ave_i_frame_msssim": 0.977011, + "ave_i_frame_psnr_y": 39.016640, + "ave_i_frame_psnr_u": 39.153528, + "ave_i_frame_psnr_v": 41.306822, + "ave_i_frame_msssim_y": 0.976867, + "ave_i_frame_msssim_u": 0.972402, + "ave_i_frame_msssim_v": 0.982485, + "test_time": 179788.829250, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013001, + "ave_all_frame_psnr": 39.320024, + "ave_all_frame_msssim": 0.977011, + "ave_all_frame_psnr_y": 39.016640, + "ave_all_frame_psnr_u": 39.153528, + "ave_all_frame_psnr_v": 41.306822, + "ave_all_frame_msssim_y": 0.976867, + "ave_all_frame_msssim_u": 0.972402, + "ave_all_frame_msssim_v": 0.982485, + "qp": 28, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007820, + "ave_i_frame_psnr": 38.831207, + "ave_i_frame_msssim": 0.973920, + "ave_i_frame_psnr_y": 38.421320, + "ave_i_frame_psnr_u": 39.042295, + "ave_i_frame_psnr_v": 41.079441, + "ave_i_frame_msssim_y": 0.973193, + "ave_i_frame_msssim_u": 0.971156, + "ave_i_frame_msssim_v": 0.981041, + "test_time": 127217.051907, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007820, + "ave_all_frame_psnr": 38.831207, + "ave_all_frame_msssim": 0.973920, + "ave_all_frame_psnr_y": 38.421320, + "ave_all_frame_psnr_u": 39.042295, + "ave_all_frame_psnr_v": 41.079441, + "ave_all_frame_msssim_y": 0.973193, + "ave_all_frame_msssim_u": 0.971156, + "ave_all_frame_msssim_v": 0.981041, + "qp": 31, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005143, + "ave_i_frame_psnr": 38.315732, + "ave_i_frame_msssim": 0.970393, + "ave_i_frame_psnr_y": 37.803007, + "ave_i_frame_psnr_u": 38.891162, + "ave_i_frame_psnr_v": 40.816651, + "ave_i_frame_msssim_y": 0.969044, + "ave_i_frame_msssim_u": 0.969534, + "ave_i_frame_msssim_v": 0.979342, + "test_time": 91702.015444, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005143, + "ave_all_frame_psnr": 38.315732, + "ave_all_frame_msssim": 0.970393, + "ave_all_frame_psnr_y": 37.803007, + "ave_all_frame_psnr_u": 38.891162, + "ave_all_frame_psnr_v": 40.816651, + "ave_all_frame_msssim_y": 0.969044, + "ave_all_frame_msssim_u": 0.969534, + "ave_all_frame_msssim_v": 0.979342, + "qp": 34, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003365, + "ave_i_frame_psnr": 37.706438, + "ave_i_frame_msssim": 0.965954, + "ave_i_frame_psnr_y": 37.047296, + "ave_i_frame_psnr_u": 38.780999, + "ave_i_frame_psnr_v": 40.586729, + "ave_i_frame_msssim_y": 0.963510, + "ave_i_frame_msssim_u": 0.968627, + "ave_i_frame_msssim_v": 0.977947, + "test_time": 66045.032996, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003365, + "ave_all_frame_psnr": 37.706438, + "ave_all_frame_msssim": 0.965954, + "ave_all_frame_psnr_y": 37.047296, + "ave_all_frame_psnr_u": 38.780999, + "ave_all_frame_psnr_v": 40.586729, + "ave_all_frame_msssim_y": 0.963510, + "ave_all_frame_msssim_u": 0.968627, + "ave_all_frame_msssim_v": 0.977947, + "qp": 37, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002191, + "ave_i_frame_psnr": 36.978862, + "ave_i_frame_msssim": 0.960141, + "ave_i_frame_psnr_y": 36.159484, + "ave_i_frame_psnr_u": 38.581721, + "ave_i_frame_psnr_v": 40.292275, + "ave_i_frame_msssim_y": 0.956351, + "ave_i_frame_msssim_u": 0.966834, + "ave_i_frame_msssim_v": 0.976194, + "test_time": 47497.379169, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002191, + "ave_all_frame_psnr": 36.978862, + "ave_all_frame_msssim": 0.960141, + "ave_all_frame_psnr_y": 36.159484, + "ave_all_frame_psnr_u": 38.581721, + "ave_all_frame_psnr_v": 40.292275, + "ave_all_frame_msssim_y": 0.956351, + "ave_all_frame_msssim_u": 0.966834, + "ave_all_frame_msssim_v": 0.976194, + "qp": 40, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001427, + "ave_i_frame_psnr": 36.139181, + "ave_i_frame_msssim": 0.952728, + "ave_i_frame_psnr_y": 35.126616, + "ave_i_frame_psnr_u": 38.409231, + "ave_i_frame_psnr_v": 39.944522, + "ave_i_frame_msssim_y": 0.947037, + "ave_i_frame_msssim_u": 0.965271, + "ave_i_frame_msssim_v": 0.974331, + "test_time": 33310.434258, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001427, + "ave_all_frame_psnr": 36.139181, + "ave_all_frame_msssim": 0.952728, + "ave_all_frame_psnr_y": 35.126616, + "ave_all_frame_psnr_u": 38.409231, + "ave_all_frame_psnr_v": 39.944522, + "ave_all_frame_msssim_y": 0.947037, + "ave_all_frame_msssim_u": 0.965271, + "ave_all_frame_msssim_v": 0.974331, + "qp": 43, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000928, + "ave_i_frame_psnr": 35.141326, + "ave_i_frame_msssim": 0.943286, + "ave_i_frame_psnr_y": 33.978637, + "ave_i_frame_psnr_u": 37.992075, + "ave_i_frame_psnr_v": 39.266710, + "ave_i_frame_msssim_y": 0.935553, + "ave_i_frame_msssim_u": 0.962229, + "ave_i_frame_msssim_v": 0.970740, + "test_time": 23984.068861, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000928, + "ave_all_frame_psnr": 35.141326, + "ave_all_frame_msssim": 0.943286, + "ave_all_frame_psnr_y": 33.978637, + "ave_all_frame_psnr_u": 37.992075, + "ave_all_frame_psnr_v": 39.266710, + "ave_all_frame_msssim_y": 0.935553, + "ave_all_frame_msssim_u": 0.962229, + "ave_all_frame_msssim_v": 0.970740, + "qp": 46, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000615, + "ave_i_frame_psnr": 34.046788, + "ave_i_frame_msssim": 0.931729, + "ave_i_frame_psnr_y": 32.744176, + "ave_i_frame_psnr_u": 37.539338, + "ave_i_frame_psnr_v": 38.369908, + "ave_i_frame_msssim_y": 0.921673, + "ave_i_frame_msssim_u": 0.958241, + "ave_i_frame_msssim_v": 0.965555, + "test_time": 16269.382057, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000615, + "ave_all_frame_psnr": 34.046788, + "ave_all_frame_msssim": 0.931729, + "ave_all_frame_psnr_y": 32.744176, + "ave_all_frame_psnr_u": 37.539338, + "ave_all_frame_psnr_v": 38.369908, + "ave_all_frame_msssim_y": 0.921673, + "ave_all_frame_msssim_u": 0.958241, + "ave_all_frame_msssim_v": 0.965555, + "qp": 49, + "ds_name": "UVG", + "seq_name": "Beauty_1920x1080_120fps_420_8bit_YUV.yuv" + } + }, + "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.044333, + "ave_i_frame_psnr": 44.561905, + "ave_i_frame_msssim": 0.993870, + "ave_i_frame_psnr_y": 43.790797, + "ave_i_frame_psnr_u": 47.158810, + "ave_i_frame_psnr_v": 46.591651, + "ave_i_frame_msssim_y": 0.993627, + "ave_i_frame_msssim_u": 0.994798, + "ave_i_frame_msssim_v": 0.994394, + "test_time": 266150.980044, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.044333, + "ave_all_frame_psnr": 44.561905, + "ave_all_frame_msssim": 0.993870, + "ave_all_frame_psnr_y": 43.790797, + "ave_all_frame_psnr_u": 47.158810, + "ave_all_frame_psnr_v": 46.591651, + "ave_all_frame_msssim_y": 0.993627, + "ave_all_frame_msssim_u": 0.994798, + "ave_all_frame_msssim_v": 0.994394, + "qp": 22, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.024321, + "ave_i_frame_psnr": 43.036859, + "ave_i_frame_msssim": 0.990817, + "ave_i_frame_psnr_y": 42.059727, + "ave_i_frame_psnr_u": 46.213671, + "ave_i_frame_psnr_v": 45.722843, + "ave_i_frame_msssim_y": 0.990108, + "ave_i_frame_msssim_u": 0.993116, + "ave_i_frame_msssim_v": 0.992770, + "test_time": 182067.617304, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.024321, + "ave_all_frame_psnr": 43.036859, + "ave_all_frame_msssim": 0.990817, + "ave_all_frame_psnr_y": 42.059727, + "ave_all_frame_psnr_u": 46.213671, + "ave_all_frame_psnr_v": 45.722843, + "ave_all_frame_msssim_y": 0.990108, + "ave_all_frame_msssim_u": 0.993116, + "ave_all_frame_msssim_v": 0.992770, + "qp": 25, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013804, + "ave_i_frame_psnr": 41.533436, + "ave_i_frame_msssim": 0.986444, + "ave_i_frame_psnr_y": 40.376552, + "ave_i_frame_psnr_u": 45.235968, + "ave_i_frame_psnr_v": 44.772203, + "ave_i_frame_msssim_y": 0.984998, + "ave_i_frame_msssim_u": 0.990917, + "ave_i_frame_msssim_v": 0.990646, + "test_time": 129394.083917, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013804, + "ave_all_frame_psnr": 41.533436, + "ave_all_frame_msssim": 0.986444, + "ave_all_frame_psnr_y": 40.376552, + "ave_all_frame_psnr_u": 45.235968, + "ave_all_frame_psnr_v": 44.772203, + "ave_all_frame_msssim_y": 0.984998, + "ave_all_frame_msssim_u": 0.990917, + "ave_all_frame_msssim_v": 0.990646, + "qp": 28, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008057, + "ave_i_frame_psnr": 40.067835, + "ave_i_frame_msssim": 0.980271, + "ave_i_frame_psnr_y": 38.748155, + "ave_i_frame_psnr_u": 44.236811, + "ave_i_frame_psnr_v": 43.816940, + "ave_i_frame_msssim_y": 0.977715, + "ave_i_frame_msssim_u": 0.988037, + "ave_i_frame_msssim_v": 0.987835, + "test_time": 97506.566211, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008057, + "ave_all_frame_psnr": 40.067835, + "ave_all_frame_msssim": 0.980271, + "ave_all_frame_psnr_y": 38.748155, + "ave_all_frame_psnr_u": 44.236811, + "ave_all_frame_psnr_v": 43.816940, + "ave_all_frame_msssim_y": 0.977715, + "ave_all_frame_msssim_u": 0.988037, + "ave_all_frame_msssim_v": 0.987835, + "qp": 31, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004983, + "ave_i_frame_psnr": 38.745696, + "ave_i_frame_msssim": 0.972426, + "ave_i_frame_psnr_y": 37.352283, + "ave_i_frame_psnr_u": 43.175558, + "ave_i_frame_psnr_v": 42.676308, + "ave_i_frame_msssim_y": 0.968575, + "ave_i_frame_msssim_u": 0.984149, + "ave_i_frame_msssim_v": 0.983812, + "test_time": 74882.323953, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004983, + "ave_all_frame_psnr": 38.745696, + "ave_all_frame_msssim": 0.972426, + "ave_all_frame_psnr_y": 37.352283, + "ave_all_frame_psnr_u": 43.175558, + "ave_all_frame_psnr_v": 42.676308, + "ave_all_frame_msssim_y": 0.968575, + "ave_all_frame_msssim_u": 0.984149, + "ave_all_frame_msssim_v": 0.983812, + "qp": 34, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003058, + "ave_i_frame_psnr": 37.546661, + "ave_i_frame_msssim": 0.962572, + "ave_i_frame_psnr_y": 35.983577, + "ave_i_frame_psnr_u": 42.526985, + "ave_i_frame_psnr_v": 41.944842, + "ave_i_frame_msssim_y": 0.956401, + "ave_i_frame_msssim_u": 0.981507, + "ave_i_frame_msssim_v": 0.980667, + "test_time": 57263.352674, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003058, + "ave_all_frame_psnr": 37.546661, + "ave_all_frame_msssim": 0.962572, + "ave_all_frame_psnr_y": 35.983577, + "ave_all_frame_psnr_u": 42.526985, + "ave_all_frame_psnr_v": 41.944842, + "ave_all_frame_msssim_y": 0.956401, + "ave_all_frame_msssim_u": 0.981507, + "ave_all_frame_msssim_v": 0.980667, + "qp": 37, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001856, + "ave_i_frame_psnr": 36.341936, + "ave_i_frame_msssim": 0.949622, + "ave_i_frame_psnr_y": 34.635590, + "ave_i_frame_psnr_u": 41.737278, + "ave_i_frame_psnr_v": 41.184665, + "ave_i_frame_msssim_y": 0.940499, + "ave_i_frame_msssim_u": 0.977306, + "ave_i_frame_msssim_v": 0.976671, + "test_time": 43326.951577, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001856, + "ave_all_frame_psnr": 36.341936, + "ave_all_frame_msssim": 0.949622, + "ave_all_frame_psnr_y": 34.635590, + "ave_all_frame_psnr_u": 41.737278, + "ave_all_frame_psnr_v": 41.184665, + "ave_all_frame_msssim_y": 0.940499, + "ave_all_frame_msssim_u": 0.977306, + "ave_all_frame_msssim_v": 0.976671, + "qp": 40, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001135, + "ave_i_frame_psnr": 35.153548, + "ave_i_frame_msssim": 0.933040, + "ave_i_frame_psnr_y": 33.299693, + "ave_i_frame_psnr_u": 40.995894, + "ave_i_frame_psnr_v": 40.434331, + "ave_i_frame_msssim_y": 0.920099, + "ave_i_frame_msssim_u": 0.972212, + "ave_i_frame_msssim_v": 0.971513, + "test_time": 32125.452603, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001135, + "ave_all_frame_psnr": 35.153548, + "ave_all_frame_msssim": 0.933040, + "ave_all_frame_psnr_y": 33.299693, + "ave_all_frame_psnr_u": 40.995894, + "ave_all_frame_psnr_v": 40.434331, + "ave_all_frame_msssim_y": 0.920099, + "ave_all_frame_msssim_u": 0.972212, + "ave_all_frame_msssim_v": 0.971513, + "qp": 43, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000693, + "ave_i_frame_psnr": 33.863117, + "ave_i_frame_msssim": 0.912036, + "ave_i_frame_psnr_y": 31.998242, + "ave_i_frame_psnr_u": 39.911031, + "ave_i_frame_psnr_v": 39.004457, + "ave_i_frame_msssim_y": 0.894846, + "ave_i_frame_msssim_u": 0.965563, + "ave_i_frame_msssim_v": 0.961650, + "test_time": 23622.866571, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000693, + "ave_all_frame_psnr": 33.863117, + "ave_all_frame_msssim": 0.912036, + "ave_all_frame_psnr_y": 31.998242, + "ave_all_frame_psnr_u": 39.911031, + "ave_all_frame_psnr_v": 39.004457, + "ave_all_frame_msssim_y": 0.894846, + "ave_all_frame_msssim_u": 0.965563, + "ave_all_frame_msssim_v": 0.961650, + "qp": 46, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000419, + "ave_i_frame_psnr": 32.551293, + "ave_i_frame_msssim": 0.884488, + "ave_i_frame_psnr_y": 30.654222, + "ave_i_frame_psnr_u": 38.644912, + "ave_i_frame_psnr_v": 37.840097, + "ave_i_frame_msssim_y": 0.861852, + "ave_i_frame_msssim_u": 0.954137, + "ave_i_frame_msssim_v": 0.950656, + "test_time": 16198.147813, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000419, + "ave_all_frame_psnr": 32.551293, + "ave_all_frame_msssim": 0.884488, + "ave_all_frame_psnr_y": 30.654222, + "ave_all_frame_psnr_u": 38.644912, + "ave_all_frame_psnr_v": 37.840097, + "ave_all_frame_msssim_y": 0.861852, + "ave_all_frame_msssim_u": 0.954137, + "ave_all_frame_msssim_v": 0.950656, + "qp": 49, + "ds_name": "UVG", + "seq_name": "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv" + } + }, + "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003187, + "ave_i_frame_psnr": 43.233234, + "ave_i_frame_msssim": 0.993934, + "ave_i_frame_psnr_y": 42.989886, + "ave_i_frame_psnr_u": 43.915272, + "ave_i_frame_psnr_v": 44.011286, + "ave_i_frame_msssim_y": 0.994235, + "ave_i_frame_msssim_u": 0.994890, + "ave_i_frame_msssim_v": 0.991173, + "test_time": 60858.543941, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003187, + "ave_all_frame_psnr": 43.233234, + "ave_all_frame_msssim": 0.993934, + "ave_all_frame_psnr_y": 42.989886, + "ave_all_frame_psnr_u": 43.915272, + "ave_all_frame_psnr_v": 44.011286, + "ave_all_frame_msssim_y": 0.994235, + "ave_all_frame_msssim_u": 0.994890, + "ave_all_frame_msssim_v": 0.991173, + "qp": 22, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001686, + "ave_i_frame_psnr": 42.597645, + "ave_i_frame_msssim": 0.992705, + "ave_i_frame_psnr_y": 42.381829, + "ave_i_frame_psnr_u": 43.003866, + "ave_i_frame_psnr_v": 43.486322, + "ave_i_frame_msssim_y": 0.993141, + "ave_i_frame_msssim_u": 0.993503, + "ave_i_frame_msssim_v": 0.989289, + "test_time": 47899.719544, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001686, + "ave_all_frame_psnr": 42.597645, + "ave_all_frame_msssim": 0.992705, + "ave_all_frame_psnr_y": 42.381829, + "ave_all_frame_psnr_u": 43.003866, + "ave_all_frame_psnr_v": 43.486322, + "ave_all_frame_msssim_y": 0.993141, + "ave_all_frame_msssim_u": 0.993503, + "ave_all_frame_msssim_v": 0.989289, + "qp": 25, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001075, + "ave_i_frame_psnr": 41.842510, + "ave_i_frame_msssim": 0.990991, + "ave_i_frame_psnr_y": 41.685394, + "ave_i_frame_psnr_u": 41.828420, + "ave_i_frame_psnr_v": 42.799298, + "ave_i_frame_msssim_y": 0.991753, + "ave_i_frame_msssim_u": 0.991083, + "ave_i_frame_msssim_v": 0.986329, + "test_time": 41913.175858, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001075, + "ave_all_frame_psnr": 41.842510, + "ave_all_frame_msssim": 0.990991, + "ave_all_frame_psnr_y": 41.685394, + "ave_all_frame_psnr_u": 41.828420, + "ave_all_frame_psnr_v": 42.799298, + "ave_all_frame_msssim_y": 0.991753, + "ave_all_frame_msssim_u": 0.991083, + "ave_all_frame_msssim_v": 0.986329, + "qp": 28, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000735, + "ave_i_frame_psnr": 40.906861, + "ave_i_frame_msssim": 0.988385, + "ave_i_frame_psnr_y": 40.816814, + "ave_i_frame_psnr_u": 40.436321, + "ave_i_frame_psnr_v": 41.917687, + "ave_i_frame_msssim_y": 0.989696, + "ave_i_frame_msssim_u": 0.987170, + "ave_i_frame_msssim_v": 0.981731, + "test_time": 34147.852821, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000735, + "ave_all_frame_psnr": 40.906861, + "ave_all_frame_msssim": 0.988385, + "ave_all_frame_psnr_y": 40.816814, + "ave_all_frame_psnr_u": 40.436321, + "ave_all_frame_psnr_v": 41.917687, + "ave_all_frame_msssim_y": 0.989696, + "ave_all_frame_msssim_u": 0.987170, + "ave_all_frame_msssim_v": 0.981731, + "qp": 31, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000534, + "ave_i_frame_psnr": 39.790311, + "ave_i_frame_msssim": 0.984430, + "ave_i_frame_psnr_y": 39.756095, + "ave_i_frame_psnr_u": 38.826088, + "ave_i_frame_psnr_v": 40.959831, + "ave_i_frame_msssim_y": 0.986552, + "ave_i_frame_msssim_u": 0.980737, + "ave_i_frame_msssim_v": 0.975389, + "test_time": 29967.783154, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000534, + "ave_all_frame_psnr": 39.790311, + "ave_all_frame_msssim": 0.984430, + "ave_all_frame_psnr_y": 39.756095, + "ave_all_frame_psnr_u": 38.826088, + "ave_all_frame_psnr_v": 40.959831, + "ave_all_frame_msssim_y": 0.986552, + "ave_all_frame_msssim_u": 0.980737, + "ave_all_frame_msssim_v": 0.975389, + "qp": 34, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000400, + "ave_i_frame_psnr": 38.528869, + "ave_i_frame_msssim": 0.978889, + "ave_i_frame_psnr_y": 38.392297, + "ave_i_frame_psnr_u": 37.701400, + "ave_i_frame_psnr_v": 40.175774, + "ave_i_frame_msssim_y": 0.981288, + "ave_i_frame_msssim_u": 0.974312, + "ave_i_frame_msssim_v": 0.969077, + "test_time": 26886.759212, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000400, + "ave_all_frame_psnr": 38.528869, + "ave_all_frame_msssim": 0.978889, + "ave_all_frame_psnr_y": 38.392297, + "ave_all_frame_psnr_u": 37.701400, + "ave_all_frame_psnr_v": 40.175774, + "ave_all_frame_msssim_y": 0.981288, + "ave_all_frame_msssim_u": 0.974312, + "ave_all_frame_msssim_v": 0.969077, + "qp": 37, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000300, + "ave_i_frame_psnr": 37.133511, + "ave_i_frame_msssim": 0.970678, + "ave_i_frame_psnr_y": 36.859105, + "ave_i_frame_psnr_u": 36.476606, + "ave_i_frame_psnr_v": 39.436850, + "ave_i_frame_msssim_y": 0.973036, + "ave_i_frame_msssim_u": 0.965476, + "ave_i_frame_msssim_v": 0.961731, + "test_time": 23661.298141, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000300, + "ave_all_frame_psnr": 37.133511, + "ave_all_frame_msssim": 0.970678, + "ave_all_frame_psnr_y": 36.859105, + "ave_all_frame_psnr_u": 36.476606, + "ave_all_frame_psnr_v": 39.436850, + "ave_all_frame_msssim_y": 0.973036, + "ave_all_frame_msssim_u": 0.965476, + "ave_all_frame_msssim_v": 0.961731, + "qp": 40, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000230, + "ave_i_frame_psnr": 35.735345, + "ave_i_frame_msssim": 0.959614, + "ave_i_frame_psnr_y": 35.199398, + "ave_i_frame_psnr_u": 35.807430, + "ave_i_frame_psnr_v": 38.878941, + "ave_i_frame_msssim_y": 0.960263, + "ave_i_frame_msssim_u": 0.959802, + "ave_i_frame_msssim_v": 0.955528, + "test_time": 19035.342465, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000230, + "ave_all_frame_psnr": 35.735345, + "ave_all_frame_msssim": 0.959614, + "ave_all_frame_psnr_y": 35.199398, + "ave_all_frame_psnr_u": 35.807430, + "ave_all_frame_psnr_v": 38.878941, + "ave_all_frame_msssim_y": 0.960263, + "ave_all_frame_msssim_u": 0.959802, + "ave_all_frame_msssim_v": 0.955528, + "qp": 43, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000173, + "ave_i_frame_psnr": 34.058698, + "ave_i_frame_msssim": 0.940351, + "ave_i_frame_psnr_y": 33.415226, + "ave_i_frame_psnr_u": 33.989708, + "ave_i_frame_psnr_v": 37.988520, + "ave_i_frame_msssim_y": 0.940007, + "ave_i_frame_msssim_u": 0.938375, + "ave_i_frame_msssim_v": 0.944390, + "test_time": 15886.931332, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000173, + "ave_all_frame_psnr": 34.058698, + "ave_all_frame_msssim": 0.940351, + "ave_all_frame_psnr_y": 33.415226, + "ave_all_frame_psnr_u": 33.989708, + "ave_all_frame_psnr_v": 37.988520, + "ave_all_frame_msssim_y": 0.940007, + "ave_all_frame_msssim_u": 0.938375, + "ave_all_frame_msssim_v": 0.944390, + "qp": 46, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000133, + "ave_i_frame_psnr": 32.394306, + "ave_i_frame_msssim": 0.914152, + "ave_i_frame_psnr_y": 31.656720, + "ave_i_frame_psnr_u": 32.214577, + "ave_i_frame_psnr_v": 36.999558, + "ave_i_frame_msssim_y": 0.912647, + "ave_i_frame_msssim_u": 0.906276, + "ave_i_frame_msssim_v": 0.931058, + "test_time": 13236.859448, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000133, + "ave_all_frame_psnr": 32.394306, + "ave_all_frame_msssim": 0.914152, + "ave_all_frame_psnr_y": 31.656720, + "ave_all_frame_psnr_u": 32.214577, + "ave_all_frame_psnr_v": 36.999558, + "ave_all_frame_msssim_y": 0.912647, + "ave_all_frame_msssim_u": 0.906276, + "ave_all_frame_msssim_v": 0.931058, + "qp": 49, + "ds_name": "UVG", + "seq_name": "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv" + } + }, + "Jockey_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.028578, + "ave_i_frame_psnr": 43.830272, + "ave_i_frame_msssim": 0.992218, + "ave_i_frame_psnr_y": 43.480176, + "ave_i_frame_psnr_u": 45.062219, + "ave_i_frame_psnr_v": 44.698898, + "ave_i_frame_msssim_y": 0.992268, + "ave_i_frame_msssim_u": 0.992226, + "ave_i_frame_msssim_v": 0.991910, + "test_time": 292571.943246, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.028578, + "ave_all_frame_psnr": 43.830272, + "ave_all_frame_msssim": 0.992218, + "ave_all_frame_psnr_y": 43.480176, + "ave_all_frame_psnr_u": 45.062219, + "ave_all_frame_psnr_v": 44.698898, + "ave_all_frame_msssim_y": 0.992268, + "ave_all_frame_msssim_u": 0.992226, + "ave_all_frame_msssim_v": 0.991910, + "qp": 22, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017535, + "ave_i_frame_psnr": 43.104404, + "ave_i_frame_msssim": 0.990280, + "ave_i_frame_psnr_y": 42.739771, + "ave_i_frame_psnr_u": 44.308173, + "ave_i_frame_psnr_v": 44.088431, + "ave_i_frame_msssim_y": 0.990342, + "ave_i_frame_msssim_u": 0.990040, + "ave_i_frame_msssim_v": 0.990149, + "test_time": 206260.539688, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017535, + "ave_all_frame_psnr": 43.104404, + "ave_all_frame_msssim": 0.990280, + "ave_all_frame_psnr_y": 42.739771, + "ave_all_frame_psnr_u": 44.308173, + "ave_all_frame_psnr_v": 44.088431, + "ave_all_frame_msssim_y": 0.990342, + "ave_all_frame_msssim_u": 0.990040, + "ave_all_frame_msssim_v": 0.990149, + "qp": 25, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011407, + "ave_i_frame_psnr": 42.212438, + "ave_i_frame_msssim": 0.987484, + "ave_i_frame_psnr_y": 41.806164, + "ave_i_frame_psnr_u": 43.484127, + "ave_i_frame_psnr_v": 43.378397, + "ave_i_frame_msssim_y": 0.987479, + "ave_i_frame_msssim_u": 0.987224, + "ave_i_frame_msssim_v": 0.987775, + "test_time": 150859.106776, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011407, + "ave_all_frame_psnr": 42.212438, + "ave_all_frame_msssim": 0.987484, + "ave_all_frame_psnr_y": 41.806164, + "ave_all_frame_psnr_u": 43.484127, + "ave_all_frame_psnr_v": 43.378397, + "ave_all_frame_msssim_y": 0.987479, + "ave_all_frame_msssim_u": 0.987224, + "ave_all_frame_msssim_v": 0.987775, + "qp": 28, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007643, + "ave_i_frame_psnr": 41.145157, + "ave_i_frame_msssim": 0.983397, + "ave_i_frame_psnr_y": 40.632330, + "ave_i_frame_psnr_u": 42.694505, + "ave_i_frame_psnr_v": 42.672767, + "ave_i_frame_msssim_y": 0.983035, + "ave_i_frame_msssim_u": 0.983975, + "ave_i_frame_msssim_v": 0.984995, + "test_time": 112005.513074, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007643, + "ave_all_frame_psnr": 41.145157, + "ave_all_frame_msssim": 0.983397, + "ave_all_frame_psnr_y": 40.632330, + "ave_all_frame_psnr_u": 42.694505, + "ave_all_frame_psnr_v": 42.672767, + "ave_all_frame_msssim_y": 0.983035, + "ave_all_frame_msssim_u": 0.983975, + "ave_all_frame_msssim_v": 0.984995, + "qp": 31, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005445, + "ave_i_frame_psnr": 40.042578, + "ave_i_frame_msssim": 0.978099, + "ave_i_frame_psnr_y": 39.448421, + "ave_i_frame_psnr_u": 41.817070, + "ave_i_frame_psnr_v": 41.833025, + "ave_i_frame_msssim_y": 0.977306, + "ave_i_frame_msssim_u": 0.979819, + "ave_i_frame_msssim_v": 0.981139, + "test_time": 83942.315719, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005445, + "ave_all_frame_psnr": 40.042578, + "ave_all_frame_msssim": 0.978099, + "ave_all_frame_psnr_y": 39.448421, + "ave_all_frame_psnr_u": 41.817070, + "ave_all_frame_psnr_v": 41.833025, + "ave_all_frame_msssim_y": 0.977306, + "ave_all_frame_msssim_u": 0.979819, + "ave_all_frame_msssim_v": 0.981139, + "qp": 34, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003932, + "ave_i_frame_psnr": 38.906940, + "ave_i_frame_msssim": 0.971291, + "ave_i_frame_psnr_y": 38.107430, + "ave_i_frame_psnr_u": 41.295123, + "ave_i_frame_psnr_v": 41.315819, + "ave_i_frame_msssim_y": 0.969086, + "ave_i_frame_msssim_u": 0.977179, + "ave_i_frame_msssim_v": 0.978632, + "test_time": 64568.927609, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003932, + "ave_all_frame_psnr": 38.906940, + "ave_all_frame_msssim": 0.971291, + "ave_all_frame_psnr_y": 38.107430, + "ave_all_frame_psnr_u": 41.295123, + "ave_all_frame_psnr_v": 41.315819, + "ave_all_frame_msssim_y": 0.969086, + "ave_all_frame_msssim_u": 0.977179, + "ave_all_frame_msssim_v": 0.978632, + "qp": 37, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002811, + "ave_i_frame_psnr": 37.619907, + "ave_i_frame_msssim": 0.961677, + "ave_i_frame_psnr_y": 36.654549, + "ave_i_frame_psnr_u": 40.516910, + "ave_i_frame_psnr_v": 40.515050, + "ave_i_frame_msssim_y": 0.957753, + "ave_i_frame_msssim_u": 0.972618, + "ave_i_frame_msssim_v": 0.974279, + "test_time": 49603.265356, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002811, + "ave_all_frame_psnr": 37.619907, + "ave_all_frame_msssim": 0.961677, + "ave_all_frame_psnr_y": 36.654549, + "ave_all_frame_psnr_u": 40.516910, + "ave_all_frame_psnr_v": 40.515050, + "ave_all_frame_msssim_y": 0.957753, + "ave_all_frame_msssim_u": 0.972618, + "ave_all_frame_msssim_v": 0.974279, + "qp": 40, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002009, + "ave_i_frame_psnr": 36.260996, + "ave_i_frame_msssim": 0.949088, + "ave_i_frame_psnr_y": 35.105742, + "ave_i_frame_psnr_u": 39.706790, + "ave_i_frame_psnr_v": 39.746724, + "ave_i_frame_msssim_y": 0.942716, + "ave_i_frame_msssim_u": 0.967590, + "ave_i_frame_msssim_v": 0.968815, + "test_time": 38296.266539, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002009, + "ave_all_frame_psnr": 36.260996, + "ave_all_frame_msssim": 0.949088, + "ave_all_frame_psnr_y": 35.105742, + "ave_all_frame_psnr_u": 39.706790, + "ave_all_frame_psnr_v": 39.746724, + "ave_all_frame_msssim_y": 0.942716, + "ave_all_frame_msssim_u": 0.967590, + "ave_all_frame_msssim_v": 0.968815, + "qp": 43, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001420, + "ave_i_frame_psnr": 34.739630, + "ave_i_frame_msssim": 0.932632, + "ave_i_frame_psnr_y": 33.508061, + "ave_i_frame_psnr_u": 38.380665, + "ave_i_frame_psnr_v": 38.488006, + "ave_i_frame_msssim_y": 0.924039, + "ave_i_frame_msssim_u": 0.957308, + "ave_i_frame_msssim_v": 0.959513, + "test_time": 27224.308535, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001420, + "ave_all_frame_psnr": 34.739630, + "ave_all_frame_msssim": 0.932632, + "ave_all_frame_psnr_y": 33.508061, + "ave_all_frame_psnr_u": 38.380665, + "ave_all_frame_psnr_v": 38.488006, + "ave_all_frame_msssim_y": 0.924039, + "ave_all_frame_msssim_u": 0.957308, + "ave_all_frame_msssim_v": 0.959513, + "qp": 46, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001005, + "ave_i_frame_psnr": 33.163176, + "ave_i_frame_msssim": 0.912214, + "ave_i_frame_psnr_y": 31.844168, + "ave_i_frame_psnr_u": 37.038032, + "ave_i_frame_psnr_v": 37.202367, + "ave_i_frame_msssim_y": 0.901175, + "ave_i_frame_msssim_u": 0.943823, + "ave_i_frame_msssim_v": 0.946840, + "test_time": 18841.668138, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001005, + "ave_all_frame_psnr": 33.163176, + "ave_all_frame_msssim": 0.912214, + "ave_all_frame_psnr_y": 31.844168, + "ave_all_frame_psnr_u": 37.038032, + "ave_all_frame_psnr_v": 37.202367, + "ave_all_frame_msssim_y": 0.901175, + "ave_all_frame_msssim_u": 0.943823, + "ave_all_frame_msssim_v": 0.946840, + "qp": 49, + "ds_name": "UVG", + "seq_name": "Jockey_1920x1080_120fps_420_8bit_YUV.yuv" + } + }, + "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.072542, + "ave_i_frame_psnr": 43.724720, + "ave_i_frame_msssim": 0.995544, + "ave_i_frame_psnr_y": 43.341213, + "ave_i_frame_psnr_u": 44.940326, + "ave_i_frame_psnr_v": 44.810158, + "ave_i_frame_msssim_y": 0.996379, + "ave_i_frame_msssim_u": 0.993361, + "ave_i_frame_msssim_v": 0.992720, + "test_time": 308837.409075, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.072542, + "ave_all_frame_psnr": 43.724720, + "ave_all_frame_msssim": 0.995544, + "ave_all_frame_psnr_y": 43.341213, + "ave_all_frame_psnr_u": 44.940326, + "ave_all_frame_psnr_v": 44.810158, + "ave_all_frame_msssim_y": 0.996379, + "ave_all_frame_msssim_u": 0.993361, + "ave_all_frame_msssim_v": 0.992720, + "qp": 22, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.047015, + "ave_i_frame_psnr": 42.038006, + "ave_i_frame_msssim": 0.993378, + "ave_i_frame_psnr_y": 41.531442, + "ave_i_frame_psnr_u": 43.547506, + "ave_i_frame_psnr_v": 43.567889, + "ave_i_frame_msssim_y": 0.994570, + "ave_i_frame_msssim_u": 0.990031, + "ave_i_frame_msssim_v": 0.989570, + "test_time": 257364.923625, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.047015, + "ave_all_frame_psnr": 42.038006, + "ave_all_frame_msssim": 0.993378, + "ave_all_frame_psnr_y": 41.531442, + "ave_all_frame_psnr_u": 43.547506, + "ave_all_frame_psnr_v": 43.567889, + "ave_all_frame_msssim_y": 0.994570, + "ave_all_frame_msssim_u": 0.990031, + "ave_all_frame_msssim_v": 0.989570, + "qp": 25, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.030816, + "ave_i_frame_psnr": 40.260797, + "ave_i_frame_msssim": 0.989971, + "ave_i_frame_psnr_y": 39.598169, + "ave_i_frame_psnr_u": 42.155960, + "ave_i_frame_psnr_v": 42.341408, + "ave_i_frame_msssim_y": 0.991557, + "ave_i_frame_msssim_u": 0.985166, + "ave_i_frame_msssim_v": 0.985262, + "test_time": 208666.427645, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.030816, + "ave_all_frame_psnr": 40.260797, + "ave_all_frame_msssim": 0.989971, + "ave_all_frame_psnr_y": 39.598169, + "ave_all_frame_psnr_u": 42.155960, + "ave_all_frame_psnr_v": 42.341408, + "ave_all_frame_msssim_y": 0.991557, + "ave_all_frame_msssim_u": 0.985166, + "ave_all_frame_msssim_v": 0.985262, + "qp": 28, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.020396, + "ave_i_frame_psnr": 38.476574, + "ave_i_frame_msssim": 0.984893, + "ave_i_frame_psnr_y": 37.600196, + "ave_i_frame_psnr_u": 40.975587, + "ave_i_frame_psnr_v": 41.235829, + "ave_i_frame_msssim_y": 0.986650, + "ave_i_frame_msssim_u": 0.979265, + "ave_i_frame_msssim_v": 0.979976, + "test_time": 168922.027035, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.020396, + "ave_all_frame_psnr": 38.476574, + "ave_all_frame_msssim": 0.984893, + "ave_all_frame_psnr_y": 37.600196, + "ave_all_frame_psnr_u": 40.975587, + "ave_all_frame_psnr_v": 41.235829, + "ave_all_frame_msssim_y": 0.986650, + "ave_all_frame_msssim_u": 0.979265, + "ave_all_frame_msssim_v": 0.979976, + "qp": 31, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014270, + "ave_i_frame_psnr": 36.848589, + "ave_i_frame_msssim": 0.977878, + "ave_i_frame_psnr_y": 35.829947, + "ave_i_frame_psnr_u": 39.696436, + "ave_i_frame_psnr_v": 40.112597, + "ave_i_frame_msssim_y": 0.979923, + "ave_i_frame_msssim_u": 0.970498, + "ave_i_frame_msssim_v": 0.972993, + "test_time": 132065.551048, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014270, + "ave_all_frame_psnr": 36.848589, + "ave_all_frame_msssim": 0.977878, + "ave_all_frame_psnr_y": 35.829947, + "ave_all_frame_psnr_u": 39.696436, + "ave_all_frame_psnr_v": 40.112597, + "ave_all_frame_msssim_y": 0.979923, + "ave_all_frame_msssim_u": 0.970498, + "ave_all_frame_msssim_v": 0.972993, + "qp": 34, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009960, + "ave_i_frame_psnr": 35.274500, + "ave_i_frame_msssim": 0.968430, + "ave_i_frame_psnr_y": 34.059505, + "ave_i_frame_psnr_u": 38.818351, + "ave_i_frame_psnr_v": 39.020623, + "ave_i_frame_msssim_y": 0.969937, + "ave_i_frame_msssim_u": 0.963278, + "ave_i_frame_msssim_v": 0.964538, + "test_time": 102094.433715, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009960, + "ave_all_frame_psnr": 35.274500, + "ave_all_frame_msssim": 0.968430, + "ave_all_frame_psnr_y": 34.059505, + "ave_all_frame_psnr_u": 38.818351, + "ave_all_frame_psnr_v": 39.020623, + "ave_all_frame_msssim_y": 0.969937, + "ave_all_frame_msssim_u": 0.963278, + "ave_all_frame_msssim_v": 0.964538, + "qp": 37, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006830, + "ave_i_frame_psnr": 33.726246, + "ave_i_frame_msssim": 0.955211, + "ave_i_frame_psnr_y": 32.292872, + "ave_i_frame_psnr_u": 37.843415, + "ave_i_frame_psnr_v": 38.209325, + "ave_i_frame_msssim_y": 0.955426, + "ave_i_frame_msssim_u": 0.952622, + "ave_i_frame_msssim_v": 0.956511, + "test_time": 77056.241518, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006830, + "ave_all_frame_psnr": 33.726246, + "ave_all_frame_msssim": 0.955211, + "ave_all_frame_psnr_y": 32.292872, + "ave_all_frame_psnr_u": 37.843415, + "ave_all_frame_psnr_v": 38.209325, + "ave_all_frame_msssim_y": 0.955426, + "ave_all_frame_msssim_u": 0.952622, + "ave_all_frame_msssim_v": 0.956511, + "qp": 40, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004636, + "ave_i_frame_psnr": 32.227062, + "ave_i_frame_msssim": 0.937483, + "ave_i_frame_psnr_y": 30.564999, + "ave_i_frame_psnr_u": 36.963541, + "ave_i_frame_psnr_v": 37.462957, + "ave_i_frame_msssim_y": 0.935296, + "ave_i_frame_msssim_u": 0.940568, + "ave_i_frame_msssim_v": 0.947520, + "test_time": 57172.589699, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004636, + "ave_all_frame_psnr": 32.227062, + "ave_all_frame_msssim": 0.937483, + "ave_all_frame_psnr_y": 30.564999, + "ave_all_frame_psnr_u": 36.963541, + "ave_all_frame_psnr_v": 37.462957, + "ave_all_frame_msssim_y": 0.935296, + "ave_all_frame_msssim_u": 0.940568, + "ave_all_frame_msssim_v": 0.947520, + "qp": 43, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003075, + "ave_i_frame_psnr": 30.662752, + "ave_i_frame_msssim": 0.912649, + "ave_i_frame_psnr_y": 28.856560, + "ave_i_frame_psnr_u": 35.733213, + "ave_i_frame_psnr_v": 36.429444, + "ave_i_frame_msssim_y": 0.908393, + "ave_i_frame_msssim_u": 0.918551, + "ave_i_frame_msssim_v": 0.932285, + "test_time": 41196.943964, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003075, + "ave_all_frame_psnr": 30.662752, + "ave_all_frame_msssim": 0.912649, + "ave_all_frame_psnr_y": 28.856560, + "ave_all_frame_psnr_u": 35.733213, + "ave_all_frame_psnr_v": 36.429444, + "ave_all_frame_msssim_y": 0.908393, + "ave_all_frame_msssim_u": 0.918551, + "ave_all_frame_msssim_v": 0.932285, + "qp": 46, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002016, + "ave_i_frame_psnr": 29.138929, + "ave_i_frame_msssim": 0.881915, + "ave_i_frame_psnr_y": 27.188525, + "ave_i_frame_psnr_u": 34.619728, + "ave_i_frame_psnr_v": 35.360557, + "ave_i_frame_msssim_y": 0.873910, + "ave_i_frame_msssim_u": 0.896803, + "ave_i_frame_msssim_v": 0.915056, + "test_time": 28517.521221, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002016, + "ave_all_frame_psnr": 29.138929, + "ave_all_frame_msssim": 0.881915, + "ave_all_frame_psnr_y": 27.188525, + "ave_all_frame_psnr_u": 34.619728, + "ave_all_frame_psnr_v": 35.360557, + "ave_all_frame_msssim_y": 0.873910, + "ave_all_frame_msssim_u": 0.896803, + "ave_all_frame_msssim_v": 0.915056, + "qp": 49, + "ds_name": "UVG", + "seq_name": "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv" + } + }, + "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.095274, + "ave_i_frame_psnr": 42.238282, + "ave_i_frame_msssim": 0.992504, + "ave_i_frame_psnr_y": 41.866167, + "ave_i_frame_psnr_u": 43.175838, + "ave_i_frame_psnr_v": 43.533417, + "ave_i_frame_msssim_y": 0.993500, + "ave_i_frame_msssim_u": 0.989993, + "ave_i_frame_msssim_v": 0.989040, + "test_time": 196144.596869, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.095274, + "ave_all_frame_psnr": 42.238282, + "ave_all_frame_msssim": 0.992504, + "ave_all_frame_psnr_y": 41.866167, + "ave_all_frame_psnr_u": 43.175838, + "ave_all_frame_psnr_v": 43.533417, + "ave_all_frame_msssim_y": 0.993500, + "ave_all_frame_msssim_u": 0.989993, + "ave_all_frame_msssim_v": 0.989040, + "qp": 22, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.055177, + "ave_i_frame_psnr": 40.923664, + "ave_i_frame_msssim": 0.988866, + "ave_i_frame_psnr_y": 40.375098, + "ave_i_frame_psnr_u": 42.330628, + "ave_i_frame_psnr_v": 42.808094, + "ave_i_frame_msssim_y": 0.989720, + "ave_i_frame_msssim_u": 0.986644, + "ave_i_frame_msssim_v": 0.985967, + "test_time": 143256.435279, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.055177, + "ave_all_frame_psnr": 40.923664, + "ave_all_frame_msssim": 0.988866, + "ave_all_frame_psnr_y": 40.375098, + "ave_all_frame_psnr_u": 42.330628, + "ave_all_frame_psnr_v": 42.808094, + "ave_all_frame_msssim_y": 0.989720, + "ave_all_frame_msssim_u": 0.986644, + "ave_all_frame_msssim_v": 0.985967, + "qp": 25, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.030000, + "ave_i_frame_psnr": 39.508879, + "ave_i_frame_msssim": 0.982981, + "ave_i_frame_psnr_y": 38.761485, + "ave_i_frame_psnr_u": 41.408261, + "ave_i_frame_psnr_v": 42.093863, + "ave_i_frame_msssim_y": 0.983261, + "ave_i_frame_msssim_u": 0.982030, + "ave_i_frame_msssim_v": 0.982251, + "test_time": 103044.416312, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.030000, + "ave_all_frame_psnr": 39.508879, + "ave_all_frame_msssim": 0.982981, + "ave_all_frame_psnr_y": 38.761485, + "ave_all_frame_psnr_u": 41.408261, + "ave_all_frame_psnr_v": 42.093863, + "ave_all_frame_msssim_y": 0.983261, + "ave_all_frame_msssim_u": 0.982030, + "ave_all_frame_msssim_v": 0.982251, + "qp": 28, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014959, + "ave_i_frame_psnr": 38.053151, + "ave_i_frame_msssim": 0.973773, + "ave_i_frame_psnr_y": 37.089855, + "ave_i_frame_psnr_u": 40.479419, + "ave_i_frame_psnr_v": 41.406664, + "ave_i_frame_msssim_y": 0.972662, + "ave_i_frame_msssim_u": 0.976112, + "ave_i_frame_msssim_v": 0.978096, + "test_time": 70830.962078, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014959, + "ave_all_frame_psnr": 38.053151, + "ave_all_frame_msssim": 0.973773, + "ave_all_frame_psnr_y": 37.089855, + "ave_all_frame_psnr_u": 40.479419, + "ave_all_frame_psnr_v": 41.406664, + "ave_all_frame_msssim_y": 0.972662, + "ave_all_frame_msssim_u": 0.976112, + "ave_all_frame_msssim_v": 0.978096, + "qp": 31, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007790, + "ave_i_frame_psnr": 36.738817, + "ave_i_frame_msssim": 0.962677, + "ave_i_frame_psnr_y": 35.610734, + "ave_i_frame_psnr_u": 39.541931, + "ave_i_frame_psnr_v": 40.704202, + "ave_i_frame_msssim_y": 0.959969, + "ave_i_frame_msssim_u": 0.968609, + "ave_i_frame_msssim_v": 0.972995, + "test_time": 46245.194756, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007790, + "ave_all_frame_psnr": 36.738817, + "ave_all_frame_msssim": 0.962677, + "ave_all_frame_psnr_y": 35.610734, + "ave_all_frame_psnr_u": 39.541931, + "ave_all_frame_psnr_v": 40.704202, + "ave_all_frame_msssim_y": 0.959969, + "ave_all_frame_msssim_u": 0.968609, + "ave_all_frame_msssim_v": 0.972995, + "qp": 34, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003909, + "ave_i_frame_psnr": 35.490419, + "ave_i_frame_msssim": 0.949432, + "ave_i_frame_psnr_y": 34.147938, + "ave_i_frame_psnr_u": 38.913287, + "ave_i_frame_psnr_v": 40.122435, + "ave_i_frame_msssim_y": 0.944080, + "ave_i_frame_msssim_u": 0.962970, + "ave_i_frame_msssim_v": 0.968007, + "test_time": 30737.890053, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003909, + "ave_all_frame_psnr": 35.490419, + "ave_all_frame_msssim": 0.949432, + "ave_all_frame_psnr_y": 34.147938, + "ave_all_frame_psnr_u": 38.913287, + "ave_all_frame_psnr_v": 40.122435, + "ave_all_frame_msssim_y": 0.944080, + "ave_all_frame_msssim_u": 0.962970, + "ave_all_frame_msssim_v": 0.968007, + "qp": 37, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002080, + "ave_i_frame_psnr": 34.252598, + "ave_i_frame_msssim": 0.933414, + "ave_i_frame_psnr_y": 32.703531, + "ave_i_frame_psnr_u": 38.151093, + "ave_i_frame_psnr_v": 39.648507, + "ave_i_frame_msssim_y": 0.924914, + "ave_i_frame_msssim_u": 0.954170, + "ave_i_frame_msssim_v": 0.963663, + "test_time": 21904.302719, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002080, + "ave_all_frame_psnr": 34.252598, + "ave_all_frame_msssim": 0.933414, + "ave_all_frame_psnr_y": 32.703531, + "ave_all_frame_psnr_u": 38.151093, + "ave_all_frame_psnr_v": 39.648507, + "ave_all_frame_msssim_y": 0.924914, + "ave_all_frame_msssim_u": 0.954170, + "ave_all_frame_msssim_v": 0.963663, + "qp": 40, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001167, + "ave_i_frame_psnr": 33.024525, + "ave_i_frame_msssim": 0.911573, + "ave_i_frame_psnr_y": 31.234913, + "ave_i_frame_psnr_u": 37.596806, + "ave_i_frame_psnr_v": 39.189913, + "ave_i_frame_msssim_y": 0.897663, + "ave_i_frame_msssim_u": 0.947462, + "ave_i_frame_msssim_v": 0.959147, + "test_time": 16027.443484, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001167, + "ave_all_frame_psnr": 33.024525, + "ave_all_frame_msssim": 0.911573, + "ave_all_frame_psnr_y": 31.234913, + "ave_all_frame_psnr_u": 37.596806, + "ave_all_frame_psnr_v": 39.189913, + "ave_all_frame_msssim_y": 0.897663, + "ave_all_frame_msssim_u": 0.947462, + "ave_all_frame_msssim_v": 0.959147, + "qp": 43, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000698, + "ave_i_frame_psnr": 31.750718, + "ave_i_frame_msssim": 0.881326, + "ave_i_frame_psnr_y": 29.791464, + "ave_i_frame_psnr_u": 36.681559, + "ave_i_frame_psnr_v": 38.575402, + "ave_i_frame_msssim_y": 0.860607, + "ave_i_frame_msssim_u": 0.934568, + "ave_i_frame_msssim_v": 0.952398, + "test_time": 12358.642844, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000698, + "ave_all_frame_psnr": 31.750718, + "ave_all_frame_msssim": 0.881326, + "ave_all_frame_psnr_y": 29.791464, + "ave_all_frame_psnr_u": 36.681559, + "ave_all_frame_psnr_v": 38.575402, + "ave_all_frame_msssim_y": 0.860607, + "ave_all_frame_msssim_u": 0.934568, + "ave_all_frame_msssim_v": 0.952398, + "qp": 46, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000441, + "ave_i_frame_psnr": 30.442924, + "ave_i_frame_msssim": 0.841444, + "ave_i_frame_psnr_y": 28.351065, + "ave_i_frame_psnr_u": 35.607173, + "ave_i_frame_psnr_v": 37.829826, + "ave_i_frame_msssim_y": 0.811564, + "ave_i_frame_msssim_u": 0.917760, + "ave_i_frame_msssim_v": 0.944410, + "test_time": 9674.430823, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000441, + "ave_all_frame_psnr": 30.442924, + "ave_all_frame_msssim": 0.841444, + "ave_all_frame_psnr_y": 28.351065, + "ave_all_frame_psnr_u": 35.607173, + "ave_all_frame_psnr_v": 37.829826, + "ave_all_frame_msssim_y": 0.811564, + "ave_all_frame_msssim_u": 0.917760, + "ave_all_frame_msssim_v": 0.944410, + "qp": 49, + "ds_name": "UVG", + "seq_name": "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv" + } + }, + "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.160136, + "ave_i_frame_psnr": 43.499274, + "ave_i_frame_msssim": 0.993598, + "ave_i_frame_psnr_y": 42.882569, + "ave_i_frame_psnr_u": 45.891546, + "ave_i_frame_psnr_v": 44.807234, + "ave_i_frame_msssim_y": 0.993840, + "ave_i_frame_msssim_u": 0.993463, + "ave_i_frame_msssim_v": 0.992284, + "test_time": 409898.952615, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.160136, + "ave_all_frame_psnr": 43.499274, + "ave_all_frame_msssim": 0.993598, + "ave_all_frame_psnr_y": 42.882569, + "ave_all_frame_psnr_u": 45.891546, + "ave_all_frame_psnr_v": 44.807234, + "ave_all_frame_msssim_y": 0.993840, + "ave_all_frame_msssim_u": 0.993463, + "ave_all_frame_msssim_v": 0.992284, + "qp": 22, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.098683, + "ave_i_frame_psnr": 41.472721, + "ave_i_frame_msssim": 0.989425, + "ave_i_frame_psnr_y": 40.590103, + "ave_i_frame_psnr_u": 44.668099, + "ave_i_frame_psnr_v": 43.573050, + "ave_i_frame_msssim_y": 0.989262, + "ave_i_frame_msssim_u": 0.990680, + "ave_i_frame_msssim_v": 0.989152, + "test_time": 361984.190774, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.098683, + "ave_all_frame_psnr": 41.472721, + "ave_all_frame_msssim": 0.989425, + "ave_all_frame_psnr_y": 40.590103, + "ave_all_frame_psnr_u": 44.668099, + "ave_all_frame_psnr_v": 43.573050, + "ave_all_frame_msssim_y": 0.989262, + "ave_all_frame_msssim_u": 0.990680, + "ave_all_frame_msssim_v": 0.989152, + "qp": 25, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.059039, + "ave_i_frame_psnr": 39.458400, + "ave_i_frame_msssim": 0.982717, + "ave_i_frame_psnr_y": 38.283444, + "ave_i_frame_psnr_u": 43.540757, + "ave_i_frame_psnr_v": 42.425777, + "ave_i_frame_msssim_y": 0.981528, + "ave_i_frame_msssim_u": 0.987277, + "ave_i_frame_msssim_v": 0.985288, + "test_time": 284303.811971, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.059039, + "ave_all_frame_psnr": 39.458400, + "ave_all_frame_msssim": 0.982717, + "ave_all_frame_psnr_y": 38.283444, + "ave_all_frame_psnr_u": 43.540757, + "ave_all_frame_psnr_v": 42.425777, + "ave_all_frame_msssim_y": 0.981528, + "ave_all_frame_msssim_u": 0.987277, + "ave_all_frame_msssim_v": 0.985288, + "qp": 28, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.034248, + "ave_i_frame_psnr": 37.549551, + "ave_i_frame_msssim": 0.972724, + "ave_i_frame_psnr_y": 36.057727, + "ave_i_frame_psnr_u": 42.585083, + "ave_i_frame_psnr_v": 41.464962, + "ave_i_frame_msssim_y": 0.969451, + "ave_i_frame_msssim_u": 0.983738, + "ave_i_frame_msssim_v": 0.981348, + "test_time": 210332.182393, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.034248, + "ave_all_frame_psnr": 37.549551, + "ave_all_frame_msssim": 0.972724, + "ave_all_frame_psnr_y": 36.057727, + "ave_all_frame_psnr_u": 42.585083, + "ave_all_frame_psnr_v": 41.464962, + "ave_all_frame_msssim_y": 0.969451, + "ave_all_frame_msssim_u": 0.983738, + "ave_all_frame_msssim_v": 0.981348, + "qp": 31, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.021074, + "ave_i_frame_psnr": 36.024665, + "ave_i_frame_msssim": 0.961072, + "ave_i_frame_psnr_y": 34.356227, + "ave_i_frame_psnr_u": 41.586906, + "ave_i_frame_psnr_v": 40.473052, + "ave_i_frame_msssim_y": 0.955572, + "ave_i_frame_msssim_u": 0.978983, + "ave_i_frame_msssim_v": 0.976168, + "test_time": 161458.052346, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.021074, + "ave_all_frame_psnr": 36.024665, + "ave_all_frame_msssim": 0.961072, + "ave_all_frame_psnr_y": 34.356227, + "ave_all_frame_psnr_u": 41.586906, + "ave_all_frame_psnr_v": 40.473052, + "ave_all_frame_msssim_y": 0.955572, + "ave_all_frame_msssim_u": 0.978983, + "ave_all_frame_msssim_v": 0.976168, + "qp": 34, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012579, + "ave_i_frame_psnr": 34.669880, + "ave_i_frame_msssim": 0.946460, + "ave_i_frame_psnr_y": 32.755244, + "ave_i_frame_psnr_u": 41.017060, + "ave_i_frame_psnr_v": 39.810513, + "ave_i_frame_msssim_y": 0.937241, + "ave_i_frame_msssim_u": 0.975942, + "ave_i_frame_msssim_v": 0.972294, + "test_time": 116763.319219, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012579, + "ave_all_frame_psnr": 34.669880, + "ave_all_frame_msssim": 0.946460, + "ave_all_frame_psnr_y": 32.755244, + "ave_all_frame_psnr_u": 41.017060, + "ave_all_frame_psnr_v": 39.810513, + "ave_all_frame_msssim_y": 0.937241, + "ave_all_frame_msssim_u": 0.975942, + "ave_all_frame_msssim_v": 0.972294, + "qp": 37, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007236, + "ave_i_frame_psnr": 33.403288, + "ave_i_frame_msssim": 0.928191, + "ave_i_frame_psnr_y": 31.280699, + "ave_i_frame_psnr_u": 40.400614, + "ave_i_frame_psnr_v": 39.141493, + "ave_i_frame_msssim_y": 0.914320, + "ave_i_frame_msssim_u": 0.972046, + "ave_i_frame_msssim_v": 0.967566, + "test_time": 81357.452781, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007236, + "ave_all_frame_psnr": 33.403288, + "ave_all_frame_msssim": 0.928191, + "ave_all_frame_psnr_y": 31.280699, + "ave_all_frame_psnr_u": 40.400614, + "ave_all_frame_psnr_v": 39.141493, + "ave_all_frame_msssim_y": 0.914320, + "ave_all_frame_msssim_u": 0.972046, + "ave_all_frame_msssim_v": 0.967566, + "qp": 40, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004076, + "ave_i_frame_psnr": 32.257202, + "ave_i_frame_msssim": 0.906868, + "ave_i_frame_psnr_y": 29.952961, + "ave_i_frame_psnr_u": 39.818229, + "ave_i_frame_psnr_v": 38.521619, + "ave_i_frame_msssim_y": 0.887283, + "ave_i_frame_msssim_u": 0.968155, + "ave_i_frame_msssim_v": 0.963090, + "test_time": 56627.106617, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004076, + "ave_all_frame_psnr": 32.257202, + "ave_all_frame_msssim": 0.906868, + "ave_all_frame_psnr_y": 29.952961, + "ave_all_frame_psnr_u": 39.818229, + "ave_all_frame_psnr_v": 38.521619, + "ave_all_frame_msssim_y": 0.887283, + "ave_all_frame_msssim_u": 0.968155, + "ave_all_frame_msssim_v": 0.963090, + "qp": 43, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002234, + "ave_i_frame_psnr": 31.104927, + "ave_i_frame_msssim": 0.882020, + "ave_i_frame_psnr_y": 28.743504, + "ave_i_frame_psnr_u": 38.820797, + "ave_i_frame_psnr_v": 37.557593, + "ave_i_frame_msssim_y": 0.856963, + "ave_i_frame_msssim_u": 0.960177, + "ave_i_frame_msssim_v": 0.954207, + "test_time": 37161.943574, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002234, + "ave_all_frame_psnr": 31.104927, + "ave_all_frame_msssim": 0.882020, + "ave_all_frame_psnr_y": 28.743504, + "ave_all_frame_psnr_u": 38.820797, + "ave_all_frame_psnr_v": 37.557593, + "ave_all_frame_msssim_y": 0.856963, + "ave_all_frame_msssim_u": 0.960177, + "ave_all_frame_msssim_v": 0.954207, + "qp": 46, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001221, + "ave_i_frame_psnr": 30.069787, + "ave_i_frame_msssim": 0.855415, + "ave_i_frame_psnr_y": 27.637635, + "ave_i_frame_psnr_u": 38.131863, + "ave_i_frame_psnr_v": 36.600627, + "ave_i_frame_msssim_y": 0.824222, + "ave_i_frame_msssim_u": 0.953165, + "ave_i_frame_msssim_v": 0.944827, + "test_time": 23759.117367, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001221, + "ave_all_frame_psnr": 30.069787, + "ave_all_frame_msssim": 0.855415, + "ave_all_frame_psnr_y": 27.637635, + "ave_all_frame_psnr_u": 38.131863, + "ave_all_frame_psnr_v": 36.600627, + "ave_all_frame_msssim_y": 0.824222, + "ave_all_frame_msssim_u": 0.953165, + "ave_all_frame_msssim_v": 0.944827, + "qp": 49, + "ds_name": "UVG", + "seq_name": "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv" + } + } + }, + "MCL-JCV": { + "videoSRC01_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008460, + "ave_i_frame_psnr": 43.627400, + "ave_i_frame_msssim": 0.991955, + "ave_i_frame_psnr_y": 42.736563, + "ave_i_frame_psnr_u": 46.915014, + "ave_i_frame_psnr_v": 45.684806, + "ave_i_frame_msssim_y": 0.991549, + "ave_i_frame_msssim_u": 0.993962, + "ave_i_frame_msssim_v": 0.992386, + "test_time": 25400.664351, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008460, + "ave_all_frame_psnr": 43.627400, + "ave_all_frame_msssim": 0.991955, + "ave_all_frame_psnr_y": 42.736563, + "ave_all_frame_psnr_u": 46.915014, + "ave_all_frame_psnr_v": 45.684806, + "ave_all_frame_msssim_y": 0.991549, + "ave_all_frame_msssim_u": 0.993962, + "ave_all_frame_msssim_v": 0.992386, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004215, + "ave_i_frame_psnr": 43.232429, + "ave_i_frame_msssim": 0.990893, + "ave_i_frame_psnr_y": 42.290219, + "ave_i_frame_psnr_u": 46.637488, + "ave_i_frame_psnr_v": 45.480630, + "ave_i_frame_msssim_y": 0.990333, + "ave_i_frame_msssim_u": 0.993336, + "ave_i_frame_msssim_v": 0.991805, + "test_time": 17039.527409, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004215, + "ave_all_frame_psnr": 43.232429, + "ave_all_frame_msssim": 0.990893, + "ave_all_frame_psnr_y": 42.290219, + "ave_all_frame_psnr_u": 46.637488, + "ave_all_frame_psnr_v": 45.480630, + "ave_all_frame_msssim_y": 0.990333, + "ave_all_frame_msssim_u": 0.993336, + "ave_all_frame_msssim_v": 0.991805, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002511, + "ave_i_frame_psnr": 42.758909, + "ave_i_frame_msssim": 0.989471, + "ave_i_frame_psnr_y": 41.756416, + "ave_i_frame_psnr_u": 46.297959, + "ave_i_frame_psnr_v": 45.234816, + "ave_i_frame_msssim_y": 0.988685, + "ave_i_frame_msssim_u": 0.992554, + "ave_i_frame_msssim_v": 0.991102, + "test_time": 13340.014154, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002511, + "ave_all_frame_psnr": 42.758909, + "ave_all_frame_msssim": 0.989471, + "ave_all_frame_psnr_y": 41.756416, + "ave_all_frame_psnr_u": 46.297959, + "ave_all_frame_psnr_v": 45.234816, + "ave_all_frame_msssim_y": 0.988685, + "ave_all_frame_msssim_u": 0.992554, + "ave_all_frame_msssim_v": 0.991102, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001563, + "ave_i_frame_psnr": 42.168728, + "ave_i_frame_msssim": 0.987458, + "ave_i_frame_psnr_y": 41.113169, + "ave_i_frame_psnr_u": 45.794625, + "ave_i_frame_psnr_v": 44.876180, + "ave_i_frame_msssim_y": 0.986397, + "ave_i_frame_msssim_u": 0.991236, + "ave_i_frame_msssim_v": 0.990051, + "test_time": 9926.350919, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001563, + "ave_all_frame_psnr": 42.168728, + "ave_all_frame_msssim": 0.987458, + "ave_all_frame_psnr_y": 41.113169, + "ave_all_frame_psnr_u": 45.794625, + "ave_all_frame_psnr_v": 44.876180, + "ave_all_frame_msssim_y": 0.986397, + "ave_all_frame_msssim_u": 0.991236, + "ave_all_frame_msssim_v": 0.990051, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001046, + "ave_i_frame_psnr": 41.474184, + "ave_i_frame_msssim": 0.984579, + "ave_i_frame_psnr_y": 40.351672, + "ave_i_frame_psnr_u": 45.195257, + "ave_i_frame_psnr_v": 44.488181, + "ave_i_frame_msssim_y": 0.983023, + "ave_i_frame_msssim_u": 0.989649, + "ave_i_frame_msssim_v": 0.988840, + "test_time": 8019.964020, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001046, + "ave_all_frame_psnr": 41.474184, + "ave_all_frame_msssim": 0.984579, + "ave_all_frame_psnr_y": 40.351672, + "ave_all_frame_psnr_u": 45.195257, + "ave_all_frame_psnr_v": 44.488181, + "ave_all_frame_msssim_y": 0.983023, + "ave_all_frame_msssim_u": 0.989649, + "ave_all_frame_msssim_v": 0.988840, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000690, + "ave_i_frame_psnr": 40.745061, + "ave_i_frame_msssim": 0.981017, + "ave_i_frame_psnr_y": 39.500545, + "ave_i_frame_psnr_u": 44.845554, + "ave_i_frame_psnr_v": 44.111665, + "ave_i_frame_msssim_y": 0.978678, + "ave_i_frame_msssim_u": 0.988454, + "ave_i_frame_msssim_v": 0.987619, + "test_time": 6354.296414, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000690, + "ave_all_frame_psnr": 40.745061, + "ave_all_frame_msssim": 0.981017, + "ave_all_frame_psnr_y": 39.500545, + "ave_all_frame_psnr_u": 44.845554, + "ave_all_frame_psnr_v": 44.111665, + "ave_all_frame_msssim_y": 0.978678, + "ave_all_frame_msssim_u": 0.988454, + "ave_all_frame_msssim_v": 0.987619, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000465, + "ave_i_frame_psnr": 39.900199, + "ave_i_frame_msssim": 0.976087, + "ave_i_frame_psnr_y": 38.512013, + "ave_i_frame_psnr_u": 44.266360, + "ave_i_frame_psnr_v": 43.863153, + "ave_i_frame_msssim_y": 0.972614, + "ave_i_frame_msssim_u": 0.986422, + "ave_i_frame_msssim_v": 0.986589, + "test_time": 4854.206061, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000465, + "ave_all_frame_psnr": 39.900199, + "ave_all_frame_msssim": 0.976087, + "ave_all_frame_psnr_y": 38.512013, + "ave_all_frame_psnr_u": 44.266360, + "ave_all_frame_psnr_v": 43.863153, + "ave_all_frame_msssim_y": 0.972614, + "ave_all_frame_msssim_u": 0.986422, + "ave_all_frame_msssim_v": 0.986589, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000320, + "ave_i_frame_psnr": 38.958657, + "ave_i_frame_msssim": 0.969657, + "ave_i_frame_psnr_y": 37.402759, + "ave_i_frame_psnr_u": 43.755229, + "ave_i_frame_psnr_v": 43.497475, + "ave_i_frame_msssim_y": 0.964585, + "ave_i_frame_msssim_u": 0.984641, + "ave_i_frame_msssim_v": 0.985101, + "test_time": 3968.099341, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000320, + "ave_all_frame_psnr": 38.958657, + "ave_all_frame_msssim": 0.969657, + "ave_all_frame_psnr_y": 37.402759, + "ave_all_frame_psnr_u": 43.755229, + "ave_all_frame_psnr_v": 43.497475, + "ave_all_frame_msssim_y": 0.964585, + "ave_all_frame_msssim_u": 0.984641, + "ave_all_frame_msssim_v": 0.985101, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000229, + "ave_i_frame_psnr": 37.846999, + "ave_i_frame_msssim": 0.961455, + "ave_i_frame_psnr_y": 36.216936, + "ave_i_frame_psnr_u": 42.847373, + "ave_i_frame_psnr_v": 42.626997, + "ave_i_frame_msssim_y": 0.954612, + "ave_i_frame_msssim_u": 0.981892, + "ave_i_frame_msssim_v": 0.982072, + "test_time": 3549.350854, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000229, + "ave_all_frame_psnr": 37.846999, + "ave_all_frame_msssim": 0.961455, + "ave_all_frame_psnr_y": 36.216936, + "ave_all_frame_psnr_u": 42.847373, + "ave_all_frame_psnr_v": 42.626997, + "ave_all_frame_msssim_y": 0.954612, + "ave_all_frame_msssim_u": 0.981892, + "ave_all_frame_msssim_v": 0.982072, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000177, + "ave_i_frame_psnr": 36.638550, + "ave_i_frame_msssim": 0.951263, + "ave_i_frame_psnr_y": 34.955273, + "ave_i_frame_psnr_u": 41.987841, + "ave_i_frame_psnr_v": 41.388922, + "ave_i_frame_msssim_y": 0.942301, + "ave_i_frame_msssim_u": 0.978340, + "ave_i_frame_msssim_v": 0.977961, + "test_time": 3262.492706, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000177, + "ave_all_frame_psnr": 36.638550, + "ave_all_frame_msssim": 0.951263, + "ave_all_frame_psnr_y": 34.955273, + "ave_all_frame_psnr_u": 41.987841, + "ave_all_frame_psnr_v": 41.388922, + "ave_all_frame_msssim_y": 0.942301, + "ave_all_frame_msssim_u": 0.978340, + "ave_all_frame_msssim_v": 0.977961, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC01_1920x1080_30.yuv" + } + }, + "videoSRC02_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.036296, + "ave_i_frame_psnr": 46.971288, + "ave_i_frame_msssim": 0.996276, + "ave_i_frame_psnr_y": 46.261392, + "ave_i_frame_psnr_u": 48.586360, + "ave_i_frame_psnr_v": 49.615590, + "ave_i_frame_msssim_y": 0.996379, + "ave_i_frame_msssim_u": 0.995538, + "ave_i_frame_msssim_v": 0.996399, + "test_time": 66715.529829, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.036296, + "ave_all_frame_psnr": 46.971288, + "ave_all_frame_msssim": 0.996276, + "ave_all_frame_psnr_y": 46.261392, + "ave_all_frame_psnr_u": 48.586360, + "ave_all_frame_psnr_v": 49.615590, + "ave_all_frame_msssim_y": 0.996379, + "ave_all_frame_msssim_u": 0.995538, + "ave_all_frame_msssim_v": 0.996399, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.024355, + "ave_i_frame_psnr": 45.602952, + "ave_i_frame_msssim": 0.994561, + "ave_i_frame_psnr_y": 44.832364, + "ave_i_frame_psnr_u": 47.441260, + "ave_i_frame_psnr_v": 48.388170, + "ave_i_frame_msssim_y": 0.994639, + "ave_i_frame_msssim_u": 0.993743, + "ave_i_frame_msssim_v": 0.994909, + "test_time": 52770.676486, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.024355, + "ave_all_frame_psnr": 45.602952, + "ave_all_frame_msssim": 0.994561, + "ave_all_frame_psnr_y": 44.832364, + "ave_all_frame_psnr_u": 47.441260, + "ave_all_frame_psnr_v": 48.388170, + "ave_all_frame_msssim_y": 0.994639, + "ave_all_frame_msssim_u": 0.993743, + "ave_all_frame_msssim_v": 0.994909, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016548, + "ave_i_frame_psnr": 44.054754, + "ave_i_frame_msssim": 0.991987, + "ave_i_frame_psnr_y": 43.182274, + "ave_i_frame_psnr_u": 46.215609, + "ave_i_frame_psnr_v": 47.128778, + "ave_i_frame_msssim_y": 0.991951, + "ave_i_frame_msssim_u": 0.991290, + "ave_i_frame_msssim_v": 0.992897, + "test_time": 41069.117006, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016548, + "ave_all_frame_psnr": 44.054754, + "ave_all_frame_msssim": 0.991987, + "ave_all_frame_psnr_y": 43.182274, + "ave_all_frame_psnr_u": 46.215609, + "ave_all_frame_psnr_v": 47.128778, + "ave_all_frame_msssim_y": 0.991951, + "ave_all_frame_msssim_u": 0.991290, + "ave_all_frame_msssim_v": 0.992897, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011366, + "ave_i_frame_psnr": 42.386832, + "ave_i_frame_msssim": 0.988266, + "ave_i_frame_psnr_y": 41.335942, + "ave_i_frame_psnr_u": 45.114639, + "ave_i_frame_psnr_v": 45.964366, + "ave_i_frame_msssim_y": 0.987872, + "ave_i_frame_msssim_u": 0.988405, + "ave_i_frame_msssim_v": 0.990489, + "test_time": 31274.186900, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011366, + "ave_all_frame_psnr": 42.386832, + "ave_all_frame_msssim": 0.988266, + "ave_all_frame_psnr_y": 41.335942, + "ave_all_frame_psnr_u": 45.114639, + "ave_all_frame_psnr_v": 45.964366, + "ave_all_frame_msssim_y": 0.987872, + "ave_all_frame_msssim_u": 0.988405, + "ave_all_frame_msssim_v": 0.990489, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008269, + "ave_i_frame_psnr": 40.850195, + "ave_i_frame_msssim": 0.983489, + "ave_i_frame_psnr_y": 39.693703, + "ave_i_frame_psnr_u": 43.948162, + "ave_i_frame_psnr_v": 44.691175, + "ave_i_frame_msssim_y": 0.982760, + "ave_i_frame_msssim_u": 0.984277, + "ave_i_frame_msssim_v": 0.987070, + "test_time": 24507.563439, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008269, + "ave_all_frame_psnr": 40.850195, + "ave_all_frame_msssim": 0.983489, + "ave_all_frame_psnr_y": 39.693703, + "ave_all_frame_psnr_u": 43.948162, + "ave_all_frame_psnr_v": 44.691175, + "ave_all_frame_msssim_y": 0.982760, + "ave_all_frame_msssim_u": 0.984277, + "ave_all_frame_msssim_v": 0.987070, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006018, + "ave_i_frame_psnr": 39.351045, + "ave_i_frame_msssim": 0.977172, + "ave_i_frame_psnr_y": 37.945530, + "ave_i_frame_psnr_u": 43.051154, + "ave_i_frame_psnr_v": 44.084023, + "ave_i_frame_msssim_y": 0.975334, + "ave_i_frame_msssim_u": 0.980537, + "ave_i_frame_msssim_v": 0.984833, + "test_time": 19472.606483, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006018, + "ave_all_frame_psnr": 39.351045, + "ave_all_frame_msssim": 0.977172, + "ave_all_frame_psnr_y": 37.945530, + "ave_all_frame_psnr_u": 43.051154, + "ave_all_frame_psnr_v": 44.084023, + "ave_all_frame_msssim_y": 0.975334, + "ave_all_frame_msssim_u": 0.980537, + "ave_all_frame_msssim_v": 0.984833, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004334, + "ave_i_frame_psnr": 37.794819, + "ave_i_frame_msssim": 0.968272, + "ave_i_frame_psnr_y": 36.165666, + "ave_i_frame_psnr_u": 42.206346, + "ave_i_frame_psnr_v": 43.158211, + "ave_i_frame_msssim_y": 0.964698, + "ave_i_frame_msssim_u": 0.976592, + "ave_i_frame_msssim_v": 0.981394, + "test_time": 15290.303777, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004334, + "ave_all_frame_psnr": 37.794819, + "ave_all_frame_msssim": 0.968272, + "ave_all_frame_psnr_y": 36.165666, + "ave_all_frame_psnr_u": 42.206346, + "ave_all_frame_psnr_v": 43.158211, + "ave_all_frame_msssim_y": 0.964698, + "ave_all_frame_msssim_u": 0.976592, + "ave_all_frame_msssim_v": 0.981394, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003085, + "ave_i_frame_psnr": 36.188119, + "ave_i_frame_msssim": 0.955448, + "ave_i_frame_psnr_y": 34.311228, + "ave_i_frame_psnr_u": 41.302958, + "ave_i_frame_psnr_v": 42.334624, + "ave_i_frame_msssim_y": 0.948979, + "ave_i_frame_msssim_u": 0.971686, + "ave_i_frame_msssim_v": 0.978022, + "test_time": 11942.484753, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003085, + "ave_all_frame_psnr": 36.188119, + "ave_all_frame_msssim": 0.955448, + "ave_all_frame_psnr_y": 34.311228, + "ave_all_frame_psnr_u": 41.302958, + "ave_all_frame_psnr_v": 42.334624, + "ave_all_frame_msssim_y": 0.948979, + "ave_all_frame_msssim_u": 0.971686, + "ave_all_frame_msssim_v": 0.978022, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002141, + "ave_i_frame_psnr": 34.499612, + "ave_i_frame_msssim": 0.936757, + "ave_i_frame_psnr_y": 32.477196, + "ave_i_frame_psnr_u": 40.168145, + "ave_i_frame_psnr_v": 40.965575, + "ave_i_frame_msssim_y": 0.926535, + "ave_i_frame_msssim_u": 0.964072, + "ave_i_frame_msssim_v": 0.970772, + "test_time": 9185.822150, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002141, + "ave_all_frame_psnr": 34.499612, + "ave_all_frame_msssim": 0.936757, + "ave_all_frame_psnr_y": 32.477196, + "ave_all_frame_psnr_u": 40.168145, + "ave_all_frame_psnr_v": 40.965575, + "ave_all_frame_msssim_y": 0.926535, + "ave_all_frame_msssim_u": 0.964072, + "ave_all_frame_msssim_v": 0.970772, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001476, + "ave_i_frame_psnr": 32.795272, + "ave_i_frame_msssim": 0.912324, + "ave_i_frame_psnr_y": 30.647520, + "ave_i_frame_psnr_u": 38.899986, + "ave_i_frame_psnr_v": 39.577070, + "ave_i_frame_msssim_y": 0.896604, + "ave_i_frame_msssim_u": 0.955805, + "ave_i_frame_msssim_v": 0.963159, + "test_time": 7187.655349, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001476, + "ave_all_frame_psnr": 32.795272, + "ave_all_frame_msssim": 0.912324, + "ave_all_frame_psnr_y": 30.647520, + "ave_all_frame_psnr_u": 38.899986, + "ave_all_frame_psnr_v": 39.577070, + "ave_all_frame_msssim_y": 0.896604, + "ave_all_frame_msssim_u": 0.955805, + "ave_all_frame_msssim_v": 0.963159, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC02_1920x1080_30.yuv" + } + }, + "videoSRC03_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016512, + "ave_i_frame_psnr": 44.674786, + "ave_i_frame_msssim": 0.994988, + "ave_i_frame_psnr_y": 43.643915, + "ave_i_frame_psnr_u": 45.607158, + "ave_i_frame_psnr_v": 49.927639, + "ave_i_frame_msssim_y": 0.994919, + "ave_i_frame_msssim_u": 0.993734, + "ave_i_frame_msssim_v": 0.996660, + "test_time": 44236.307603, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016512, + "ave_all_frame_psnr": 44.674786, + "ave_all_frame_msssim": 0.994988, + "ave_all_frame_psnr_y": 43.643915, + "ave_all_frame_psnr_u": 45.607158, + "ave_all_frame_psnr_v": 49.927639, + "ave_all_frame_msssim_y": 0.994919, + "ave_all_frame_msssim_u": 0.993734, + "ave_all_frame_msssim_v": 0.996660, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011233, + "ave_i_frame_psnr": 43.624993, + "ave_i_frame_msssim": 0.993586, + "ave_i_frame_psnr_y": 42.506139, + "ave_i_frame_psnr_u": 44.759710, + "ave_i_frame_psnr_v": 49.203399, + "ave_i_frame_msssim_y": 0.993473, + "ave_i_frame_msssim_u": 0.992028, + "ave_i_frame_msssim_v": 0.995826, + "test_time": 35219.500954, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011233, + "ave_all_frame_psnr": 43.624993, + "ave_all_frame_msssim": 0.993586, + "ave_all_frame_psnr_y": 42.506139, + "ave_all_frame_psnr_u": 44.759710, + "ave_all_frame_psnr_v": 49.203399, + "ave_all_frame_msssim_y": 0.993473, + "ave_all_frame_msssim_u": 0.992028, + "ave_all_frame_msssim_v": 0.995826, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007313, + "ave_i_frame_psnr": 42.364952, + "ave_i_frame_msssim": 0.991305, + "ave_i_frame_psnr_y": 41.108959, + "ave_i_frame_psnr_u": 43.811653, + "ave_i_frame_psnr_v": 48.454210, + "ave_i_frame_msssim_y": 0.990992, + "ave_i_frame_msssim_u": 0.989662, + "ave_i_frame_msssim_v": 0.994822, + "test_time": 26010.653607, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007313, + "ave_all_frame_psnr": 42.364952, + "ave_all_frame_msssim": 0.991305, + "ave_all_frame_psnr_y": 41.108959, + "ave_all_frame_psnr_u": 43.811653, + "ave_all_frame_psnr_v": 48.454210, + "ave_all_frame_msssim_y": 0.990992, + "ave_all_frame_msssim_u": 0.989662, + "ave_all_frame_msssim_v": 0.994822, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004828, + "ave_i_frame_psnr": 40.989590, + "ave_i_frame_msssim": 0.987884, + "ave_i_frame_psnr_y": 39.589347, + "ave_i_frame_psnr_u": 42.820492, + "ave_i_frame_psnr_v": 47.560144, + "ave_i_frame_msssim_y": 0.987209, + "ave_i_frame_msssim_u": 0.986450, + "ave_i_frame_msssim_v": 0.993373, + "test_time": 20165.356066, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004828, + "ave_all_frame_psnr": 40.989590, + "ave_all_frame_msssim": 0.987884, + "ave_all_frame_psnr_y": 39.589347, + "ave_all_frame_psnr_u": 42.820492, + "ave_all_frame_psnr_v": 47.560144, + "ave_all_frame_msssim_y": 0.987209, + "ave_all_frame_msssim_u": 0.986450, + "ave_all_frame_msssim_v": 0.993373, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003356, + "ave_i_frame_psnr": 39.653661, + "ave_i_frame_msssim": 0.983264, + "ave_i_frame_psnr_y": 38.124906, + "ave_i_frame_psnr_u": 41.807025, + "ave_i_frame_psnr_v": 46.672826, + "ave_i_frame_msssim_y": 0.982017, + "ave_i_frame_msssim_u": 0.982169, + "ave_i_frame_msssim_v": 0.991847, + "test_time": 15768.632849, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003356, + "ave_all_frame_psnr": 39.653661, + "ave_all_frame_msssim": 0.983264, + "ave_all_frame_psnr_y": 38.124906, + "ave_all_frame_psnr_u": 41.807025, + "ave_all_frame_psnr_v": 46.672826, + "ave_all_frame_msssim_y": 0.982017, + "ave_all_frame_msssim_u": 0.982169, + "ave_all_frame_msssim_v": 0.991847, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002329, + "ave_i_frame_psnr": 38.335563, + "ave_i_frame_msssim": 0.976878, + "ave_i_frame_psnr_y": 36.610457, + "ave_i_frame_psnr_u": 40.886445, + "ave_i_frame_psnr_v": 46.135316, + "ave_i_frame_msssim_y": 0.974424, + "ave_i_frame_msssim_u": 0.977961, + "ave_i_frame_msssim_v": 0.990516, + "test_time": 12881.451721, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002329, + "ave_all_frame_psnr": 38.335563, + "ave_all_frame_msssim": 0.976878, + "ave_all_frame_psnr_y": 36.610457, + "ave_all_frame_psnr_u": 40.886445, + "ave_all_frame_psnr_v": 46.135316, + "ave_all_frame_msssim_y": 0.974424, + "ave_all_frame_msssim_u": 0.977961, + "ave_all_frame_msssim_v": 0.990516, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001628, + "ave_i_frame_psnr": 37.010707, + "ave_i_frame_msssim": 0.967405, + "ave_i_frame_psnr_y": 35.046460, + "ave_i_frame_psnr_u": 40.170780, + "ave_i_frame_psnr_v": 45.636119, + "ave_i_frame_msssim_y": 0.962676, + "ave_i_frame_msssim_u": 0.973271, + "ave_i_frame_msssim_v": 0.989913, + "test_time": 10318.691969, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001628, + "ave_all_frame_psnr": 37.010707, + "ave_all_frame_msssim": 0.967405, + "ave_all_frame_psnr_y": 35.046460, + "ave_all_frame_psnr_u": 40.170780, + "ave_all_frame_psnr_v": 45.636119, + "ave_all_frame_msssim_y": 0.962676, + "ave_all_frame_msssim_u": 0.973271, + "ave_all_frame_msssim_v": 0.989913, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001147, + "ave_i_frame_psnr": 35.719287, + "ave_i_frame_msssim": 0.954029, + "ave_i_frame_psnr_y": 33.511820, + "ave_i_frame_psnr_u": 39.633745, + "ave_i_frame_psnr_v": 45.049628, + "ave_i_frame_msssim_y": 0.945774, + "ave_i_frame_msssim_u": 0.968962, + "ave_i_frame_msssim_v": 0.988629, + "test_time": 8020.057268, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001147, + "ave_all_frame_psnr": 35.719287, + "ave_all_frame_msssim": 0.954029, + "ave_all_frame_psnr_y": 33.511820, + "ave_all_frame_psnr_u": 39.633745, + "ave_all_frame_psnr_v": 45.049628, + "ave_all_frame_msssim_y": 0.945774, + "ave_all_frame_msssim_u": 0.968962, + "ave_all_frame_msssim_v": 0.988629, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000789, + "ave_i_frame_psnr": 34.241492, + "ave_i_frame_msssim": 0.933520, + "ave_i_frame_psnr_y": 31.908880, + "ave_i_frame_psnr_u": 38.560157, + "ave_i_frame_psnr_v": 43.918501, + "ave_i_frame_msssim_y": 0.920493, + "ave_i_frame_msssim_u": 0.959207, + "ave_i_frame_msssim_v": 0.985994, + "test_time": 6293.672657, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000789, + "ave_all_frame_psnr": 34.241492, + "ave_all_frame_msssim": 0.933520, + "ave_all_frame_psnr_y": 31.908880, + "ave_all_frame_psnr_u": 38.560157, + "ave_all_frame_psnr_v": 43.918501, + "ave_all_frame_msssim_y": 0.920493, + "ave_all_frame_msssim_u": 0.959207, + "ave_all_frame_msssim_v": 0.985994, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000530, + "ave_i_frame_psnr": 32.681901, + "ave_i_frame_msssim": 0.900873, + "ave_i_frame_psnr_y": 30.166721, + "ave_i_frame_psnr_u": 37.487656, + "ave_i_frame_psnr_v": 42.967231, + "ave_i_frame_msssim_y": 0.879126, + "ave_i_frame_msssim_u": 0.948146, + "ave_i_frame_msssim_v": 0.984079, + "test_time": 4981.863747, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000530, + "ave_all_frame_psnr": 32.681901, + "ave_all_frame_msssim": 0.900873, + "ave_all_frame_psnr_y": 30.166721, + "ave_all_frame_psnr_u": 37.487656, + "ave_all_frame_psnr_v": 42.967231, + "ave_all_frame_msssim_y": 0.879126, + "ave_all_frame_msssim_u": 0.948146, + "ave_all_frame_msssim_v": 0.984079, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC03_1920x1080_30.yuv" + } + }, + "videoSRC04_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.405771, + "ave_i_frame_psnr": 43.465071, + "ave_i_frame_msssim": 0.992921, + "ave_i_frame_psnr_y": 42.628998, + "ave_i_frame_psnr_u": 44.423423, + "ave_i_frame_psnr_v": 47.523158, + "ave_i_frame_msssim_y": 0.993450, + "ave_i_frame_msssim_u": 0.989079, + "ave_i_frame_msssim_v": 0.993590, + "test_time": 187127.385715, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.405771, + "ave_all_frame_psnr": 43.465071, + "ave_all_frame_msssim": 0.992921, + "ave_all_frame_psnr_y": 42.628998, + "ave_all_frame_psnr_u": 44.423423, + "ave_all_frame_psnr_v": 47.523158, + "ave_all_frame_msssim_y": 0.993450, + "ave_all_frame_msssim_u": 0.989079, + "ave_all_frame_msssim_v": 0.993590, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.263125, + "ave_i_frame_psnr": 41.356769, + "ave_i_frame_msssim": 0.987580, + "ave_i_frame_psnr_y": 40.202819, + "ave_i_frame_psnr_u": 43.177103, + "ave_i_frame_psnr_v": 46.460137, + "ave_i_frame_msssim_y": 0.987549, + "ave_i_frame_msssim_u": 0.983822, + "ave_i_frame_msssim_v": 0.991528, + "test_time": 157144.758463, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.263125, + "ave_all_frame_psnr": 41.356769, + "ave_all_frame_msssim": 0.987580, + "ave_all_frame_psnr_y": 40.202819, + "ave_all_frame_psnr_u": 43.177103, + "ave_all_frame_psnr_v": 46.460137, + "ave_all_frame_msssim_y": 0.987549, + "ave_all_frame_msssim_u": 0.983822, + "ave_all_frame_msssim_v": 0.991528, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.162454, + "ave_i_frame_psnr": 39.401959, + "ave_i_frame_msssim": 0.979034, + "ave_i_frame_psnr_y": 37.867335, + "ave_i_frame_psnr_u": 42.349587, + "ave_i_frame_psnr_v": 45.662076, + "ave_i_frame_msssim_y": 0.977116, + "ave_i_frame_msssim_u": 0.979777, + "ave_i_frame_msssim_v": 0.989797, + "test_time": 131304.015707, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.162454, + "ave_all_frame_psnr": 39.401959, + "ave_all_frame_msssim": 0.979034, + "ave_all_frame_psnr_y": 37.867335, + "ave_all_frame_psnr_u": 42.349587, + "ave_all_frame_psnr_v": 45.662076, + "ave_all_frame_msssim_y": 0.977116, + "ave_all_frame_msssim_u": 0.979777, + "ave_all_frame_msssim_v": 0.989797, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.095359, + "ave_i_frame_psnr": 37.614019, + "ave_i_frame_msssim": 0.965862, + "ave_i_frame_psnr_y": 35.674452, + "ave_i_frame_psnr_u": 41.853995, + "ave_i_frame_psnr_v": 45.011450, + "ave_i_frame_msssim_y": 0.960179, + "ave_i_frame_msssim_u": 0.977324, + "ave_i_frame_msssim_v": 0.988501, + "test_time": 101841.506240, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.095359, + "ave_all_frame_psnr": 37.614019, + "ave_all_frame_msssim": 0.965862, + "ave_all_frame_psnr_y": 35.674452, + "ave_all_frame_psnr_u": 41.853995, + "ave_all_frame_psnr_v": 45.011450, + "ave_all_frame_msssim_y": 0.960179, + "ave_all_frame_msssim_u": 0.977324, + "ave_all_frame_msssim_v": 0.988501, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.058990, + "ave_i_frame_psnr": 36.246725, + "ave_i_frame_msssim": 0.951381, + "ave_i_frame_psnr_y": 34.065744, + "ave_i_frame_psnr_u": 41.320320, + "ave_i_frame_psnr_v": 44.259016, + "ave_i_frame_msssim_y": 0.941706, + "ave_i_frame_msssim_u": 0.974119, + "ave_i_frame_msssim_v": 0.986689, + "test_time": 76530.304151, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.058990, + "ave_all_frame_psnr": 36.246725, + "ave_all_frame_msssim": 0.951381, + "ave_all_frame_psnr_y": 34.065744, + "ave_all_frame_psnr_u": 41.320320, + "ave_all_frame_psnr_v": 44.259016, + "ave_all_frame_msssim_y": 0.941706, + "ave_all_frame_msssim_u": 0.974119, + "ave_all_frame_msssim_v": 0.986689, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.034165, + "ave_i_frame_psnr": 34.915586, + "ave_i_frame_msssim": 0.932282, + "ave_i_frame_psnr_y": 32.559207, + "ave_i_frame_psnr_u": 40.310593, + "ave_i_frame_psnr_v": 43.658856, + "ave_i_frame_msssim_y": 0.917688, + "ave_i_frame_msssim_u": 0.967194, + "ave_i_frame_msssim_v": 0.984936, + "test_time": 57689.054710, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.034165, + "ave_all_frame_psnr": 34.915586, + "ave_all_frame_msssim": 0.932282, + "ave_all_frame_psnr_y": 32.559207, + "ave_all_frame_psnr_u": 40.310593, + "ave_all_frame_psnr_v": 43.658856, + "ave_all_frame_msssim_y": 0.917688, + "ave_all_frame_msssim_u": 0.967194, + "ave_all_frame_msssim_v": 0.984936, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.018486, + "ave_i_frame_psnr": 33.775189, + "ave_i_frame_msssim": 0.909512, + "ave_i_frame_psnr_y": 31.188181, + "ave_i_frame_psnr_u": 39.984320, + "ave_i_frame_psnr_v": 43.088111, + "ave_i_frame_msssim_y": 0.887817, + "ave_i_frame_msssim_u": 0.965672, + "ave_i_frame_msssim_v": 0.983527, + "test_time": 41618.691309, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.018486, + "ave_all_frame_psnr": 33.775189, + "ave_all_frame_msssim": 0.909512, + "ave_all_frame_psnr_y": 31.188181, + "ave_all_frame_psnr_u": 39.984320, + "ave_all_frame_psnr_v": 43.088111, + "ave_all_frame_msssim_y": 0.887817, + "ave_all_frame_msssim_u": 0.965672, + "ave_all_frame_msssim_v": 0.983527, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009376, + "ave_i_frame_psnr": 32.725143, + "ave_i_frame_msssim": 0.883090, + "ave_i_frame_psnr_y": 29.935266, + "ave_i_frame_psnr_u": 39.611927, + "ave_i_frame_psnr_v": 42.577625, + "ave_i_frame_msssim_y": 0.852981, + "ave_i_frame_msssim_u": 0.964143, + "ave_i_frame_msssim_v": 0.982692, + "test_time": 26618.528148, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009376, + "ave_all_frame_psnr": 32.725143, + "ave_all_frame_msssim": 0.883090, + "ave_all_frame_psnr_y": 29.935266, + "ave_all_frame_psnr_u": 39.611927, + "ave_all_frame_psnr_v": 42.577625, + "ave_all_frame_msssim_y": 0.852981, + "ave_all_frame_msssim_u": 0.964143, + "ave_all_frame_msssim_v": 0.982692, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004604, + "ave_i_frame_psnr": 31.684121, + "ave_i_frame_msssim": 0.855446, + "ave_i_frame_psnr_y": 28.822984, + "ave_i_frame_psnr_u": 39.193176, + "ave_i_frame_psnr_v": 41.341892, + "ave_i_frame_msssim_y": 0.816801, + "ave_i_frame_msssim_u": 0.962113, + "ave_i_frame_msssim_v": 0.980650, + "test_time": 16472.946220, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004604, + "ave_all_frame_psnr": 31.684121, + "ave_all_frame_msssim": 0.855446, + "ave_all_frame_psnr_y": 28.822984, + "ave_all_frame_psnr_u": 39.193176, + "ave_all_frame_psnr_v": 41.341892, + "ave_all_frame_msssim_y": 0.816801, + "ave_all_frame_msssim_u": 0.962113, + "ave_all_frame_msssim_v": 0.980650, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002234, + "ave_i_frame_psnr": 30.707103, + "ave_i_frame_msssim": 0.828624, + "ave_i_frame_psnr_y": 27.822476, + "ave_i_frame_psnr_u": 38.462729, + "ave_i_frame_psnr_v": 40.259234, + "ave_i_frame_msssim_y": 0.782085, + "ave_i_frame_msssim_u": 0.959112, + "ave_i_frame_msssim_v": 0.977372, + "test_time": 9845.680343, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002234, + "ave_all_frame_psnr": 30.707103, + "ave_all_frame_msssim": 0.828624, + "ave_all_frame_psnr_y": 27.822476, + "ave_all_frame_psnr_u": 38.462729, + "ave_all_frame_psnr_v": 40.259234, + "ave_all_frame_msssim_y": 0.782085, + "ave_all_frame_msssim_u": 0.959112, + "ave_all_frame_msssim_v": 0.977372, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC04_1920x1080_30.yuv" + } + }, + "videoSRC05_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.164229, + "ave_i_frame_psnr": 40.640488, + "ave_i_frame_msssim": 0.990900, + "ave_i_frame_psnr_y": 39.406796, + "ave_i_frame_psnr_u": 43.615451, + "ave_i_frame_psnr_v": 45.067681, + "ave_i_frame_msssim_y": 0.989948, + "ave_i_frame_msssim_u": 0.992546, + "ave_i_frame_msssim_v": 0.994971, + "test_time": 141232.237585, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.164229, + "ave_all_frame_psnr": 40.640488, + "ave_all_frame_msssim": 0.990900, + "ave_all_frame_psnr_y": 39.406796, + "ave_all_frame_psnr_u": 43.615451, + "ave_all_frame_psnr_v": 45.067681, + "ave_all_frame_msssim_y": 0.989948, + "ave_all_frame_msssim_u": 0.992546, + "ave_all_frame_msssim_v": 0.994971, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.085325, + "ave_i_frame_psnr": 39.532348, + "ave_i_frame_msssim": 0.987841, + "ave_i_frame_psnr_y": 38.276603, + "ave_i_frame_psnr_u": 42.813337, + "ave_i_frame_psnr_v": 43.785823, + "ave_i_frame_msssim_y": 0.986557, + "ave_i_frame_msssim_u": 0.990357, + "ave_i_frame_msssim_v": 0.993033, + "test_time": 100742.085434, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.085325, + "ave_all_frame_psnr": 39.532348, + "ave_all_frame_msssim": 0.987841, + "ave_all_frame_psnr_y": 38.276603, + "ave_all_frame_psnr_u": 42.813337, + "ave_all_frame_psnr_v": 43.785823, + "ave_all_frame_msssim_y": 0.986557, + "ave_all_frame_msssim_u": 0.990357, + "ave_all_frame_msssim_v": 0.993033, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.051328, + "ave_i_frame_psnr": 38.434332, + "ave_i_frame_msssim": 0.983659, + "ave_i_frame_psnr_y": 37.163879, + "ave_i_frame_psnr_u": 41.991437, + "ave_i_frame_psnr_v": 42.499941, + "ave_i_frame_msssim_y": 0.981868, + "ave_i_frame_msssim_u": 0.987621, + "ave_i_frame_msssim_v": 0.990442, + "test_time": 72827.181302, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.051328, + "ave_all_frame_psnr": 38.434332, + "ave_all_frame_msssim": 0.983659, + "ave_all_frame_psnr_y": 37.163879, + "ave_all_frame_psnr_u": 41.991437, + "ave_all_frame_psnr_v": 42.499941, + "ave_all_frame_msssim_y": 0.981868, + "ave_all_frame_msssim_u": 0.987621, + "ave_all_frame_msssim_v": 0.990442, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.032236, + "ave_i_frame_psnr": 37.271973, + "ave_i_frame_msssim": 0.977782, + "ave_i_frame_psnr_y": 35.893354, + "ave_i_frame_psnr_u": 41.281927, + "ave_i_frame_psnr_v": 41.533732, + "ave_i_frame_msssim_y": 0.974944, + "ave_i_frame_msssim_u": 0.984762, + "ave_i_frame_msssim_v": 0.987829, + "test_time": 55016.516677, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.032236, + "ave_all_frame_psnr": 37.271973, + "ave_all_frame_msssim": 0.977782, + "ave_all_frame_psnr_y": 35.893354, + "ave_all_frame_psnr_u": 41.281927, + "ave_all_frame_psnr_v": 41.533732, + "ave_all_frame_msssim_y": 0.974944, + "ave_all_frame_msssim_u": 0.984762, + "ave_all_frame_msssim_v": 0.987829, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.021936, + "ave_i_frame_psnr": 36.167557, + "ave_i_frame_msssim": 0.970664, + "ave_i_frame_psnr_y": 34.736574, + "ave_i_frame_psnr_u": 40.497154, + "ave_i_frame_psnr_v": 40.423861, + "ave_i_frame_msssim_y": 0.966732, + "ave_i_frame_msssim_u": 0.980881, + "ave_i_frame_msssim_v": 0.984043, + "test_time": 41797.237873, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.021936, + "ave_all_frame_psnr": 36.167557, + "ave_all_frame_msssim": 0.970664, + "ave_all_frame_psnr_y": 34.736574, + "ave_all_frame_psnr_u": 40.497154, + "ave_all_frame_psnr_v": 40.423861, + "ave_all_frame_msssim_y": 0.966732, + "ave_all_frame_msssim_u": 0.980881, + "ave_all_frame_msssim_v": 0.984043, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014863, + "ave_i_frame_psnr": 35.005887, + "ave_i_frame_msssim": 0.961464, + "ave_i_frame_psnr_y": 33.485349, + "ave_i_frame_psnr_u": 39.732659, + "ave_i_frame_psnr_v": 39.402343, + "ave_i_frame_msssim_y": 0.955654, + "ave_i_frame_msssim_u": 0.977315, + "ave_i_frame_msssim_v": 0.980472, + "test_time": 32489.229065, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014863, + "ave_all_frame_psnr": 35.005887, + "ave_all_frame_msssim": 0.961464, + "ave_all_frame_psnr_y": 33.485349, + "ave_all_frame_psnr_u": 39.732659, + "ave_all_frame_psnr_v": 39.402343, + "ave_all_frame_msssim_y": 0.955654, + "ave_all_frame_msssim_u": 0.977315, + "ave_all_frame_msssim_v": 0.980472, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009944, + "ave_i_frame_psnr": 33.743330, + "ave_i_frame_msssim": 0.948512, + "ave_i_frame_psnr_y": 32.143135, + "ave_i_frame_psnr_u": 38.888820, + "ave_i_frame_psnr_v": 38.199008, + "ave_i_frame_msssim_y": 0.940283, + "ave_i_frame_msssim_u": 0.971918, + "ave_i_frame_msssim_v": 0.974481, + "test_time": 24216.515391, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009944, + "ave_all_frame_psnr": 33.743330, + "ave_all_frame_msssim": 0.948512, + "ave_all_frame_psnr_y": 32.143135, + "ave_all_frame_psnr_u": 38.888820, + "ave_all_frame_psnr_v": 38.199008, + "ave_all_frame_msssim_y": 0.940283, + "ave_all_frame_msssim_u": 0.971918, + "ave_all_frame_msssim_v": 0.974481, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006617, + "ave_i_frame_psnr": 32.458238, + "ave_i_frame_msssim": 0.931809, + "ave_i_frame_psnr_y": 30.741748, + "ave_i_frame_psnr_u": 38.109198, + "ave_i_frame_psnr_v": 37.106213, + "ave_i_frame_msssim_y": 0.919976, + "ave_i_frame_msssim_u": 0.966112, + "ave_i_frame_msssim_v": 0.968505, + "test_time": 18451.344161, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006617, + "ave_all_frame_psnr": 32.458238, + "ave_all_frame_msssim": 0.931809, + "ave_all_frame_psnr_y": 30.741748, + "ave_all_frame_psnr_u": 38.109198, + "ave_all_frame_psnr_v": 37.106213, + "ave_all_frame_msssim_y": 0.919976, + "ave_all_frame_msssim_u": 0.966112, + "ave_all_frame_msssim_v": 0.968505, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004341, + "ave_i_frame_psnr": 31.077187, + "ave_i_frame_msssim": 0.910062, + "ave_i_frame_psnr_y": 29.319068, + "ave_i_frame_psnr_u": 36.985211, + "ave_i_frame_psnr_v": 35.717873, + "ave_i_frame_msssim_y": 0.894492, + "ave_i_frame_msssim_u": 0.955731, + "ave_i_frame_msssim_v": 0.957818, + "test_time": 13433.515820, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004341, + "ave_all_frame_psnr": 31.077187, + "ave_all_frame_msssim": 0.910062, + "ave_all_frame_psnr_y": 29.319068, + "ave_all_frame_psnr_u": 36.985211, + "ave_all_frame_psnr_v": 35.717873, + "ave_all_frame_msssim_y": 0.894492, + "ave_all_frame_msssim_u": 0.955731, + "ave_all_frame_msssim_v": 0.957818, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002799, + "ave_i_frame_psnr": 29.622512, + "ave_i_frame_msssim": 0.881147, + "ave_i_frame_psnr_y": 27.827504, + "ave_i_frame_psnr_u": 35.807178, + "ave_i_frame_psnr_v": 34.207891, + "ave_i_frame_msssim_y": 0.860894, + "ave_i_frame_msssim_u": 0.942696, + "ave_i_frame_msssim_v": 0.941117, + "test_time": 9367.681541, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002799, + "ave_all_frame_psnr": 29.622512, + "ave_all_frame_msssim": 0.881147, + "ave_all_frame_psnr_y": 27.827504, + "ave_all_frame_psnr_u": 35.807178, + "ave_all_frame_psnr_v": 34.207891, + "ave_all_frame_msssim_y": 0.860894, + "ave_all_frame_msssim_u": 0.942696, + "ave_all_frame_msssim_v": 0.941117, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC05_1920x1080_25.yuv" + } + }, + "videoSRC06_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.465317, + "ave_i_frame_psnr": 37.190141, + "ave_i_frame_msssim": 0.974948, + "ave_i_frame_psnr_y": 36.594257, + "ave_i_frame_psnr_u": 37.755761, + "ave_i_frame_psnr_v": 40.199827, + "ave_i_frame_msssim_y": 0.973108, + "ave_i_frame_msssim_u": 0.975280, + "ave_i_frame_msssim_v": 0.985660, + "test_time": 300827.568917, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.465317, + "ave_all_frame_psnr": 37.190141, + "ave_all_frame_msssim": 0.974948, + "ave_all_frame_psnr_y": 36.594257, + "ave_all_frame_psnr_u": 37.755761, + "ave_all_frame_psnr_v": 40.199827, + "ave_all_frame_msssim_y": 0.973108, + "ave_all_frame_msssim_u": 0.975280, + "ave_all_frame_msssim_v": 0.985660, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.074282, + "ave_i_frame_psnr": 35.331061, + "ave_i_frame_msssim": 0.949722, + "ave_i_frame_psnr_y": 34.181838, + "ave_i_frame_psnr_u": 37.433101, + "ave_i_frame_psnr_v": 40.124353, + "ave_i_frame_msssim_y": 0.940039, + "ave_i_frame_msssim_u": 0.972407, + "ave_i_frame_msssim_v": 0.985135, + "test_time": 90872.218913, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.074282, + "ave_all_frame_psnr": 35.331061, + "ave_all_frame_msssim": 0.949722, + "ave_all_frame_psnr_y": 34.181838, + "ave_all_frame_psnr_u": 37.433101, + "ave_all_frame_psnr_v": 40.124353, + "ave_all_frame_msssim_y": 0.940039, + "ave_all_frame_msssim_u": 0.972407, + "ave_all_frame_msssim_v": 0.985135, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009442, + "ave_i_frame_psnr": 34.942676, + "ave_i_frame_msssim": 0.943249, + "ave_i_frame_psnr_y": 33.696870, + "ave_i_frame_psnr_u": 37.339405, + "ave_i_frame_psnr_v": 40.020781, + "ave_i_frame_msssim_y": 0.931609, + "ave_i_frame_msssim_u": 0.971608, + "ave_i_frame_msssim_v": 0.984727, + "test_time": 27786.914722, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009442, + "ave_all_frame_psnr": 34.942676, + "ave_all_frame_msssim": 0.943249, + "ave_all_frame_psnr_y": 33.696870, + "ave_all_frame_psnr_u": 37.339405, + "ave_all_frame_psnr_v": 40.020781, + "ave_all_frame_msssim_y": 0.931609, + "ave_all_frame_msssim_u": 0.971608, + "ave_all_frame_msssim_v": 0.984727, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001614, + "ave_i_frame_psnr": 34.796076, + "ave_i_frame_msssim": 0.941099, + "ave_i_frame_psnr_y": 33.532243, + "ave_i_frame_psnr_u": 37.251384, + "ave_i_frame_psnr_v": 39.923768, + "ave_i_frame_msssim_y": 0.929011, + "ave_i_frame_msssim_u": 0.970728, + "ave_i_frame_msssim_v": 0.983991, + "test_time": 14152.323898, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001614, + "ave_all_frame_psnr": 34.796076, + "ave_all_frame_msssim": 0.941099, + "ave_all_frame_psnr_y": 33.532243, + "ave_all_frame_psnr_u": 37.251384, + "ave_all_frame_psnr_v": 39.923768, + "ave_all_frame_msssim_y": 0.929011, + "ave_all_frame_msssim_u": 0.970728, + "ave_all_frame_msssim_v": 0.983991, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000853, + "ave_i_frame_psnr": 34.649008, + "ave_i_frame_msssim": 0.939194, + "ave_i_frame_psnr_y": 33.385222, + "ave_i_frame_psnr_u": 37.134151, + "ave_i_frame_psnr_v": 39.746581, + "ave_i_frame_msssim_y": 0.926865, + "ave_i_frame_msssim_u": 0.969470, + "ave_i_frame_msssim_v": 0.982894, + "test_time": 10962.472635, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000853, + "ave_all_frame_psnr": 34.649008, + "ave_all_frame_msssim": 0.939194, + "ave_all_frame_psnr_y": 33.385222, + "ave_all_frame_psnr_u": 37.134151, + "ave_all_frame_psnr_v": 39.746581, + "ave_all_frame_msssim_y": 0.926865, + "ave_all_frame_msssim_u": 0.969470, + "ave_all_frame_msssim_v": 0.982894, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000535, + "ave_i_frame_psnr": 34.492956, + "ave_i_frame_msssim": 0.936983, + "ave_i_frame_psnr_y": 33.198950, + "ave_i_frame_psnr_u": 37.067938, + "ave_i_frame_psnr_v": 39.682009, + "ave_i_frame_msssim_y": 0.924082, + "ave_i_frame_msssim_u": 0.968904, + "ave_i_frame_msssim_v": 0.982470, + "test_time": 8357.931826, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000535, + "ave_all_frame_psnr": 34.492956, + "ave_all_frame_msssim": 0.936983, + "ave_all_frame_psnr_y": 33.198950, + "ave_all_frame_psnr_u": 37.067938, + "ave_all_frame_psnr_v": 39.682009, + "ave_all_frame_msssim_y": 0.924082, + "ave_all_frame_msssim_u": 0.968904, + "ave_all_frame_msssim_v": 0.982470, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000363, + "ave_i_frame_psnr": 34.291719, + "ave_i_frame_msssim": 0.934129, + "ave_i_frame_psnr_y": 32.971967, + "ave_i_frame_psnr_u": 36.967342, + "ave_i_frame_psnr_v": 39.534607, + "ave_i_frame_msssim_y": 0.920652, + "ave_i_frame_msssim_u": 0.967797, + "ave_i_frame_msssim_v": 0.981321, + "test_time": 6862.482112, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000363, + "ave_all_frame_psnr": 34.291719, + "ave_all_frame_msssim": 0.934129, + "ave_all_frame_psnr_y": 32.971967, + "ave_all_frame_psnr_u": 36.967342, + "ave_all_frame_psnr_v": 39.534607, + "ave_all_frame_msssim_y": 0.920652, + "ave_all_frame_msssim_u": 0.967797, + "ave_all_frame_msssim_v": 0.981321, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000256, + "ave_i_frame_psnr": 34.029008, + "ave_i_frame_msssim": 0.930738, + "ave_i_frame_psnr_y": 32.680139, + "ave_i_frame_psnr_u": 36.823304, + "ave_i_frame_psnr_v": 39.327928, + "ave_i_frame_msssim_y": 0.916524, + "ave_i_frame_msssim_u": 0.966571, + "ave_i_frame_msssim_v": 0.980186, + "test_time": 5118.846046, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000256, + "ave_all_frame_psnr": 34.029008, + "ave_all_frame_msssim": 0.930738, + "ave_all_frame_psnr_y": 32.680139, + "ave_all_frame_psnr_u": 36.823304, + "ave_all_frame_psnr_v": 39.327928, + "ave_all_frame_msssim_y": 0.916524, + "ave_all_frame_msssim_u": 0.966571, + "ave_all_frame_msssim_v": 0.980186, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000200, + "ave_i_frame_psnr": 33.653761, + "ave_i_frame_msssim": 0.925894, + "ave_i_frame_psnr_y": 32.295949, + "ave_i_frame_psnr_u": 36.457851, + "ave_i_frame_psnr_v": 38.996541, + "ave_i_frame_msssim_y": 0.910640, + "ave_i_frame_msssim_u": 0.964804, + "ave_i_frame_msssim_v": 0.978506, + "test_time": 3503.023026, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000200, + "ave_all_frame_psnr": 33.653761, + "ave_all_frame_msssim": 0.925894, + "ave_all_frame_psnr_y": 32.295949, + "ave_all_frame_psnr_u": 36.457851, + "ave_all_frame_psnr_v": 38.996541, + "ave_all_frame_msssim_y": 0.910640, + "ave_all_frame_msssim_u": 0.964804, + "ave_all_frame_msssim_v": 0.978506, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000160, + "ave_i_frame_psnr": 33.199809, + "ave_i_frame_msssim": 0.920711, + "ave_i_frame_psnr_y": 31.867338, + "ave_i_frame_psnr_u": 35.937220, + "ave_i_frame_psnr_v": 38.457223, + "ave_i_frame_msssim_y": 0.904694, + "ave_i_frame_msssim_u": 0.961396, + "ave_i_frame_msssim_v": 0.976134, + "test_time": 2957.009072, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000160, + "ave_all_frame_psnr": 33.199809, + "ave_all_frame_msssim": 0.920711, + "ave_all_frame_psnr_y": 31.867338, + "ave_all_frame_psnr_u": 35.937220, + "ave_all_frame_psnr_v": 38.457223, + "ave_all_frame_msssim_y": 0.904694, + "ave_all_frame_msssim_u": 0.961396, + "ave_all_frame_msssim_v": 0.976134, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC06_1920x1080_25.yuv" + } + }, + "videoSRC07_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.176933, + "ave_i_frame_psnr": 39.779594, + "ave_i_frame_msssim": 0.986189, + "ave_i_frame_psnr_y": 38.985832, + "ave_i_frame_psnr_u": 41.632659, + "ave_i_frame_psnr_v": 42.689102, + "ave_i_frame_msssim_y": 0.985181, + "ave_i_frame_msssim_u": 0.988540, + "ave_i_frame_msssim_v": 0.989887, + "test_time": 196093.722005, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.176933, + "ave_all_frame_psnr": 39.779594, + "ave_all_frame_msssim": 0.986189, + "ave_all_frame_psnr_y": 38.985832, + "ave_all_frame_psnr_u": 41.632659, + "ave_all_frame_psnr_v": 42.689102, + "ave_all_frame_msssim_y": 0.985181, + "ave_all_frame_msssim_u": 0.988540, + "ave_all_frame_msssim_v": 0.989887, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.068743, + "ave_i_frame_psnr": 38.787904, + "ave_i_frame_msssim": 0.980549, + "ave_i_frame_psnr_y": 37.839520, + "ave_i_frame_psnr_u": 41.307516, + "ave_i_frame_psnr_v": 41.958600, + "ave_i_frame_msssim_y": 0.978430, + "ave_i_frame_msssim_u": 0.986839, + "ave_i_frame_msssim_v": 0.986972, + "test_time": 127676.317681, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.068743, + "ave_all_frame_psnr": 38.787904, + "ave_all_frame_msssim": 0.980549, + "ave_all_frame_psnr_y": 37.839520, + "ave_all_frame_psnr_u": 41.307516, + "ave_all_frame_psnr_v": 41.958600, + "ave_all_frame_msssim_y": 0.978430, + "ave_all_frame_msssim_u": 0.986839, + "ave_all_frame_msssim_v": 0.986972, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.034819, + "ave_i_frame_psnr": 38.011735, + "ave_i_frame_msssim": 0.974101, + "ave_i_frame_psnr_y": 36.970787, + "ave_i_frame_psnr_u": 40.998737, + "ave_i_frame_psnr_v": 41.270420, + "ave_i_frame_msssim_y": 0.970603, + "ave_i_frame_msssim_u": 0.985200, + "ave_i_frame_msssim_v": 0.983986, + "test_time": 84237.853458, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.034819, + "ave_all_frame_psnr": 38.011735, + "ave_all_frame_msssim": 0.974101, + "ave_all_frame_psnr_y": 36.970787, + "ave_all_frame_psnr_u": 40.998737, + "ave_all_frame_psnr_v": 41.270420, + "ave_all_frame_msssim_y": 0.970603, + "ave_all_frame_msssim_u": 0.985200, + "ave_all_frame_msssim_v": 0.983986, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.019166, + "ave_i_frame_psnr": 37.200696, + "ave_i_frame_msssim": 0.965547, + "ave_i_frame_psnr_y": 36.034162, + "ave_i_frame_psnr_u": 40.701747, + "ave_i_frame_psnr_v": 40.698848, + "ave_i_frame_msssim_y": 0.959952, + "ave_i_frame_msssim_u": 0.983469, + "ave_i_frame_msssim_v": 0.981195, + "test_time": 57297.682549, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.019166, + "ave_all_frame_psnr": 37.200696, + "ave_all_frame_msssim": 0.965547, + "ave_all_frame_psnr_y": 36.034162, + "ave_all_frame_psnr_u": 40.701747, + "ave_all_frame_psnr_v": 40.698848, + "ave_all_frame_msssim_y": 0.959952, + "ave_all_frame_msssim_u": 0.983469, + "ave_all_frame_msssim_v": 0.981195, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011730, + "ave_i_frame_psnr": 36.442979, + "ave_i_frame_msssim": 0.956458, + "ave_i_frame_psnr_y": 35.185973, + "ave_i_frame_psnr_u": 40.350947, + "ave_i_frame_psnr_v": 40.077047, + "ave_i_frame_msssim_y": 0.948720, + "ave_i_frame_msssim_u": 0.981603, + "ave_i_frame_msssim_v": 0.977736, + "test_time": 37919.591464, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011730, + "ave_all_frame_psnr": 36.442979, + "ave_all_frame_msssim": 0.956458, + "ave_all_frame_psnr_y": 35.185973, + "ave_all_frame_psnr_u": 40.350947, + "ave_all_frame_psnr_v": 40.077047, + "ave_all_frame_msssim_y": 0.948720, + "ave_all_frame_msssim_u": 0.981603, + "ave_all_frame_msssim_v": 0.977736, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007105, + "ave_i_frame_psnr": 35.612848, + "ave_i_frame_msssim": 0.944986, + "ave_i_frame_psnr_y": 34.271850, + "ave_i_frame_psnr_u": 39.898107, + "ave_i_frame_psnr_v": 39.373577, + "ave_i_frame_msssim_y": 0.934698, + "ave_i_frame_msssim_u": 0.978107, + "ave_i_frame_msssim_v": 0.973593, + "test_time": 25336.794655, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007105, + "ave_all_frame_psnr": 35.612848, + "ave_all_frame_msssim": 0.944986, + "ave_all_frame_psnr_y": 34.271850, + "ave_all_frame_psnr_u": 39.898107, + "ave_all_frame_psnr_v": 39.373577, + "ave_all_frame_msssim_y": 0.934698, + "ave_all_frame_msssim_u": 0.978107, + "ave_all_frame_msssim_v": 0.973593, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004277, + "ave_i_frame_psnr": 34.770685, + "ave_i_frame_msssim": 0.931685, + "ave_i_frame_psnr_y": 33.318433, + "ave_i_frame_psnr_u": 39.492972, + "ave_i_frame_psnr_v": 38.761904, + "ave_i_frame_msssim_y": 0.918040, + "ave_i_frame_msssim_u": 0.975427, + "ave_i_frame_msssim_v": 0.969816, + "test_time": 16063.364281, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004277, + "ave_all_frame_psnr": 34.770685, + "ave_all_frame_msssim": 0.931685, + "ave_all_frame_psnr_y": 33.318433, + "ave_all_frame_psnr_u": 39.492972, + "ave_all_frame_psnr_v": 38.761904, + "ave_all_frame_msssim_y": 0.918040, + "ave_all_frame_msssim_u": 0.975427, + "ave_all_frame_msssim_v": 0.969816, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002594, + "ave_i_frame_psnr": 33.935401, + "ave_i_frame_msssim": 0.916540, + "ave_i_frame_psnr_y": 32.338411, + "ave_i_frame_psnr_u": 39.220605, + "ave_i_frame_psnr_v": 38.232130, + "ave_i_frame_msssim_y": 0.898871, + "ave_i_frame_msssim_u": 0.973395, + "ave_i_frame_msssim_v": 0.965698, + "test_time": 10409.223014, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002594, + "ave_all_frame_psnr": 33.935401, + "ave_all_frame_msssim": 0.916540, + "ave_all_frame_psnr_y": 32.338411, + "ave_all_frame_psnr_u": 39.220605, + "ave_all_frame_psnr_v": 38.232130, + "ave_all_frame_msssim_y": 0.898871, + "ave_all_frame_msssim_u": 0.973395, + "ave_all_frame_msssim_v": 0.965698, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001585, + "ave_i_frame_psnr": 33.009555, + "ave_i_frame_msssim": 0.900041, + "ave_i_frame_psnr_y": 31.350059, + "ave_i_frame_psnr_u": 38.643764, + "ave_i_frame_psnr_v": 37.332326, + "ave_i_frame_msssim_y": 0.878785, + "ave_i_frame_msssim_u": 0.969391, + "ave_i_frame_msssim_v": 0.958228, + "test_time": 7130.373932, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001585, + "ave_all_frame_psnr": 33.009555, + "ave_all_frame_msssim": 0.900041, + "ave_all_frame_psnr_y": 31.350059, + "ave_all_frame_psnr_u": 38.643764, + "ave_all_frame_psnr_v": 37.332326, + "ave_all_frame_msssim_y": 0.878785, + "ave_all_frame_msssim_u": 0.969391, + "ave_all_frame_msssim_v": 0.958228, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000992, + "ave_i_frame_psnr": 32.047410, + "ave_i_frame_msssim": 0.882744, + "ave_i_frame_psnr_y": 30.345394, + "ave_i_frame_psnr_u": 37.803888, + "ave_i_frame_psnr_v": 36.503029, + "ave_i_frame_msssim_y": 0.858474, + "ave_i_frame_msssim_u": 0.963670, + "ave_i_frame_msssim_v": 0.947438, + "test_time": 4872.223256, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000992, + "ave_all_frame_psnr": 32.047410, + "ave_all_frame_msssim": 0.882744, + "ave_all_frame_psnr_y": 30.345394, + "ave_all_frame_psnr_u": 37.803888, + "ave_all_frame_psnr_v": 36.503029, + "ave_all_frame_msssim_y": 0.858474, + "ave_all_frame_msssim_u": 0.963670, + "ave_all_frame_msssim_v": 0.947438, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC07_1920x1080_25.yuv" + } + }, + "videoSRC08_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.035773, + "ave_i_frame_psnr": 42.034398, + "ave_i_frame_msssim": 0.990515, + "ave_i_frame_psnr_y": 41.282140, + "ave_i_frame_psnr_u": 42.191337, + "ave_i_frame_psnr_v": 46.391006, + "ave_i_frame_msssim_y": 0.989802, + "ave_i_frame_msssim_u": 0.989801, + "ave_i_frame_msssim_v": 0.995508, + "test_time": 54644.700493, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.035773, + "ave_all_frame_psnr": 42.034398, + "ave_all_frame_msssim": 0.990515, + "ave_all_frame_psnr_y": 41.282140, + "ave_all_frame_psnr_u": 42.191337, + "ave_all_frame_psnr_v": 46.391006, + "ave_all_frame_msssim_y": 0.989802, + "ave_all_frame_msssim_u": 0.989801, + "ave_all_frame_msssim_v": 0.995508, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017238, + "ave_i_frame_psnr": 41.391115, + "ave_i_frame_msssim": 0.989216, + "ave_i_frame_psnr_y": 40.583041, + "ave_i_frame_psnr_u": 41.995352, + "ave_i_frame_psnr_v": 45.635321, + "ave_i_frame_msssim_y": 0.988438, + "ave_i_frame_msssim_u": 0.988786, + "ave_i_frame_msssim_v": 0.994308, + "test_time": 36178.170698, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017238, + "ave_all_frame_psnr": 41.391115, + "ave_all_frame_msssim": 0.989216, + "ave_all_frame_psnr_y": 40.583041, + "ave_all_frame_psnr_u": 41.995352, + "ave_all_frame_psnr_v": 45.635321, + "ave_all_frame_msssim_y": 0.988438, + "ave_all_frame_msssim_u": 0.988786, + "ave_all_frame_msssim_v": 0.994308, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009716, + "ave_i_frame_psnr": 40.679937, + "ave_i_frame_msssim": 0.987376, + "ave_i_frame_psnr_y": 39.804839, + "ave_i_frame_psnr_u": 41.765320, + "ave_i_frame_psnr_v": 44.845140, + "ave_i_frame_msssim_y": 0.986448, + "ave_i_frame_msssim_u": 0.987550, + "ave_i_frame_msssim_v": 0.992772, + "test_time": 25855.857386, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009716, + "ave_all_frame_psnr": 40.679937, + "ave_all_frame_msssim": 0.987376, + "ave_all_frame_psnr_y": 39.804839, + "ave_all_frame_psnr_u": 41.765320, + "ave_all_frame_psnr_v": 44.845140, + "ave_all_frame_msssim_y": 0.986448, + "ave_all_frame_msssim_u": 0.987550, + "ave_all_frame_msssim_v": 0.992772, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005836, + "ave_i_frame_psnr": 39.872576, + "ave_i_frame_msssim": 0.984654, + "ave_i_frame_psnr_y": 38.876524, + "ave_i_frame_psnr_u": 41.509255, + "ave_i_frame_psnr_v": 44.212214, + "ave_i_frame_msssim_y": 0.983406, + "ave_i_frame_msssim_u": 0.986007, + "ave_i_frame_msssim_v": 0.990786, + "test_time": 18685.937007, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005836, + "ave_all_frame_psnr": 39.872576, + "ave_all_frame_msssim": 0.984654, + "ave_all_frame_psnr_y": 38.876524, + "ave_all_frame_psnr_u": 41.509255, + "ave_all_frame_psnr_v": 44.212214, + "ave_all_frame_msssim_y": 0.983406, + "ave_all_frame_msssim_u": 0.986007, + "ave_all_frame_msssim_v": 0.990786, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003773, + "ave_i_frame_psnr": 38.996647, + "ave_i_frame_msssim": 0.981064, + "ave_i_frame_psnr_y": 37.891235, + "ave_i_frame_psnr_u": 41.218697, + "ave_i_frame_psnr_v": 43.407070, + "ave_i_frame_msssim_y": 0.979312, + "ave_i_frame_msssim_u": 0.984312, + "ave_i_frame_msssim_v": 0.988331, + "test_time": 13690.309737, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003773, + "ave_all_frame_psnr": 38.996647, + "ave_all_frame_msssim": 0.981064, + "ave_all_frame_psnr_y": 37.891235, + "ave_all_frame_psnr_u": 41.218697, + "ave_all_frame_psnr_v": 43.407070, + "ave_all_frame_msssim_y": 0.979312, + "ave_all_frame_msssim_u": 0.984312, + "ave_all_frame_msssim_v": 0.988331, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002485, + "ave_i_frame_psnr": 38.058403, + "ave_i_frame_msssim": 0.976262, + "ave_i_frame_psnr_y": 36.799630, + "ave_i_frame_psnr_u": 40.985142, + "ave_i_frame_psnr_v": 42.684302, + "ave_i_frame_msssim_y": 0.973539, + "ave_i_frame_msssim_u": 0.982951, + "ave_i_frame_msssim_v": 0.985905, + "test_time": 10517.676416, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002485, + "ave_all_frame_psnr": 38.058403, + "ave_all_frame_msssim": 0.976262, + "ave_all_frame_psnr_y": 36.799630, + "ave_all_frame_psnr_u": 40.985142, + "ave_all_frame_psnr_v": 42.684302, + "ave_all_frame_msssim_y": 0.973539, + "ave_all_frame_msssim_u": 0.982951, + "ave_all_frame_msssim_v": 0.985905, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001674, + "ave_i_frame_psnr": 37.062646, + "ave_i_frame_msssim": 0.969811, + "ave_i_frame_psnr_y": 35.635920, + "ave_i_frame_psnr_u": 40.646209, + "ave_i_frame_psnr_v": 42.039444, + "ave_i_frame_msssim_y": 0.965774, + "ave_i_frame_msssim_u": 0.980939, + "ave_i_frame_msssim_v": 0.982906, + "test_time": 7846.042061, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001674, + "ave_all_frame_psnr": 37.062646, + "ave_all_frame_msssim": 0.969811, + "ave_all_frame_psnr_y": 35.635920, + "ave_all_frame_psnr_u": 40.646209, + "ave_all_frame_psnr_v": 42.039444, + "ave_all_frame_msssim_y": 0.965774, + "ave_all_frame_msssim_u": 0.980939, + "ave_all_frame_msssim_v": 0.982906, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001154, + "ave_i_frame_psnr": 36.043384, + "ave_i_frame_msssim": 0.961985, + "ave_i_frame_psnr_y": 34.434923, + "ave_i_frame_psnr_u": 40.395997, + "ave_i_frame_psnr_v": 41.341533, + "ave_i_frame_msssim_y": 0.956015, + "ave_i_frame_msssim_u": 0.979678, + "ave_i_frame_msssim_v": 0.980117, + "test_time": 6098.952999, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001154, + "ave_all_frame_psnr": 36.043384, + "ave_all_frame_msssim": 0.961985, + "ave_all_frame_psnr_y": 34.434923, + "ave_all_frame_psnr_u": 40.395997, + "ave_all_frame_psnr_v": 41.341533, + "ave_all_frame_msssim_y": 0.956015, + "ave_all_frame_msssim_u": 0.979678, + "ave_all_frame_msssim_v": 0.980117, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000803, + "ave_i_frame_psnr": 34.875282, + "ave_i_frame_msssim": 0.950819, + "ave_i_frame_psnr_y": 33.146509, + "ave_i_frame_psnr_u": 39.807950, + "ave_i_frame_psnr_v": 40.315251, + "ave_i_frame_msssim_y": 0.942711, + "ave_i_frame_msssim_u": 0.976299, + "ave_i_frame_msssim_v": 0.973989, + "test_time": 4808.363773, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000803, + "ave_all_frame_psnr": 34.875282, + "ave_all_frame_msssim": 0.950819, + "ave_all_frame_psnr_y": 33.146509, + "ave_all_frame_psnr_u": 39.807950, + "ave_all_frame_psnr_v": 40.315251, + "ave_all_frame_msssim_y": 0.942711, + "ave_all_frame_msssim_u": 0.976299, + "ave_all_frame_msssim_v": 0.973989, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000564, + "ave_i_frame_psnr": 33.702488, + "ave_i_frame_msssim": 0.938189, + "ave_i_frame_psnr_y": 31.869012, + "ave_i_frame_psnr_u": 39.153433, + "ave_i_frame_psnr_v": 39.252395, + "ave_i_frame_msssim_y": 0.927704, + "ave_i_frame_msssim_u": 0.971910, + "ave_i_frame_msssim_v": 0.967379, + "test_time": 3824.319446, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000564, + "ave_all_frame_psnr": 33.702488, + "ave_all_frame_msssim": 0.938189, + "ave_all_frame_psnr_y": 31.869012, + "ave_all_frame_psnr_u": 39.153433, + "ave_all_frame_psnr_v": 39.252395, + "ave_all_frame_msssim_y": 0.927704, + "ave_all_frame_msssim_u": 0.971910, + "ave_all_frame_msssim_v": 0.967379, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC08_1920x1080_25.yuv" + } + }, + "videoSRC09_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.323114, + "ave_i_frame_psnr": 39.971523, + "ave_i_frame_msssim": 0.993716, + "ave_i_frame_psnr_y": 39.294112, + "ave_i_frame_psnr_u": 41.647682, + "ave_i_frame_psnr_v": 42.359827, + "ave_i_frame_msssim_y": 0.995319, + "ave_i_frame_msssim_u": 0.987404, + "ave_i_frame_msssim_v": 0.990408, + "test_time": 124519.450385, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.323114, + "ave_all_frame_psnr": 39.971523, + "ave_all_frame_msssim": 0.993716, + "ave_all_frame_psnr_y": 39.294112, + "ave_all_frame_psnr_u": 41.647682, + "ave_all_frame_psnr_v": 42.359827, + "ave_all_frame_msssim_y": 0.995319, + "ave_all_frame_msssim_u": 0.987404, + "ave_all_frame_msssim_v": 0.990408, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.150180, + "ave_i_frame_psnr": 37.987134, + "ave_i_frame_msssim": 0.990512, + "ave_i_frame_psnr_y": 37.060167, + "ave_i_frame_psnr_u": 40.549970, + "ave_i_frame_psnr_v": 40.986106, + "ave_i_frame_msssim_y": 0.992375, + "ave_i_frame_msssim_u": 0.983177, + "ave_i_frame_msssim_v": 0.986670, + "test_time": 104925.794096, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.150180, + "ave_all_frame_psnr": 37.987134, + "ave_all_frame_msssim": 0.990512, + "ave_all_frame_psnr_y": 37.060167, + "ave_all_frame_psnr_u": 40.549970, + "ave_all_frame_psnr_v": 40.986106, + "ave_all_frame_msssim_y": 0.992375, + "ave_all_frame_msssim_u": 0.983177, + "ave_all_frame_msssim_v": 0.986670, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.083944, + "ave_i_frame_psnr": 36.344409, + "ave_i_frame_msssim": 0.985958, + "ave_i_frame_psnr_y": 35.268486, + "ave_i_frame_psnr_u": 39.497940, + "ave_i_frame_psnr_v": 39.646419, + "ave_i_frame_msssim_y": 0.988033, + "ave_i_frame_msssim_u": 0.977876, + "ave_i_frame_msssim_v": 0.981591, + "test_time": 77653.495215, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.083944, + "ave_all_frame_psnr": 36.344409, + "ave_all_frame_msssim": 0.985958, + "ave_all_frame_psnr_y": 35.268486, + "ave_all_frame_psnr_u": 39.497940, + "ave_all_frame_psnr_v": 39.646419, + "ave_all_frame_msssim_y": 0.988033, + "ave_all_frame_msssim_u": 0.977876, + "ave_all_frame_msssim_v": 0.981591, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.050829, + "ave_i_frame_psnr": 34.760547, + "ave_i_frame_msssim": 0.979284, + "ave_i_frame_psnr_y": 33.506926, + "ave_i_frame_psnr_u": 38.548478, + "ave_i_frame_psnr_v": 38.494346, + "ave_i_frame_msssim_y": 0.981126, + "ave_i_frame_msssim_u": 0.971753, + "ave_i_frame_msssim_v": 0.975764, + "test_time": 58875.412637, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.050829, + "ave_all_frame_psnr": 34.760547, + "ave_all_frame_msssim": 0.979284, + "ave_all_frame_psnr_y": 33.506926, + "ave_all_frame_psnr_u": 38.548478, + "ave_all_frame_psnr_v": 38.494346, + "ave_all_frame_msssim_y": 0.981126, + "ave_all_frame_msssim_u": 0.971753, + "ave_all_frame_msssim_v": 0.975764, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.033575, + "ave_i_frame_psnr": 33.339828, + "ave_i_frame_msssim": 0.970579, + "ave_i_frame_psnr_y": 31.992056, + "ave_i_frame_psnr_u": 37.477291, + "ave_i_frame_psnr_v": 37.288993, + "ave_i_frame_msssim_y": 0.972335, + "ave_i_frame_msssim_u": 0.962907, + "ave_i_frame_msssim_v": 0.967721, + "test_time": 44581.589788, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.033575, + "ave_all_frame_psnr": 33.339828, + "ave_all_frame_msssim": 0.970579, + "ave_all_frame_psnr_y": 31.992056, + "ave_all_frame_psnr_u": 37.477291, + "ave_all_frame_psnr_v": 37.288993, + "ave_all_frame_msssim_y": 0.972335, + "ave_all_frame_msssim_u": 0.962907, + "ave_all_frame_msssim_v": 0.967721, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022119, + "ave_i_frame_psnr": 31.941551, + "ave_i_frame_msssim": 0.958495, + "ave_i_frame_psnr_y": 30.422771, + "ave_i_frame_psnr_u": 36.619594, + "ave_i_frame_psnr_v": 36.376189, + "ave_i_frame_msssim_y": 0.958960, + "ave_i_frame_msssim_u": 0.954166, + "ave_i_frame_msssim_v": 0.960041, + "test_time": 34661.926497, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022119, + "ave_all_frame_psnr": 31.941551, + "ave_all_frame_msssim": 0.958495, + "ave_all_frame_psnr_y": 30.422771, + "ave_all_frame_psnr_u": 36.619594, + "ave_all_frame_psnr_v": 36.376189, + "ave_all_frame_msssim_y": 0.958960, + "ave_all_frame_msssim_u": 0.954166, + "ave_all_frame_msssim_v": 0.960041, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014310, + "ave_i_frame_psnr": 30.495218, + "ave_i_frame_msssim": 0.940506, + "ave_i_frame_psnr_y": 28.810817, + "ave_i_frame_psnr_u": 35.753310, + "ave_i_frame_psnr_v": 35.343531, + "ave_i_frame_msssim_y": 0.938488, + "ave_i_frame_msssim_u": 0.943436, + "ave_i_frame_msssim_v": 0.949684, + "test_time": 26940.820774, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014310, + "ave_all_frame_psnr": 30.495218, + "ave_all_frame_msssim": 0.940506, + "ave_all_frame_psnr_y": 28.810817, + "ave_all_frame_psnr_u": 35.753310, + "ave_all_frame_psnr_v": 35.343531, + "ave_all_frame_msssim_y": 0.938488, + "ave_all_frame_msssim_u": 0.943436, + "ave_all_frame_msssim_v": 0.949684, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009039, + "ave_i_frame_psnr": 29.084922, + "ave_i_frame_msssim": 0.914349, + "ave_i_frame_psnr_y": 27.189374, + "ave_i_frame_psnr_u": 35.097687, + "ave_i_frame_psnr_v": 34.445442, + "ave_i_frame_msssim_y": 0.906798, + "ave_i_frame_msssim_u": 0.934038, + "ave_i_frame_msssim_v": 0.939959, + "test_time": 19899.106715, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009039, + "ave_all_frame_psnr": 29.084922, + "ave_all_frame_msssim": 0.914349, + "ave_all_frame_psnr_y": 27.189374, + "ave_all_frame_psnr_u": 35.097687, + "ave_all_frame_psnr_v": 34.445442, + "ave_all_frame_msssim_y": 0.906798, + "ave_all_frame_msssim_u": 0.934038, + "ave_all_frame_msssim_v": 0.939959, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005541, + "ave_i_frame_psnr": 27.601420, + "ave_i_frame_msssim": 0.874672, + "ave_i_frame_psnr_y": 25.637489, + "ave_i_frame_psnr_u": 33.889960, + "ave_i_frame_psnr_v": 33.096467, + "ave_i_frame_msssim_y": 0.860771, + "ave_i_frame_msssim_u": 0.913155, + "ave_i_frame_msssim_v": 0.919597, + "test_time": 15003.215292, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005541, + "ave_all_frame_psnr": 27.601420, + "ave_all_frame_msssim": 0.874672, + "ave_all_frame_psnr_y": 25.637489, + "ave_all_frame_psnr_u": 33.889960, + "ave_all_frame_psnr_v": 33.096467, + "ave_all_frame_msssim_y": 0.860771, + "ave_all_frame_msssim_u": 0.913155, + "ave_all_frame_msssim_v": 0.919597, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003350, + "ave_i_frame_psnr": 26.219807, + "ave_i_frame_msssim": 0.826678, + "ave_i_frame_psnr_y": 24.211155, + "ave_i_frame_psnr_u": 32.764329, + "ave_i_frame_psnr_v": 31.727199, + "ave_i_frame_msssim_y": 0.804933, + "ave_i_frame_msssim_u": 0.890106, + "ave_i_frame_msssim_v": 0.893714, + "test_time": 9921.757558, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003350, + "ave_all_frame_psnr": 26.219807, + "ave_all_frame_msssim": 0.826678, + "ave_all_frame_psnr_y": 24.211155, + "ave_all_frame_psnr_u": 32.764329, + "ave_all_frame_psnr_v": 31.727199, + "ave_all_frame_msssim_y": 0.804933, + "ave_all_frame_msssim_u": 0.890106, + "ave_all_frame_msssim_v": 0.893714, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC09_1920x1080_25.yuv" + } + }, + "videoSRC10_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.160380, + "ave_i_frame_psnr": 42.611144, + "ave_i_frame_msssim": 0.995643, + "ave_i_frame_psnr_y": 41.390484, + "ave_i_frame_psnr_u": 45.216368, + "ave_i_frame_psnr_v": 47.329879, + "ave_i_frame_msssim_y": 0.996205, + "ave_i_frame_msssim_u": 0.992881, + "ave_i_frame_msssim_v": 0.995036, + "test_time": 183900.831546, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.160380, + "ave_all_frame_psnr": 42.611144, + "ave_all_frame_msssim": 0.995643, + "ave_all_frame_psnr_y": 41.390484, + "ave_all_frame_psnr_u": 45.216368, + "ave_all_frame_psnr_v": 47.329879, + "ave_all_frame_msssim_y": 0.996205, + "ave_all_frame_msssim_u": 0.992881, + "ave_all_frame_msssim_v": 0.995036, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.095367, + "ave_i_frame_psnr": 40.831931, + "ave_i_frame_msssim": 0.993513, + "ave_i_frame_psnr_y": 39.359908, + "ave_i_frame_psnr_u": 44.120247, + "ave_i_frame_psnr_v": 46.375754, + "ave_i_frame_msssim_y": 0.994128, + "ave_i_frame_msssim_u": 0.989915, + "ave_i_frame_msssim_v": 0.993422, + "test_time": 146706.442130, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.095367, + "ave_all_frame_psnr": 40.831931, + "ave_all_frame_msssim": 0.993513, + "ave_all_frame_psnr_y": 39.359908, + "ave_all_frame_psnr_u": 44.120247, + "ave_all_frame_psnr_v": 46.375754, + "ave_all_frame_msssim_y": 0.994128, + "ave_all_frame_msssim_u": 0.989915, + "ave_all_frame_msssim_v": 0.993422, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.057699, + "ave_i_frame_psnr": 39.116948, + "ave_i_frame_msssim": 0.990363, + "ave_i_frame_psnr_y": 37.407526, + "ave_i_frame_psnr_u": 43.079035, + "ave_i_frame_psnr_v": 45.411392, + "ave_i_frame_msssim_y": 0.990859, + "ave_i_frame_msssim_u": 0.986291, + "ave_i_frame_msssim_v": 0.991459, + "test_time": 107670.669130, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.057699, + "ave_all_frame_psnr": 39.116948, + "ave_all_frame_msssim": 0.990363, + "ave_all_frame_psnr_y": 37.407526, + "ave_all_frame_psnr_u": 43.079035, + "ave_all_frame_psnr_v": 45.411392, + "ave_all_frame_msssim_y": 0.990859, + "ave_all_frame_msssim_u": 0.986291, + "ave_all_frame_msssim_v": 0.991459, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.035892, + "ave_i_frame_psnr": 37.535228, + "ave_i_frame_msssim": 0.986445, + "ave_i_frame_psnr_y": 35.563722, + "ave_i_frame_psnr_u": 42.217600, + "ave_i_frame_psnr_v": 44.681894, + "ave_i_frame_msssim_y": 0.986460, + "ave_i_frame_msssim_u": 0.982852, + "ave_i_frame_msssim_v": 0.989941, + "test_time": 82266.602621, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.035892, + "ave_all_frame_psnr": 37.535228, + "ave_all_frame_msssim": 0.986445, + "ave_all_frame_psnr_y": 35.563722, + "ave_all_frame_psnr_u": 42.217600, + "ave_all_frame_psnr_v": 44.681894, + "ave_all_frame_msssim_y": 0.986460, + "ave_all_frame_msssim_u": 0.982852, + "ave_all_frame_msssim_v": 0.989941, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.024579, + "ave_i_frame_psnr": 36.224124, + "ave_i_frame_msssim": 0.982589, + "ave_i_frame_psnr_y": 34.090043, + "ave_i_frame_psnr_u": 41.453442, + "ave_i_frame_psnr_v": 43.799297, + "ave_i_frame_msssim_y": 0.982190, + "ave_i_frame_msssim_u": 0.979446, + "ave_i_frame_msssim_v": 0.988124, + "test_time": 60319.111665, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.024579, + "ave_all_frame_psnr": 36.224124, + "ave_all_frame_msssim": 0.982589, + "ave_all_frame_psnr_y": 34.090043, + "ave_all_frame_psnr_u": 41.453442, + "ave_all_frame_psnr_v": 43.799297, + "ave_all_frame_msssim_y": 0.982190, + "ave_all_frame_msssim_u": 0.979446, + "ave_all_frame_msssim_v": 0.988124, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017229, + "ave_i_frame_psnr": 34.598961, + "ave_i_frame_msssim": 0.976029, + "ave_i_frame_psnr_y": 32.617236, + "ave_i_frame_psnr_u": 39.140675, + "ave_i_frame_psnr_v": 41.947600, + "ave_i_frame_msssim_y": 0.977135, + "ave_i_frame_msssim_u": 0.964432, + "ave_i_frame_msssim_v": 0.980990, + "test_time": 50077.292815, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017229, + "ave_all_frame_psnr": 34.598961, + "ave_all_frame_msssim": 0.976029, + "ave_all_frame_psnr_y": 32.617236, + "ave_all_frame_psnr_u": 39.140675, + "ave_all_frame_psnr_v": 41.947600, + "ave_all_frame_msssim_y": 0.977135, + "ave_all_frame_msssim_u": 0.964432, + "ave_all_frame_msssim_v": 0.980990, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012314, + "ave_i_frame_psnr": 33.313880, + "ave_i_frame_msssim": 0.969874, + "ave_i_frame_psnr_y": 31.059681, + "ave_i_frame_psnr_u": 38.624326, + "ave_i_frame_psnr_v": 41.528624, + "ave_i_frame_msssim_y": 0.969887, + "ave_i_frame_msssim_u": 0.960231, + "ave_i_frame_msssim_v": 0.979441, + "test_time": 38804.370248, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012314, + "ave_all_frame_psnr": 33.313880, + "ave_all_frame_msssim": 0.969874, + "ave_all_frame_psnr_y": 31.059681, + "ave_all_frame_psnr_u": 38.624326, + "ave_all_frame_psnr_v": 41.528624, + "ave_all_frame_msssim_y": 0.969887, + "ave_all_frame_msssim_u": 0.960231, + "ave_all_frame_msssim_v": 0.979441, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008923, + "ave_i_frame_psnr": 31.996609, + "ave_i_frame_msssim": 0.961196, + "ave_i_frame_psnr_y": 29.424219, + "ave_i_frame_psnr_u": 38.230741, + "ave_i_frame_psnr_v": 41.196821, + "ave_i_frame_msssim_y": 0.958906, + "ave_i_frame_msssim_u": 0.957322, + "ave_i_frame_msssim_v": 0.978808, + "test_time": 29860.771398, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008923, + "ave_all_frame_psnr": 31.996609, + "ave_all_frame_msssim": 0.961196, + "ave_all_frame_psnr_y": 29.424219, + "ave_all_frame_psnr_u": 38.230741, + "ave_all_frame_psnr_v": 41.196821, + "ave_all_frame_msssim_y": 0.958906, + "ave_all_frame_msssim_u": 0.957322, + "ave_all_frame_msssim_v": 0.978808, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006479, + "ave_i_frame_psnr": 30.568968, + "ave_i_frame_msssim": 0.947921, + "ave_i_frame_psnr_y": 27.725829, + "ave_i_frame_psnr_u": 37.657974, + "ave_i_frame_psnr_v": 40.538791, + "ave_i_frame_msssim_y": 0.942721, + "ave_i_frame_msssim_u": 0.951706, + "ave_i_frame_msssim_v": 0.975340, + "test_time": 21692.370028, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006479, + "ave_all_frame_psnr": 30.568968, + "ave_all_frame_msssim": 0.947921, + "ave_all_frame_psnr_y": 27.725829, + "ave_all_frame_psnr_u": 37.657974, + "ave_all_frame_psnr_v": 40.538791, + "ave_all_frame_msssim_y": 0.942721, + "ave_all_frame_msssim_u": 0.951706, + "ave_all_frame_msssim_v": 0.975340, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004687, + "ave_i_frame_psnr": 29.108151, + "ave_i_frame_msssim": 0.928820, + "ave_i_frame_psnr_y": 25.951378, + "ave_i_frame_psnr_u": 37.361562, + "ave_i_frame_psnr_v": 39.795374, + "ave_i_frame_msssim_y": 0.917875, + "ave_i_frame_msssim_u": 0.950367, + "ave_i_frame_msssim_v": 0.972940, + "test_time": 14252.227386, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004687, + "ave_all_frame_psnr": 29.108151, + "ave_all_frame_msssim": 0.928820, + "ave_all_frame_psnr_y": 25.951378, + "ave_all_frame_psnr_u": 37.361562, + "ave_all_frame_psnr_v": 39.795374, + "ave_all_frame_msssim_y": 0.917875, + "ave_all_frame_msssim_u": 0.950367, + "ave_all_frame_msssim_v": 0.972940, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC10_1920x1080_30.yuv" + } + }, + "videoSRC11_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.065574, + "ave_i_frame_psnr": 46.433201, + "ave_i_frame_msssim": 0.996302, + "ave_i_frame_psnr_y": 45.145234, + "ave_i_frame_psnr_u": 50.428910, + "ave_i_frame_psnr_v": 50.165290, + "ave_i_frame_msssim_y": 0.996117, + "ave_i_frame_msssim_u": 0.996946, + "ave_i_frame_msssim_v": 0.996771, + "test_time": 82811.708329, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.065574, + "ave_all_frame_psnr": 46.433201, + "ave_all_frame_msssim": 0.996302, + "ave_all_frame_psnr_y": 45.145234, + "ave_all_frame_psnr_u": 50.428910, + "ave_all_frame_psnr_v": 50.165290, + "ave_all_frame_msssim_y": 0.996117, + "ave_all_frame_msssim_u": 0.996946, + "ave_all_frame_msssim_v": 0.996771, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.041428, + "ave_i_frame_psnr": 44.803302, + "ave_i_frame_msssim": 0.994428, + "ave_i_frame_psnr_y": 43.350275, + "ave_i_frame_psnr_u": 49.251300, + "ave_i_frame_psnr_v": 49.073466, + "ave_i_frame_msssim_y": 0.994004, + "ave_i_frame_msssim_u": 0.995788, + "ave_i_frame_msssim_v": 0.995608, + "test_time": 65989.796992, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.041428, + "ave_all_frame_psnr": 44.803302, + "ave_all_frame_msssim": 0.994428, + "ave_all_frame_psnr_y": 43.350275, + "ave_all_frame_psnr_u": 49.251300, + "ave_all_frame_psnr_v": 49.073466, + "ave_all_frame_msssim_y": 0.994004, + "ave_all_frame_msssim_u": 0.995788, + "ave_all_frame_msssim_v": 0.995608, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.026063, + "ave_i_frame_psnr": 43.112924, + "ave_i_frame_msssim": 0.991523, + "ave_i_frame_psnr_y": 41.490083, + "ave_i_frame_psnr_u": 48.090105, + "ave_i_frame_psnr_v": 47.872789, + "ave_i_frame_msssim_y": 0.990654, + "ave_i_frame_msssim_u": 0.994218, + "ave_i_frame_msssim_v": 0.994039, + "test_time": 51344.577588, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.026063, + "ave_all_frame_psnr": 43.112924, + "ave_all_frame_msssim": 0.991523, + "ave_all_frame_psnr_y": 41.490083, + "ave_all_frame_psnr_u": 48.090105, + "ave_all_frame_psnr_v": 47.872789, + "ave_all_frame_msssim_y": 0.990654, + "ave_all_frame_msssim_u": 0.994218, + "ave_all_frame_msssim_v": 0.994039, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016707, + "ave_i_frame_psnr": 41.449754, + "ave_i_frame_msssim": 0.987289, + "ave_i_frame_psnr_y": 39.607043, + "ave_i_frame_psnr_u": 47.107483, + "ave_i_frame_psnr_v": 46.848286, + "ave_i_frame_msssim_y": 0.985565, + "ave_i_frame_msssim_u": 0.992619, + "ave_i_frame_msssim_v": 0.992302, + "test_time": 39126.227303, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016707, + "ave_all_frame_psnr": 41.449754, + "ave_all_frame_msssim": 0.987289, + "ave_all_frame_psnr_y": 39.607043, + "ave_all_frame_psnr_u": 47.107483, + "ave_all_frame_psnr_v": 46.848286, + "ave_all_frame_msssim_y": 0.985565, + "ave_all_frame_msssim_u": 0.992619, + "ave_all_frame_msssim_v": 0.992302, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011484, + "ave_i_frame_psnr": 39.995412, + "ave_i_frame_msssim": 0.982214, + "ave_i_frame_psnr_y": 38.054816, + "ave_i_frame_psnr_u": 45.876106, + "ave_i_frame_psnr_v": 45.758290, + "ave_i_frame_msssim_y": 0.979541, + "ave_i_frame_msssim_u": 0.990268, + "ave_i_frame_msssim_v": 0.990202, + "test_time": 30076.423692, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011484, + "ave_all_frame_psnr": 39.995412, + "ave_all_frame_msssim": 0.982214, + "ave_all_frame_psnr_y": 38.054816, + "ave_all_frame_psnr_u": 45.876106, + "ave_all_frame_psnr_v": 45.758290, + "ave_all_frame_msssim_y": 0.979541, + "ave_all_frame_msssim_u": 0.990268, + "ave_all_frame_msssim_v": 0.990202, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007937, + "ave_i_frame_psnr": 38.616889, + "ave_i_frame_msssim": 0.975516, + "ave_i_frame_psnr_y": 36.461834, + "ave_i_frame_psnr_u": 45.153031, + "ave_i_frame_psnr_v": 45.011079, + "ave_i_frame_msssim_y": 0.971197, + "ave_i_frame_msssim_u": 0.988433, + "ave_i_frame_msssim_v": 0.988511, + "test_time": 23529.658572, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007937, + "ave_all_frame_psnr": 38.616889, + "ave_all_frame_msssim": 0.975516, + "ave_all_frame_psnr_y": 36.461834, + "ave_all_frame_psnr_u": 45.153031, + "ave_all_frame_psnr_v": 45.011079, + "ave_all_frame_msssim_y": 0.971197, + "ave_all_frame_msssim_u": 0.988433, + "ave_all_frame_msssim_v": 0.988511, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005482, + "ave_i_frame_psnr": 37.185395, + "ave_i_frame_msssim": 0.966553, + "ave_i_frame_psnr_y": 34.871475, + "ave_i_frame_psnr_u": 44.145298, + "ave_i_frame_psnr_v": 44.109013, + "ave_i_frame_msssim_y": 0.960032, + "ave_i_frame_msssim_u": 0.986088, + "ave_i_frame_msssim_v": 0.986144, + "test_time": 18074.047097, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005482, + "ave_all_frame_psnr": 37.185395, + "ave_all_frame_msssim": 0.966553, + "ave_all_frame_psnr_y": 34.871475, + "ave_all_frame_psnr_u": 44.145298, + "ave_all_frame_psnr_v": 44.109013, + "ave_all_frame_msssim_y": 0.960032, + "ave_all_frame_msssim_u": 0.986088, + "ave_all_frame_msssim_v": 0.986144, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003798, + "ave_i_frame_psnr": 35.740273, + "ave_i_frame_msssim": 0.954583, + "ave_i_frame_psnr_y": 33.246188, + "ave_i_frame_psnr_u": 43.410728, + "ave_i_frame_psnr_v": 43.034323, + "ave_i_frame_msssim_y": 0.945011, + "ave_i_frame_msssim_u": 0.983631, + "ave_i_frame_msssim_v": 0.982965, + "test_time": 13777.808720, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003798, + "ave_all_frame_psnr": 35.740273, + "ave_all_frame_msssim": 0.954583, + "ave_all_frame_psnr_y": 33.246188, + "ave_all_frame_psnr_u": 43.410728, + "ave_all_frame_psnr_v": 43.034323, + "ave_all_frame_msssim_y": 0.945011, + "ave_all_frame_msssim_u": 0.983631, + "ave_all_frame_msssim_v": 0.982965, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002604, + "ave_i_frame_psnr": 34.114962, + "ave_i_frame_msssim": 0.938322, + "ave_i_frame_psnr_y": 31.594114, + "ave_i_frame_psnr_u": 41.876157, + "ave_i_frame_psnr_v": 41.478853, + "ave_i_frame_msssim_y": 0.924964, + "ave_i_frame_msssim_u": 0.978827, + "ave_i_frame_msssim_v": 0.977964, + "test_time": 10452.553939, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002604, + "ave_all_frame_psnr": 34.114962, + "ave_all_frame_msssim": 0.938322, + "ave_all_frame_psnr_y": 31.594114, + "ave_all_frame_psnr_u": 41.876157, + "ave_all_frame_psnr_v": 41.478853, + "ave_all_frame_msssim_y": 0.924964, + "ave_all_frame_msssim_u": 0.978827, + "ave_all_frame_msssim_v": 0.977964, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001793, + "ave_i_frame_psnr": 32.516700, + "ave_i_frame_msssim": 0.917858, + "ave_i_frame_psnr_y": 29.977109, + "ave_i_frame_psnr_u": 40.368010, + "ave_i_frame_psnr_v": 39.902934, + "ave_i_frame_msssim_y": 0.899604, + "ave_i_frame_msssim_u": 0.973060, + "ave_i_frame_msssim_v": 0.972183, + "test_time": 7841.419232, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001793, + "ave_all_frame_psnr": 32.516700, + "ave_all_frame_msssim": 0.917858, + "ave_all_frame_psnr_y": 29.977109, + "ave_all_frame_psnr_u": 40.368010, + "ave_all_frame_psnr_v": 39.902934, + "ave_all_frame_msssim_y": 0.899604, + "ave_all_frame_msssim_u": 0.973060, + "ave_all_frame_msssim_v": 0.972183, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC11_1920x1080_30.yuv" + } + }, + "videoSRC12_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.062942, + "ave_i_frame_psnr": 43.475754, + "ave_i_frame_msssim": 0.995180, + "ave_i_frame_psnr_y": 42.454535, + "ave_i_frame_psnr_u": 46.009145, + "ave_i_frame_psnr_v": 47.069675, + "ave_i_frame_msssim_y": 0.995666, + "ave_i_frame_msssim_u": 0.993429, + "ave_i_frame_msssim_v": 0.994022, + "test_time": 98632.059238, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.062942, + "ave_all_frame_psnr": 43.475754, + "ave_all_frame_msssim": 0.995180, + "ave_all_frame_psnr_y": 42.454535, + "ave_all_frame_psnr_u": 46.009145, + "ave_all_frame_psnr_v": 47.069675, + "ave_all_frame_msssim_y": 0.995666, + "ave_all_frame_msssim_u": 0.993429, + "ave_all_frame_msssim_v": 0.994022, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.031578, + "ave_i_frame_psnr": 41.711555, + "ave_i_frame_msssim": 0.992359, + "ave_i_frame_psnr_y": 40.471409, + "ave_i_frame_psnr_u": 44.901681, + "ave_i_frame_psnr_v": 45.962304, + "ave_i_frame_msssim_y": 0.992743, + "ave_i_frame_msssim_u": 0.990753, + "ave_i_frame_msssim_v": 0.991665, + "test_time": 70726.316728, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.031578, + "ave_all_frame_psnr": 41.711555, + "ave_all_frame_msssim": 0.992359, + "ave_all_frame_psnr_y": 40.471409, + "ave_all_frame_psnr_u": 44.901681, + "ave_all_frame_psnr_v": 45.962304, + "ave_all_frame_msssim_y": 0.992743, + "ave_all_frame_msssim_u": 0.990753, + "ave_all_frame_msssim_v": 0.991665, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017300, + "ave_i_frame_psnr": 40.164278, + "ave_i_frame_msssim": 0.988490, + "ave_i_frame_psnr_y": 38.755859, + "ave_i_frame_psnr_u": 43.871488, + "ave_i_frame_psnr_v": 44.907582, + "ave_i_frame_msssim_y": 0.988626, + "ave_i_frame_msssim_u": 0.987403, + "ave_i_frame_msssim_v": 0.988762, + "test_time": 49675.753919, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017300, + "ave_all_frame_psnr": 40.164278, + "ave_all_frame_msssim": 0.988490, + "ave_all_frame_psnr_y": 38.755859, + "ave_all_frame_psnr_u": 43.871488, + "ave_all_frame_psnr_v": 44.907582, + "ave_all_frame_msssim_y": 0.988626, + "ave_all_frame_msssim_u": 0.987403, + "ave_all_frame_msssim_v": 0.988762, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009855, + "ave_i_frame_psnr": 38.682229, + "ave_i_frame_msssim": 0.983013, + "ave_i_frame_psnr_y": 37.100328, + "ave_i_frame_psnr_u": 42.900746, + "ave_i_frame_psnr_v": 43.955120, + "ave_i_frame_msssim_y": 0.982604, + "ave_i_frame_msssim_u": 0.983165, + "ave_i_frame_msssim_v": 0.985319, + "test_time": 32512.212807, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009855, + "ave_all_frame_psnr": 38.682229, + "ave_all_frame_msssim": 0.983013, + "ave_all_frame_psnr_y": 37.100328, + "ave_all_frame_psnr_u": 42.900746, + "ave_all_frame_psnr_v": 43.955120, + "ave_all_frame_msssim_y": 0.982604, + "ave_all_frame_msssim_u": 0.983165, + "ave_all_frame_msssim_v": 0.985319, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006110, + "ave_i_frame_psnr": 37.337334, + "ave_i_frame_msssim": 0.976121, + "ave_i_frame_psnr_y": 35.631772, + "ave_i_frame_psnr_u": 41.916676, + "ave_i_frame_psnr_v": 42.991366, + "ave_i_frame_msssim_y": 0.974926, + "ave_i_frame_msssim_u": 0.978208, + "ave_i_frame_msssim_v": 0.981204, + "test_time": 23767.033055, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006110, + "ave_all_frame_psnr": 37.337334, + "ave_all_frame_msssim": 0.976121, + "ave_all_frame_psnr_y": 35.631772, + "ave_all_frame_psnr_u": 41.916676, + "ave_all_frame_psnr_v": 42.991366, + "ave_all_frame_msssim_y": 0.974926, + "ave_all_frame_msssim_u": 0.978208, + "ave_all_frame_msssim_v": 0.981204, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003742, + "ave_i_frame_psnr": 36.048996, + "ave_i_frame_msssim": 0.967049, + "ave_i_frame_psnr_y": 34.178418, + "ave_i_frame_psnr_u": 40.986641, + "ave_i_frame_psnr_v": 42.334817, + "ave_i_frame_msssim_y": 0.964098, + "ave_i_frame_msssim_u": 0.973260, + "ave_i_frame_msssim_v": 0.978540, + "test_time": 17089.628114, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003742, + "ave_all_frame_psnr": 36.048996, + "ave_all_frame_msssim": 0.967049, + "ave_all_frame_psnr_y": 34.178418, + "ave_all_frame_psnr_u": 40.986641, + "ave_all_frame_psnr_v": 42.334817, + "ave_all_frame_msssim_y": 0.964098, + "ave_all_frame_msssim_u": 0.973260, + "ave_all_frame_msssim_v": 0.978540, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002291, + "ave_i_frame_psnr": 34.784446, + "ave_i_frame_msssim": 0.954779, + "ave_i_frame_psnr_y": 32.745031, + "ave_i_frame_psnr_u": 40.261801, + "ave_i_frame_psnr_v": 41.543585, + "ave_i_frame_msssim_y": 0.949301, + "ave_i_frame_msssim_u": 0.968059, + "ave_i_frame_msssim_v": 0.974364, + "test_time": 12341.530187, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002291, + "ave_all_frame_psnr": 34.784446, + "ave_all_frame_msssim": 0.954779, + "ave_all_frame_psnr_y": 32.745031, + "ave_all_frame_psnr_u": 40.261801, + "ave_all_frame_psnr_v": 41.543585, + "ave_all_frame_msssim_y": 0.949301, + "ave_all_frame_msssim_u": 0.968059, + "ave_all_frame_msssim_v": 0.974364, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001418, + "ave_i_frame_psnr": 33.586039, + "ave_i_frame_msssim": 0.939825, + "ave_i_frame_psnr_y": 31.359855, + "ave_i_frame_psnr_u": 39.615168, + "ave_i_frame_psnr_v": 40.914011, + "ave_i_frame_msssim_y": 0.930825, + "ave_i_frame_msssim_u": 0.962856, + "ave_i_frame_msssim_v": 0.970791, + "test_time": 8926.570544, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001418, + "ave_all_frame_psnr": 33.586039, + "ave_all_frame_msssim": 0.939825, + "ave_all_frame_psnr_y": 31.359855, + "ave_all_frame_psnr_u": 39.615168, + "ave_all_frame_psnr_v": 40.914011, + "ave_all_frame_msssim_y": 0.930825, + "ave_all_frame_msssim_u": 0.962856, + "ave_all_frame_msssim_v": 0.970791, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000887, + "ave_i_frame_psnr": 32.314815, + "ave_i_frame_msssim": 0.920176, + "ave_i_frame_psnr_y": 30.003748, + "ave_i_frame_psnr_u": 38.656236, + "ave_i_frame_psnr_v": 39.839796, + "ave_i_frame_msssim_y": 0.907251, + "ave_i_frame_msssim_u": 0.953813, + "ave_i_frame_msssim_v": 0.964094, + "test_time": 6687.421905, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000887, + "ave_all_frame_psnr": 32.314815, + "ave_all_frame_msssim": 0.920176, + "ave_all_frame_psnr_y": 30.003748, + "ave_all_frame_psnr_u": 38.656236, + "ave_all_frame_psnr_v": 39.839796, + "ave_all_frame_msssim_y": 0.907251, + "ave_all_frame_msssim_u": 0.953813, + "ave_all_frame_msssim_v": 0.964094, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000563, + "ave_i_frame_psnr": 30.983054, + "ave_i_frame_msssim": 0.896168, + "ave_i_frame_psnr_y": 28.645223, + "ave_i_frame_psnr_u": 37.435762, + "ave_i_frame_psnr_v": 38.557337, + "ave_i_frame_msssim_y": 0.878713, + "ave_i_frame_msssim_u": 0.942443, + "ave_i_frame_msssim_v": 0.954623, + "test_time": 5299.581438, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000563, + "ave_all_frame_psnr": 30.983054, + "ave_all_frame_msssim": 0.896168, + "ave_all_frame_psnr_y": 28.645223, + "ave_all_frame_psnr_u": 37.435762, + "ave_all_frame_psnr_v": 38.557337, + "ave_all_frame_msssim_y": 0.878713, + "ave_all_frame_msssim_u": 0.942443, + "ave_all_frame_msssim_v": 0.954623, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC12_1920x1080_30.yuv" + } + }, + "videoSRC13_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.276929, + "ave_i_frame_psnr": 41.514345, + "ave_i_frame_msssim": 0.994707, + "ave_i_frame_psnr_y": 39.837177, + "ave_i_frame_psnr_u": 46.031691, + "ave_i_frame_psnr_v": 47.060009, + "ave_i_frame_msssim_y": 0.995217, + "ave_i_frame_msssim_u": 0.992640, + "ave_i_frame_msssim_v": 0.993714, + "test_time": 91416.468179, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.276929, + "ave_all_frame_psnr": 41.514345, + "ave_all_frame_msssim": 0.994707, + "ave_all_frame_psnr_y": 39.837177, + "ave_all_frame_psnr_u": 46.031691, + "ave_all_frame_psnr_v": 47.060009, + "ave_all_frame_msssim_y": 0.995217, + "ave_all_frame_msssim_u": 0.992640, + "ave_all_frame_msssim_v": 0.993714, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.091846, + "ave_i_frame_psnr": 39.337109, + "ave_i_frame_msssim": 0.992945, + "ave_i_frame_psnr_y": 37.115399, + "ave_i_frame_psnr_u": 45.433563, + "ave_i_frame_psnr_v": 46.570915, + "ave_i_frame_msssim_y": 0.993255, + "ave_i_frame_msssim_u": 0.991267, + "ave_i_frame_msssim_v": 0.992764, + "test_time": 63548.615421, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.091846, + "ave_all_frame_psnr": 39.337109, + "ave_all_frame_msssim": 0.992945, + "ave_all_frame_psnr_y": 37.115399, + "ave_all_frame_psnr_u": 45.433563, + "ave_all_frame_psnr_v": 46.570915, + "ave_all_frame_msssim_y": 0.993255, + "ave_all_frame_msssim_u": 0.991267, + "ave_all_frame_msssim_v": 0.992764, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.030702, + "ave_i_frame_psnr": 37.962280, + "ave_i_frame_msssim": 0.990939, + "ave_i_frame_psnr_y": 35.475919, + "ave_i_frame_psnr_u": 44.796530, + "ave_i_frame_psnr_v": 46.046198, + "ave_i_frame_msssim_y": 0.991043, + "ave_i_frame_msssim_u": 0.989623, + "ave_i_frame_msssim_v": 0.991630, + "test_time": 30081.082496, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.030702, + "ave_all_frame_psnr": 37.962280, + "ave_all_frame_msssim": 0.990939, + "ave_all_frame_psnr_y": 35.475919, + "ave_all_frame_psnr_u": 44.796530, + "ave_all_frame_psnr_v": 46.046198, + "ave_all_frame_msssim_y": 0.991043, + "ave_all_frame_msssim_u": 0.989623, + "ave_all_frame_msssim_v": 0.991630, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012747, + "ave_i_frame_psnr": 36.848355, + "ave_i_frame_msssim": 0.988241, + "ave_i_frame_psnr_y": 34.196426, + "ave_i_frame_psnr_u": 44.135155, + "ave_i_frame_psnr_v": 45.473124, + "ave_i_frame_msssim_y": 0.988056, + "ave_i_frame_msssim_u": 0.987420, + "ave_i_frame_msssim_v": 0.990171, + "test_time": 17455.216629, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012747, + "ave_all_frame_psnr": 36.848355, + "ave_all_frame_msssim": 0.988241, + "ave_all_frame_psnr_y": 34.196426, + "ave_all_frame_psnr_u": 44.135155, + "ave_all_frame_psnr_v": 45.473124, + "ave_all_frame_msssim_y": 0.988056, + "ave_all_frame_msssim_u": 0.987420, + "ave_all_frame_msssim_v": 0.990171, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006347, + "ave_i_frame_psnr": 35.692274, + "ave_i_frame_msssim": 0.984308, + "ave_i_frame_psnr_y": 32.835618, + "ave_i_frame_psnr_u": 43.563697, + "ave_i_frame_psnr_v": 44.960786, + "ave_i_frame_msssim_y": 0.983472, + "ave_i_frame_msssim_u": 0.984895, + "ave_i_frame_msssim_v": 0.988743, + "test_time": 11672.736056, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006347, + "ave_all_frame_psnr": 35.692274, + "ave_all_frame_msssim": 0.984308, + "ave_all_frame_psnr_y": 32.835618, + "ave_all_frame_psnr_u": 43.563697, + "ave_all_frame_psnr_v": 44.960786, + "ave_all_frame_msssim_y": 0.983472, + "ave_all_frame_msssim_u": 0.984895, + "ave_all_frame_msssim_v": 0.988743, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003464, + "ave_i_frame_psnr": 34.155870, + "ave_i_frame_msssim": 0.977565, + "ave_i_frame_psnr_y": 31.351104, + "ave_i_frame_psnr_u": 41.916547, + "ave_i_frame_psnr_v": 43.223789, + "ave_i_frame_msssim_y": 0.976566, + "ave_i_frame_msssim_u": 0.978069, + "ave_i_frame_msssim_v": 0.983049, + "test_time": 9105.429956, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003464, + "ave_all_frame_psnr": 34.155870, + "ave_all_frame_msssim": 0.977565, + "ave_all_frame_psnr_y": 31.351104, + "ave_all_frame_psnr_u": 41.916547, + "ave_all_frame_psnr_v": 43.223789, + "ave_all_frame_msssim_y": 0.976566, + "ave_all_frame_msssim_u": 0.978069, + "ave_all_frame_msssim_v": 0.983049, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002062, + "ave_i_frame_psnr": 32.859286, + "ave_i_frame_msssim": 0.969135, + "ave_i_frame_psnr_y": 29.812321, + "ave_i_frame_psnr_u": 41.214423, + "ave_i_frame_psnr_v": 42.785942, + "ave_i_frame_msssim_y": 0.966217, + "ave_i_frame_msssim_u": 0.974638, + "ave_i_frame_msssim_v": 0.981141, + "test_time": 7364.730946, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002062, + "ave_all_frame_psnr": 32.859286, + "ave_all_frame_msssim": 0.969135, + "ave_all_frame_psnr_y": 29.812321, + "ave_all_frame_psnr_u": 41.214423, + "ave_all_frame_psnr_v": 42.785942, + "ave_all_frame_msssim_y": 0.966217, + "ave_all_frame_msssim_u": 0.974638, + "ave_all_frame_msssim_v": 0.981141, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001274, + "ave_i_frame_psnr": 31.580353, + "ave_i_frame_msssim": 0.957329, + "ave_i_frame_psnr_y": 28.166360, + "ave_i_frame_psnr_u": 41.088235, + "ave_i_frame_psnr_v": 42.556427, + "ave_i_frame_msssim_y": 0.950861, + "ave_i_frame_msssim_u": 0.973311, + "ave_i_frame_msssim_v": 0.980152, + "test_time": 6170.718237, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001274, + "ave_all_frame_psnr": 31.580353, + "ave_all_frame_msssim": 0.957329, + "ave_all_frame_psnr_y": 28.166360, + "ave_all_frame_psnr_u": 41.088235, + "ave_all_frame_psnr_v": 42.556427, + "ave_all_frame_msssim_y": 0.950861, + "ave_all_frame_msssim_u": 0.973311, + "ave_all_frame_msssim_v": 0.980152, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000798, + "ave_i_frame_psnr": 30.168760, + "ave_i_frame_msssim": 0.940229, + "ave_i_frame_psnr_y": 26.503440, + "ave_i_frame_psnr_u": 40.425831, + "ave_i_frame_psnr_v": 41.903609, + "ave_i_frame_msssim_y": 0.929278, + "ave_i_frame_msssim_u": 0.968524, + "ave_i_frame_msssim_v": 0.977636, + "test_time": 5382.159330, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000798, + "ave_all_frame_psnr": 30.168760, + "ave_all_frame_msssim": 0.940229, + "ave_all_frame_psnr_y": 26.503440, + "ave_all_frame_psnr_u": 40.425831, + "ave_all_frame_psnr_v": 41.903609, + "ave_all_frame_msssim_y": 0.929278, + "ave_all_frame_msssim_u": 0.968524, + "ave_all_frame_msssim_v": 0.977636, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000500, + "ave_i_frame_psnr": 28.773252, + "ave_i_frame_msssim": 0.919733, + "ave_i_frame_psnr_y": 24.884173, + "ave_i_frame_psnr_u": 39.773868, + "ave_i_frame_psnr_v": 41.107106, + "ave_i_frame_msssim_y": 0.902675, + "ave_i_frame_msssim_u": 0.966207, + "ave_i_frame_msssim_v": 0.975608, + "test_time": 4885.926169, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000500, + "ave_all_frame_psnr": 28.773252, + "ave_all_frame_msssim": 0.919733, + "ave_all_frame_psnr_y": 24.884173, + "ave_all_frame_psnr_u": 39.773868, + "ave_all_frame_psnr_v": 41.107106, + "ave_all_frame_msssim_y": 0.902675, + "ave_all_frame_msssim_u": 0.966207, + "ave_all_frame_msssim_v": 0.975608, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC13_1920x1080_30.yuv" + } + }, + "videoSRC14_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.097621, + "ave_i_frame_psnr": 42.801071, + "ave_i_frame_msssim": 0.992993, + "ave_i_frame_psnr_y": 41.896881, + "ave_i_frame_psnr_u": 46.113503, + "ave_i_frame_psnr_v": 44.913777, + "ave_i_frame_msssim_y": 0.992987, + "ave_i_frame_msssim_u": 0.993409, + "ave_i_frame_msssim_v": 0.992616, + "test_time": 148065.953979, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.097621, + "ave_all_frame_psnr": 42.801071, + "ave_all_frame_msssim": 0.992993, + "ave_all_frame_psnr_y": 41.896881, + "ave_all_frame_psnr_u": 46.113503, + "ave_all_frame_psnr_v": 44.913777, + "ave_all_frame_msssim_y": 0.992987, + "ave_all_frame_msssim_u": 0.993409, + "ave_all_frame_msssim_v": 0.992616, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.061668, + "ave_i_frame_psnr": 41.465436, + "ave_i_frame_msssim": 0.989994, + "ave_i_frame_psnr_y": 40.526954, + "ave_i_frame_psnr_u": 45.004972, + "ave_i_frame_psnr_v": 43.556791, + "ave_i_frame_msssim_y": 0.989968, + "ave_i_frame_msssim_u": 0.990902, + "ave_i_frame_msssim_v": 0.989240, + "test_time": 109066.581211, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.061668, + "ave_all_frame_psnr": 41.465436, + "ave_all_frame_msssim": 0.989994, + "ave_all_frame_psnr_y": 40.526954, + "ave_all_frame_psnr_u": 45.004972, + "ave_all_frame_psnr_v": 43.556791, + "ave_all_frame_msssim_y": 0.989968, + "ave_all_frame_msssim_u": 0.990902, + "ave_all_frame_msssim_v": 0.989240, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.040220, + "ave_i_frame_psnr": 39.983468, + "ave_i_frame_msssim": 0.985446, + "ave_i_frame_psnr_y": 38.961844, + "ave_i_frame_psnr_u": 43.885106, + "ave_i_frame_psnr_v": 42.211573, + "ave_i_frame_msssim_y": 0.985209, + "ave_i_frame_msssim_u": 0.987663, + "ave_i_frame_msssim_v": 0.984653, + "test_time": 80714.783387, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.040220, + "ave_all_frame_psnr": 39.983468, + "ave_all_frame_msssim": 0.985446, + "ave_all_frame_psnr_y": 38.961844, + "ave_all_frame_psnr_u": 43.885106, + "ave_all_frame_psnr_v": 42.211573, + "ave_all_frame_msssim_y": 0.985209, + "ave_all_frame_msssim_u": 0.987663, + "ave_all_frame_msssim_v": 0.984653, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.026609, + "ave_i_frame_psnr": 38.437271, + "ave_i_frame_msssim": 0.978815, + "ave_i_frame_psnr_y": 37.232438, + "ave_i_frame_psnr_u": 42.948772, + "ave_i_frame_psnr_v": 41.154762, + "ave_i_frame_msssim_y": 0.977758, + "ave_i_frame_msssim_u": 0.984160, + "ave_i_frame_msssim_v": 0.979812, + "test_time": 61448.967420, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.026609, + "ave_all_frame_psnr": 38.437271, + "ave_all_frame_msssim": 0.978815, + "ave_all_frame_psnr_y": 37.232438, + "ave_all_frame_psnr_u": 42.948772, + "ave_all_frame_psnr_v": 41.154762, + "ave_all_frame_msssim_y": 0.977758, + "ave_all_frame_msssim_u": 0.984160, + "ave_all_frame_msssim_v": 0.979812, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.018644, + "ave_i_frame_psnr": 37.036116, + "ave_i_frame_msssim": 0.970521, + "ave_i_frame_psnr_y": 35.718879, + "ave_i_frame_psnr_u": 41.983873, + "ave_i_frame_psnr_v": 39.991784, + "ave_i_frame_msssim_y": 0.968584, + "ave_i_frame_msssim_u": 0.979759, + "ave_i_frame_msssim_v": 0.972906, + "test_time": 48735.906427, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.018644, + "ave_all_frame_psnr": 37.036116, + "ave_all_frame_msssim": 0.970521, + "ave_all_frame_psnr_y": 35.718879, + "ave_all_frame_psnr_u": 41.983873, + "ave_all_frame_psnr_v": 39.991784, + "ave_all_frame_msssim_y": 0.968584, + "ave_all_frame_msssim_u": 0.979759, + "ave_all_frame_msssim_v": 0.972906, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013062, + "ave_i_frame_psnr": 35.624938, + "ave_i_frame_msssim": 0.959397, + "ave_i_frame_psnr_y": 34.133266, + "ave_i_frame_psnr_u": 41.090127, + "ave_i_frame_psnr_v": 39.109784, + "ave_i_frame_msssim_y": 0.955671, + "ave_i_frame_msssim_u": 0.974436, + "ave_i_frame_msssim_v": 0.966716, + "test_time": 38591.025502, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013062, + "ave_all_frame_psnr": 35.624938, + "ave_all_frame_msssim": 0.959397, + "ave_all_frame_psnr_y": 34.133266, + "ave_all_frame_psnr_u": 41.090127, + "ave_all_frame_psnr_v": 39.109784, + "ave_all_frame_msssim_y": 0.955671, + "ave_all_frame_msssim_u": 0.974436, + "ave_all_frame_msssim_v": 0.966716, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009005, + "ave_i_frame_psnr": 34.186327, + "ave_i_frame_msssim": 0.944264, + "ave_i_frame_psnr_y": 32.522317, + "ave_i_frame_psnr_u": 40.263127, + "ave_i_frame_psnr_v": 38.093589, + "ave_i_frame_msssim_y": 0.937925, + "ave_i_frame_msssim_u": 0.968617, + "ave_i_frame_msssim_v": 0.957943, + "test_time": 28820.050653, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009005, + "ave_all_frame_psnr": 34.186327, + "ave_all_frame_msssim": 0.944264, + "ave_all_frame_psnr_y": 32.522317, + "ave_all_frame_psnr_u": 40.263127, + "ave_all_frame_psnr_v": 38.093589, + "ave_all_frame_msssim_y": 0.937925, + "ave_all_frame_msssim_u": 0.968617, + "ave_all_frame_msssim_v": 0.957943, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006175, + "ave_i_frame_psnr": 32.747837, + "ave_i_frame_msssim": 0.924660, + "ave_i_frame_psnr_y": 30.887175, + "ave_i_frame_psnr_u": 39.529479, + "ave_i_frame_psnr_v": 37.130173, + "ave_i_frame_msssim_y": 0.914407, + "ave_i_frame_msssim_u": 0.962896, + "ave_i_frame_msssim_v": 0.947937, + "test_time": 22237.945809, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006175, + "ave_all_frame_psnr": 32.747837, + "ave_all_frame_msssim": 0.924660, + "ave_all_frame_psnr_y": 30.887175, + "ave_all_frame_psnr_u": 39.529479, + "ave_all_frame_psnr_v": 37.130173, + "ave_all_frame_msssim_y": 0.914407, + "ave_all_frame_msssim_u": 0.962896, + "ave_all_frame_msssim_v": 0.947937, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004151, + "ave_i_frame_psnr": 31.243454, + "ave_i_frame_msssim": 0.899686, + "ave_i_frame_psnr_y": 29.276757, + "ave_i_frame_psnr_u": 38.421735, + "ave_i_frame_psnr_v": 35.865352, + "ave_i_frame_msssim_y": 0.885520, + "ave_i_frame_msssim_u": 0.952961, + "ave_i_frame_msssim_v": 0.931408, + "test_time": 16174.900143, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004151, + "ave_all_frame_psnr": 31.243454, + "ave_all_frame_msssim": 0.899686, + "ave_all_frame_psnr_y": 29.276757, + "ave_all_frame_psnr_u": 38.421735, + "ave_all_frame_psnr_v": 35.865352, + "ave_all_frame_msssim_y": 0.885520, + "ave_all_frame_msssim_u": 0.952961, + "ave_all_frame_msssim_v": 0.931408, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002757, + "ave_i_frame_psnr": 29.736944, + "ave_i_frame_msssim": 0.867975, + "ave_i_frame_psnr_y": 27.653322, + "ave_i_frame_psnr_u": 37.375338, + "ave_i_frame_psnr_v": 34.600281, + "ave_i_frame_msssim_y": 0.848698, + "ave_i_frame_msssim_u": 0.941316, + "ave_i_frame_msssim_v": 0.910294, + "test_time": 10382.552479, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002757, + "ave_all_frame_psnr": 29.736944, + "ave_all_frame_msssim": 0.867975, + "ave_all_frame_psnr_y": 27.653322, + "ave_all_frame_psnr_u": 37.375338, + "ave_all_frame_psnr_v": 34.600281, + "ave_all_frame_msssim_y": 0.848698, + "ave_all_frame_msssim_u": 0.941316, + "ave_all_frame_msssim_v": 0.910294, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC14_1920x1080_30.yuv" + } + }, + "videoSRC15_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.060228, + "ave_i_frame_psnr": 40.436820, + "ave_i_frame_msssim": 0.991086, + "ave_i_frame_psnr_y": 39.514511, + "ave_i_frame_psnr_u": 41.954718, + "ave_i_frame_psnr_v": 44.452773, + "ave_i_frame_msssim_y": 0.991608, + "ave_i_frame_msssim_u": 0.987239, + "ave_i_frame_msssim_v": 0.991796, + "test_time": 96150.658753, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.060228, + "ave_all_frame_psnr": 40.436820, + "ave_all_frame_msssim": 0.991086, + "ave_all_frame_psnr_y": 39.514511, + "ave_all_frame_psnr_u": 41.954718, + "ave_all_frame_psnr_v": 44.452773, + "ave_all_frame_msssim_y": 0.991608, + "ave_all_frame_msssim_u": 0.987239, + "ave_all_frame_msssim_v": 0.991796, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.018122, + "ave_i_frame_psnr": 39.533128, + "ave_i_frame_msssim": 0.988782, + "ave_i_frame_psnr_y": 38.551262, + "ave_i_frame_psnr_u": 41.327769, + "ave_i_frame_psnr_v": 43.629683, + "ave_i_frame_msssim_y": 0.989286, + "ave_i_frame_msssim_u": 0.984756, + "ave_i_frame_msssim_v": 0.989781, + "test_time": 40209.036364, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.018122, + "ave_all_frame_psnr": 39.533128, + "ave_all_frame_msssim": 0.988782, + "ave_all_frame_psnr_y": 38.551262, + "ave_all_frame_psnr_u": 41.327769, + "ave_all_frame_psnr_v": 43.629683, + "ave_all_frame_msssim_y": 0.989286, + "ave_all_frame_msssim_u": 0.984756, + "ave_all_frame_msssim_v": 0.989781, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008141, + "ave_i_frame_psnr": 38.548468, + "ave_i_frame_msssim": 0.985682, + "ave_i_frame_psnr_y": 37.446156, + "ave_i_frame_psnr_u": 40.839556, + "ave_i_frame_psnr_v": 42.871252, + "ave_i_frame_msssim_y": 0.985826, + "ave_i_frame_msssim_u": 0.982837, + "ave_i_frame_msssim_v": 0.987661, + "test_time": 26189.045941, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008141, + "ave_all_frame_psnr": 38.548468, + "ave_all_frame_msssim": 0.985682, + "ave_all_frame_psnr_y": 37.446156, + "ave_all_frame_psnr_u": 40.839556, + "ave_all_frame_psnr_v": 42.871252, + "ave_all_frame_msssim_y": 0.985826, + "ave_all_frame_msssim_u": 0.982837, + "ave_all_frame_msssim_v": 0.987661, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004763, + "ave_i_frame_psnr": 37.512187, + "ave_i_frame_msssim": 0.981325, + "ave_i_frame_psnr_y": 36.304867, + "ave_i_frame_psnr_u": 40.249478, + "ave_i_frame_psnr_v": 42.018818, + "ave_i_frame_msssim_y": 0.980977, + "ave_i_frame_msssim_u": 0.980212, + "ave_i_frame_msssim_v": 0.984523, + "test_time": 19710.589620, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004763, + "ave_all_frame_psnr": 37.512187, + "ave_all_frame_msssim": 0.981325, + "ave_all_frame_psnr_y": 36.304867, + "ave_all_frame_psnr_u": 40.249478, + "ave_all_frame_psnr_v": 42.018818, + "ave_all_frame_msssim_y": 0.980977, + "ave_all_frame_msssim_u": 0.980212, + "ave_all_frame_msssim_v": 0.984523, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003201, + "ave_i_frame_psnr": 36.393857, + "ave_i_frame_msssim": 0.975114, + "ave_i_frame_psnr_y": 35.096587, + "ave_i_frame_psnr_u": 39.533700, + "ave_i_frame_psnr_v": 41.037636, + "ave_i_frame_msssim_y": 0.974101, + "ave_i_frame_msssim_u": 0.976183, + "ave_i_frame_msssim_v": 0.980128, + "test_time": 15749.053322, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003201, + "ave_all_frame_psnr": 36.393857, + "ave_all_frame_msssim": 0.975114, + "ave_all_frame_psnr_y": 35.096587, + "ave_all_frame_psnr_u": 39.533700, + "ave_all_frame_psnr_v": 41.037636, + "ave_all_frame_msssim_y": 0.974101, + "ave_all_frame_msssim_u": 0.976183, + "ave_all_frame_msssim_v": 0.980128, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002165, + "ave_i_frame_psnr": 35.130157, + "ave_i_frame_msssim": 0.965214, + "ave_i_frame_psnr_y": 33.705250, + "ave_i_frame_psnr_u": 38.702475, + "ave_i_frame_psnr_v": 40.107276, + "ave_i_frame_msssim_y": 0.962627, + "ave_i_frame_msssim_u": 0.971285, + "ave_i_frame_msssim_v": 0.974662, + "test_time": 12877.779374, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002165, + "ave_all_frame_psnr": 35.130157, + "ave_all_frame_msssim": 0.965214, + "ave_all_frame_psnr_y": 33.705250, + "ave_all_frame_psnr_u": 38.702475, + "ave_all_frame_psnr_v": 40.107276, + "ave_all_frame_msssim_y": 0.962627, + "ave_all_frame_msssim_u": 0.971285, + "ave_all_frame_msssim_v": 0.974662, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001473, + "ave_i_frame_psnr": 33.861998, + "ave_i_frame_msssim": 0.950051, + "ave_i_frame_psnr_y": 32.227825, + "ave_i_frame_psnr_u": 38.139625, + "ave_i_frame_psnr_v": 39.389405, + "ave_i_frame_msssim_y": 0.944137, + "ave_i_frame_msssim_u": 0.966447, + "ave_i_frame_msssim_v": 0.969138, + "test_time": 10559.284901, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001473, + "ave_all_frame_psnr": 33.861998, + "ave_all_frame_msssim": 0.950051, + "ave_all_frame_psnr_y": 32.227825, + "ave_all_frame_psnr_u": 38.139625, + "ave_all_frame_psnr_v": 39.389405, + "ave_all_frame_msssim_y": 0.944137, + "ave_all_frame_msssim_u": 0.966447, + "ave_all_frame_msssim_v": 0.969138, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001011, + "ave_i_frame_psnr": 32.622750, + "ave_i_frame_msssim": 0.928912, + "ave_i_frame_psnr_y": 30.738838, + "ave_i_frame_psnr_u": 37.645024, + "ave_i_frame_psnr_v": 38.903948, + "ave_i_frame_msssim_y": 0.917342, + "ave_i_frame_msssim_u": 0.961862, + "ave_i_frame_msssim_v": 0.965383, + "test_time": 8758.368118, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001011, + "ave_all_frame_psnr": 32.622750, + "ave_all_frame_msssim": 0.928912, + "ave_all_frame_psnr_y": 30.738838, + "ave_all_frame_psnr_u": 37.645024, + "ave_all_frame_psnr_v": 38.903948, + "ave_all_frame_msssim_y": 0.917342, + "ave_all_frame_msssim_u": 0.961862, + "ave_all_frame_msssim_v": 0.965383, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000697, + "ave_i_frame_psnr": 31.283122, + "ave_i_frame_msssim": 0.897508, + "ave_i_frame_psnr_y": 29.287271, + "ave_i_frame_psnr_u": 36.665430, + "ave_i_frame_psnr_v": 37.875921, + "ave_i_frame_msssim_y": 0.878998, + "ave_i_frame_msssim_u": 0.950408, + "ave_i_frame_msssim_v": 0.955670, + "test_time": 7292.483102, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000697, + "ave_all_frame_psnr": 31.283122, + "ave_all_frame_msssim": 0.897508, + "ave_all_frame_psnr_y": 29.287271, + "ave_all_frame_psnr_u": 36.665430, + "ave_all_frame_psnr_v": 37.875921, + "ave_all_frame_msssim_y": 0.878998, + "ave_all_frame_msssim_u": 0.950408, + "ave_all_frame_msssim_v": 0.955670, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000496, + "ave_i_frame_psnr": 29.988365, + "ave_i_frame_msssim": 0.856457, + "ave_i_frame_psnr_y": 27.886618, + "ave_i_frame_psnr_u": 35.598145, + "ave_i_frame_psnr_v": 36.989065, + "ave_i_frame_msssim_y": 0.828810, + "ave_i_frame_msssim_u": 0.935165, + "ave_i_frame_msssim_v": 0.943630, + "test_time": 5799.923993, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000496, + "ave_all_frame_psnr": 29.988365, + "ave_all_frame_msssim": 0.856457, + "ave_all_frame_psnr_y": 27.886618, + "ave_all_frame_psnr_u": 35.598145, + "ave_all_frame_psnr_v": 36.989065, + "ave_all_frame_msssim_y": 0.828810, + "ave_all_frame_msssim_u": 0.935165, + "ave_all_frame_msssim_v": 0.943630, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC15_1920x1080_30.yuv" + } + }, + "videoSRC16_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.019684, + "ave_i_frame_psnr": 44.313164, + "ave_i_frame_msssim": 0.992836, + "ave_i_frame_psnr_y": 43.396352, + "ave_i_frame_psnr_u": 46.303050, + "ave_i_frame_psnr_v": 47.824149, + "ave_i_frame_msssim_y": 0.992208, + "ave_i_frame_msssim_u": 0.994395, + "ave_i_frame_msssim_v": 0.995041, + "test_time": 58884.049128, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.019684, + "ave_all_frame_psnr": 44.313164, + "ave_all_frame_msssim": 0.992836, + "ave_all_frame_psnr_y": 43.396352, + "ave_all_frame_psnr_u": 46.303050, + "ave_all_frame_psnr_v": 47.824149, + "ave_all_frame_msssim_y": 0.992208, + "ave_all_frame_msssim_u": 0.994395, + "ave_all_frame_msssim_v": 0.995041, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011931, + "ave_i_frame_psnr": 43.647838, + "ave_i_frame_msssim": 0.991303, + "ave_i_frame_psnr_y": 42.779992, + "ave_i_frame_psnr_u": 45.417210, + "ave_i_frame_psnr_v": 47.085545, + "ave_i_frame_msssim_y": 0.990655, + "ave_i_frame_msssim_u": 0.992818, + "ave_i_frame_msssim_v": 0.993676, + "test_time": 41321.189653, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011931, + "ave_all_frame_psnr": 43.647838, + "ave_all_frame_msssim": 0.991303, + "ave_all_frame_psnr_y": 42.779992, + "ave_all_frame_psnr_u": 45.417210, + "ave_all_frame_psnr_v": 47.085545, + "ave_all_frame_msssim_y": 0.990655, + "ave_all_frame_msssim_u": 0.992818, + "ave_all_frame_msssim_v": 0.993676, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007388, + "ave_i_frame_psnr": 42.789507, + "ave_i_frame_msssim": 0.988951, + "ave_i_frame_psnr_y": 41.955093, + "ave_i_frame_psnr_u": 44.380943, + "ave_i_frame_psnr_v": 46.204556, + "ave_i_frame_msssim_y": 0.988223, + "ave_i_frame_msssim_u": 0.990524, + "ave_i_frame_msssim_v": 0.991741, + "test_time": 28475.165564, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007388, + "ave_all_frame_psnr": 42.789507, + "ave_all_frame_msssim": 0.988951, + "ave_all_frame_psnr_y": 41.955093, + "ave_all_frame_psnr_u": 44.380943, + "ave_all_frame_psnr_v": 46.204556, + "ave_all_frame_msssim_y": 0.988223, + "ave_all_frame_msssim_u": 0.990524, + "ave_all_frame_msssim_v": 0.991741, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004720, + "ave_i_frame_psnr": 41.807056, + "ave_i_frame_msssim": 0.985660, + "ave_i_frame_psnr_y": 40.950757, + "ave_i_frame_psnr_u": 43.418659, + "ave_i_frame_psnr_v": 45.333252, + "ave_i_frame_msssim_y": 0.984720, + "ave_i_frame_msssim_u": 0.987573, + "ave_i_frame_msssim_v": 0.989389, + "test_time": 20031.682379, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004720, + "ave_all_frame_psnr": 41.807056, + "ave_all_frame_msssim": 0.985660, + "ave_all_frame_psnr_y": 40.950757, + "ave_all_frame_psnr_u": 43.418659, + "ave_all_frame_psnr_v": 45.333252, + "ave_all_frame_msssim_y": 0.984720, + "ave_all_frame_msssim_u": 0.987573, + "ave_all_frame_msssim_v": 0.989389, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003166, + "ave_i_frame_psnr": 40.746051, + "ave_i_frame_msssim": 0.981174, + "ave_i_frame_psnr_y": 39.901118, + "ave_i_frame_psnr_u": 42.314003, + "ave_i_frame_psnr_v": 44.247699, + "ave_i_frame_msssim_y": 0.980072, + "ave_i_frame_msssim_u": 0.983334, + "ave_i_frame_msssim_v": 0.985630, + "test_time": 14900.821085, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003166, + "ave_all_frame_psnr": 40.746051, + "ave_all_frame_msssim": 0.981174, + "ave_all_frame_psnr_y": 39.901118, + "ave_all_frame_psnr_u": 42.314003, + "ave_all_frame_psnr_v": 44.247699, + "ave_all_frame_msssim_y": 0.980072, + "ave_all_frame_msssim_u": 0.983334, + "ave_all_frame_msssim_v": 0.985630, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002152, + "ave_i_frame_psnr": 39.705885, + "ave_i_frame_msssim": 0.975635, + "ave_i_frame_psnr_y": 38.736028, + "ave_i_frame_psnr_u": 41.415618, + "ave_i_frame_psnr_v": 43.815289, + "ave_i_frame_msssim_y": 0.973573, + "ave_i_frame_msssim_u": 0.979476, + "ave_i_frame_msssim_v": 0.984168, + "test_time": 11337.408271, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002152, + "ave_all_frame_psnr": 39.705885, + "ave_all_frame_msssim": 0.975635, + "ave_all_frame_psnr_y": 38.736028, + "ave_all_frame_psnr_u": 41.415618, + "ave_all_frame_psnr_v": 43.815289, + "ave_all_frame_msssim_y": 0.973573, + "ave_all_frame_msssim_u": 0.979476, + "ave_all_frame_msssim_v": 0.984168, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001433, + "ave_i_frame_psnr": 38.557733, + "ave_i_frame_msssim": 0.967846, + "ave_i_frame_psnr_y": 37.477739, + "ave_i_frame_psnr_u": 40.522094, + "ave_i_frame_psnr_v": 43.073341, + "ave_i_frame_msssim_y": 0.964513, + "ave_i_frame_msssim_u": 0.974672, + "ave_i_frame_msssim_v": 0.981015, + "test_time": 8613.118054, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001433, + "ave_all_frame_psnr": 38.557733, + "ave_all_frame_msssim": 0.967846, + "ave_all_frame_psnr_y": 37.477739, + "ave_all_frame_psnr_u": 40.522094, + "ave_all_frame_psnr_v": 43.073341, + "ave_all_frame_msssim_y": 0.964513, + "ave_all_frame_msssim_u": 0.974672, + "ave_all_frame_msssim_v": 0.981015, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000954, + "ave_i_frame_psnr": 37.332201, + "ave_i_frame_msssim": 0.957146, + "ave_i_frame_psnr_y": 36.108382, + "ave_i_frame_psnr_u": 39.659021, + "ave_i_frame_psnr_v": 42.348294, + "ave_i_frame_msssim_y": 0.951813, + "ave_i_frame_msssim_u": 0.968765, + "ave_i_frame_msssim_v": 0.977527, + "test_time": 6494.451940, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000954, + "ave_all_frame_psnr": 37.332201, + "ave_all_frame_msssim": 0.957146, + "ave_all_frame_psnr_y": 36.108382, + "ave_all_frame_psnr_u": 39.659021, + "ave_all_frame_psnr_v": 42.348294, + "ave_all_frame_msssim_y": 0.951813, + "ave_all_frame_msssim_u": 0.968765, + "ave_all_frame_msssim_v": 0.977527, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000631, + "ave_i_frame_psnr": 36.010078, + "ave_i_frame_msssim": 0.943446, + "ave_i_frame_psnr_y": 34.756126, + "ave_i_frame_psnr_u": 38.307400, + "ave_i_frame_psnr_v": 41.236465, + "ave_i_frame_msssim_y": 0.936439, + "ave_i_frame_msssim_u": 0.957703, + "ave_i_frame_msssim_v": 0.971237, + "test_time": 5026.613278, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000631, + "ave_all_frame_psnr": 36.010078, + "ave_all_frame_msssim": 0.943446, + "ave_all_frame_psnr_y": 34.756126, + "ave_all_frame_psnr_u": 38.307400, + "ave_all_frame_psnr_v": 41.236465, + "ave_all_frame_msssim_y": 0.936439, + "ave_all_frame_msssim_u": 0.957703, + "ave_all_frame_msssim_v": 0.971237, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000421, + "ave_i_frame_psnr": 34.615790, + "ave_i_frame_msssim": 0.925035, + "ave_i_frame_psnr_y": 33.336531, + "ave_i_frame_psnr_u": 36.952863, + "ave_i_frame_psnr_v": 39.954273, + "ave_i_frame_msssim_y": 0.915453, + "ave_i_frame_msssim_u": 0.943070, + "ave_i_frame_msssim_v": 0.964493, + "test_time": 4150.208981, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000421, + "ave_all_frame_psnr": 34.615790, + "ave_all_frame_msssim": 0.925035, + "ave_all_frame_psnr_y": 33.336531, + "ave_all_frame_psnr_u": 36.952863, + "ave_all_frame_psnr_v": 39.954273, + "ave_all_frame_msssim_y": 0.915453, + "ave_all_frame_msssim_u": 0.943070, + "ave_all_frame_msssim_v": 0.964493, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC16_1920x1080_30.yuv" + } + }, + "videoSRC17_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.098032, + "ave_i_frame_psnr": 42.671912, + "ave_i_frame_msssim": 0.991975, + "ave_i_frame_psnr_y": 42.182084, + "ave_i_frame_psnr_u": 43.213747, + "ave_i_frame_psnr_v": 45.069043, + "ave_i_frame_msssim_y": 0.993049, + "ave_i_frame_msssim_u": 0.987279, + "ave_i_frame_msssim_v": 0.990227, + "test_time": 115926.861543, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.098032, + "ave_all_frame_psnr": 42.671912, + "ave_all_frame_msssim": 0.991975, + "ave_all_frame_psnr_y": 42.182084, + "ave_all_frame_psnr_u": 43.213747, + "ave_all_frame_psnr_v": 45.069043, + "ave_all_frame_msssim_y": 0.993049, + "ave_all_frame_msssim_u": 0.987279, + "ave_all_frame_msssim_v": 0.990227, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.062093, + "ave_i_frame_psnr": 41.558054, + "ave_i_frame_msssim": 0.988561, + "ave_i_frame_psnr_y": 41.064808, + "ave_i_frame_psnr_u": 42.148745, + "ave_i_frame_psnr_v": 43.926842, + "ave_i_frame_msssim_y": 0.990064, + "ave_i_frame_msssim_u": 0.981883, + "ave_i_frame_msssim_v": 0.986223, + "test_time": 83760.323265, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.062093, + "ave_all_frame_psnr": 41.558054, + "ave_all_frame_msssim": 0.988561, + "ave_all_frame_psnr_y": 41.064808, + "ave_all_frame_psnr_u": 42.148745, + "ave_all_frame_psnr_v": 43.926842, + "ave_all_frame_msssim_y": 0.990064, + "ave_all_frame_msssim_u": 0.981883, + "ave_all_frame_msssim_v": 0.986223, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.039599, + "ave_i_frame_psnr": 40.212965, + "ave_i_frame_msssim": 0.983142, + "ave_i_frame_psnr_y": 39.600080, + "ave_i_frame_psnr_u": 41.171497, + "ave_i_frame_psnr_v": 42.931745, + "ave_i_frame_msssim_y": 0.984632, + "ave_i_frame_msssim_u": 0.975463, + "ave_i_frame_msssim_v": 0.981885, + "test_time": 61458.129827, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.039599, + "ave_all_frame_psnr": 40.212965, + "ave_all_frame_msssim": 0.983142, + "ave_all_frame_psnr_y": 39.600080, + "ave_all_frame_psnr_u": 41.171497, + "ave_all_frame_psnr_v": 42.931745, + "ave_all_frame_msssim_y": 0.984632, + "ave_all_frame_msssim_u": 0.975463, + "ave_all_frame_msssim_v": 0.981885, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.025091, + "ave_i_frame_psnr": 38.698639, + "ave_i_frame_msssim": 0.974715, + "ave_i_frame_psnr_y": 37.832501, + "ave_i_frame_psnr_u": 40.438820, + "ave_i_frame_psnr_v": 42.155290, + "ave_i_frame_msssim_y": 0.975073, + "ave_i_frame_msssim_u": 0.969597, + "ave_i_frame_msssim_v": 0.977680, + "test_time": 48286.173547, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.025091, + "ave_all_frame_psnr": 38.698639, + "ave_all_frame_msssim": 0.974715, + "ave_all_frame_psnr_y": 37.832501, + "ave_all_frame_psnr_u": 40.438820, + "ave_all_frame_psnr_v": 42.155290, + "ave_all_frame_msssim_y": 0.975073, + "ave_all_frame_msssim_u": 0.969597, + "ave_all_frame_msssim_v": 0.977680, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016855, + "ave_i_frame_psnr": 37.340058, + "ave_i_frame_msssim": 0.964146, + "ave_i_frame_psnr_y": 36.275894, + "ave_i_frame_psnr_u": 39.621074, + "ave_i_frame_psnr_v": 41.444028, + "ave_i_frame_msssim_y": 0.962999, + "ave_i_frame_msssim_u": 0.961803, + "ave_i_frame_msssim_v": 0.973365, + "test_time": 36170.547789, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016855, + "ave_all_frame_psnr": 37.340058, + "ave_all_frame_msssim": 0.964146, + "ave_all_frame_psnr_y": 36.275894, + "ave_all_frame_psnr_u": 39.621074, + "ave_all_frame_psnr_v": 41.444028, + "ave_all_frame_msssim_y": 0.962999, + "ave_all_frame_msssim_u": 0.961803, + "ave_all_frame_msssim_v": 0.973365, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011115, + "ave_i_frame_psnr": 35.930771, + "ave_i_frame_msssim": 0.949350, + "ave_i_frame_psnr_y": 34.651298, + "ave_i_frame_psnr_u": 39.020176, + "ave_i_frame_psnr_v": 40.518207, + "ave_i_frame_msssim_y": 0.945509, + "ave_i_frame_msssim_u": 0.955236, + "ave_i_frame_msssim_v": 0.966514, + "test_time": 26547.775422, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011115, + "ave_all_frame_psnr": 35.930771, + "ave_all_frame_msssim": 0.949350, + "ave_all_frame_psnr_y": 34.651298, + "ave_all_frame_psnr_u": 39.020176, + "ave_all_frame_psnr_v": 40.518207, + "ave_all_frame_msssim_y": 0.945509, + "ave_all_frame_msssim_u": 0.955236, + "ave_all_frame_msssim_v": 0.966514, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007169, + "ave_i_frame_psnr": 34.572404, + "ave_i_frame_msssim": 0.929723, + "ave_i_frame_psnr_y": 33.022178, + "ave_i_frame_psnr_u": 38.361836, + "ave_i_frame_psnr_v": 40.084326, + "ave_i_frame_msssim_y": 0.921324, + "ave_i_frame_msssim_u": 0.946842, + "ave_i_frame_msssim_v": 0.962999, + "test_time": 19217.981613, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007169, + "ave_all_frame_psnr": 34.572404, + "ave_all_frame_msssim": 0.929723, + "ave_all_frame_psnr_y": 33.022178, + "ave_all_frame_psnr_u": 38.361836, + "ave_all_frame_psnr_v": 40.084326, + "ave_all_frame_msssim_y": 0.921324, + "ave_all_frame_msssim_u": 0.946842, + "ave_all_frame_msssim_v": 0.962999, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004535, + "ave_i_frame_psnr": 33.294528, + "ave_i_frame_msssim": 0.905502, + "ave_i_frame_psnr_y": 31.467042, + "ave_i_frame_psnr_u": 37.852624, + "ave_i_frame_psnr_v": 39.701352, + "ave_i_frame_msssim_y": 0.890601, + "ave_i_frame_msssim_u": 0.940450, + "ave_i_frame_msssim_v": 0.959959, + "test_time": 14026.277945, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004535, + "ave_all_frame_psnr": 33.294528, + "ave_all_frame_msssim": 0.905502, + "ave_all_frame_psnr_y": 31.467042, + "ave_all_frame_psnr_u": 37.852624, + "ave_all_frame_psnr_v": 39.701352, + "ave_all_frame_msssim_y": 0.890601, + "ave_all_frame_msssim_u": 0.940450, + "ave_all_frame_msssim_v": 0.959959, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002796, + "ave_i_frame_psnr": 32.009838, + "ave_i_frame_msssim": 0.875391, + "ave_i_frame_psnr_y": 29.981233, + "ave_i_frame_psnr_u": 37.071584, + "ave_i_frame_psnr_v": 39.119722, + "ave_i_frame_msssim_y": 0.853079, + "ave_i_frame_msssim_u": 0.929508, + "ave_i_frame_msssim_v": 0.955143, + "test_time": 10142.476662, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002796, + "ave_all_frame_psnr": 32.009838, + "ave_all_frame_msssim": 0.875391, + "ave_all_frame_psnr_y": 29.981233, + "ave_all_frame_psnr_u": 37.071584, + "ave_all_frame_psnr_v": 39.119722, + "ave_all_frame_msssim_y": 0.853079, + "ave_all_frame_msssim_u": 0.929508, + "ave_all_frame_msssim_v": 0.955143, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001688, + "ave_i_frame_psnr": 30.767851, + "ave_i_frame_msssim": 0.840091, + "ave_i_frame_psnr_y": 28.567746, + "ave_i_frame_psnr_u": 36.245244, + "ave_i_frame_psnr_v": 38.491086, + "ave_i_frame_msssim_y": 0.808864, + "ave_i_frame_msssim_u": 0.917206, + "ave_i_frame_msssim_v": 0.950341, + "test_time": 6886.999459, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001688, + "ave_all_frame_psnr": 30.767851, + "ave_all_frame_msssim": 0.840091, + "ave_all_frame_psnr_y": 28.567746, + "ave_all_frame_psnr_u": 36.245244, + "ave_all_frame_psnr_v": 38.491086, + "ave_all_frame_msssim_y": 0.808864, + "ave_all_frame_msssim_u": 0.917206, + "ave_all_frame_msssim_v": 0.950341, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC17_1920x1080_24.yuv" + } + }, + "videoSRC18_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.057527, + "ave_i_frame_psnr": 42.859882, + "ave_i_frame_msssim": 0.995367, + "ave_i_frame_psnr_y": 42.367457, + "ave_i_frame_psnr_u": 44.213205, + "ave_i_frame_psnr_v": 44.461105, + "ave_i_frame_msssim_y": 0.995805, + "ave_i_frame_msssim_u": 0.994379, + "ave_i_frame_msssim_v": 0.993724, + "test_time": 55112.449296, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.057527, + "ave_all_frame_psnr": 42.859882, + "ave_all_frame_msssim": 0.995367, + "ave_all_frame_psnr_y": 42.367457, + "ave_all_frame_psnr_u": 44.213205, + "ave_all_frame_psnr_v": 44.461105, + "ave_all_frame_msssim_y": 0.995805, + "ave_all_frame_msssim_u": 0.994379, + "ave_all_frame_msssim_v": 0.993724, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.036264, + "ave_i_frame_psnr": 40.826763, + "ave_i_frame_msssim": 0.992378, + "ave_i_frame_psnr_y": 40.218527, + "ave_i_frame_psnr_u": 42.533047, + "ave_i_frame_psnr_v": 42.769896, + "ave_i_frame_msssim_y": 0.992894, + "ave_i_frame_msssim_u": 0.991322, + "ave_i_frame_msssim_v": 0.990336, + "test_time": 41929.396469, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.036264, + "ave_all_frame_psnr": 40.826763, + "ave_all_frame_msssim": 0.992378, + "ave_all_frame_psnr_y": 40.218527, + "ave_all_frame_psnr_u": 42.533047, + "ave_all_frame_psnr_v": 42.769896, + "ave_all_frame_msssim_y": 0.992894, + "ave_all_frame_msssim_u": 0.991322, + "ave_all_frame_msssim_v": 0.990336, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.023053, + "ave_i_frame_psnr": 38.863907, + "ave_i_frame_msssim": 0.987681, + "ave_i_frame_psnr_y": 38.111771, + "ave_i_frame_psnr_u": 40.988590, + "ave_i_frame_psnr_v": 41.252046, + "ave_i_frame_msssim_y": 0.988095, + "ave_i_frame_msssim_u": 0.987038, + "ave_i_frame_msssim_v": 0.985841, + "test_time": 32071.017099, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.023053, + "ave_all_frame_psnr": 38.863907, + "ave_all_frame_msssim": 0.987681, + "ave_all_frame_psnr_y": 38.111771, + "ave_all_frame_psnr_u": 40.988590, + "ave_all_frame_psnr_v": 41.252046, + "ave_all_frame_msssim_y": 0.988095, + "ave_all_frame_msssim_u": 0.987038, + "ave_all_frame_msssim_v": 0.985841, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014761, + "ave_i_frame_psnr": 36.980901, + "ave_i_frame_msssim": 0.980403, + "ave_i_frame_psnr_y": 36.049874, + "ave_i_frame_psnr_u": 39.685185, + "ave_i_frame_psnr_v": 39.862776, + "ave_i_frame_msssim_y": 0.980261, + "ave_i_frame_msssim_u": 0.981793, + "ave_i_frame_msssim_v": 0.979860, + "test_time": 26064.760883, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014761, + "ave_all_frame_psnr": 36.980901, + "ave_all_frame_msssim": 0.980403, + "ave_all_frame_psnr_y": 36.049874, + "ave_all_frame_psnr_u": 39.685185, + "ave_all_frame_psnr_v": 39.862776, + "ave_all_frame_msssim_y": 0.980261, + "ave_all_frame_msssim_u": 0.981793, + "ave_all_frame_msssim_v": 0.979860, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009714, + "ave_i_frame_psnr": 35.275236, + "ave_i_frame_msssim": 0.970226, + "ave_i_frame_psnr_y": 34.195475, + "ave_i_frame_psnr_u": 38.390241, + "ave_i_frame_psnr_v": 38.638796, + "ave_i_frame_msssim_y": 0.969124, + "ave_i_frame_msssim_u": 0.974559, + "ave_i_frame_msssim_v": 0.972503, + "test_time": 20525.900164, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009714, + "ave_all_frame_psnr": 35.275236, + "ave_all_frame_msssim": 0.970226, + "ave_all_frame_psnr_y": 34.195475, + "ave_all_frame_psnr_u": 38.390241, + "ave_all_frame_psnr_v": 38.638796, + "ave_all_frame_msssim_y": 0.969124, + "ave_all_frame_msssim_u": 0.974559, + "ave_all_frame_msssim_v": 0.972503, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006386, + "ave_i_frame_psnr": 33.707331, + "ave_i_frame_msssim": 0.956680, + "ave_i_frame_psnr_y": 32.405786, + "ave_i_frame_psnr_u": 37.236686, + "ave_i_frame_psnr_v": 37.987249, + "ave_i_frame_msssim_y": 0.952923, + "ave_i_frame_msssim_u": 0.968200, + "ave_i_frame_msssim_v": 0.967697, + "test_time": 16279.973842, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006386, + "ave_all_frame_psnr": 33.707331, + "ave_all_frame_msssim": 0.956680, + "ave_all_frame_psnr_y": 32.405786, + "ave_all_frame_psnr_u": 37.236686, + "ave_all_frame_psnr_v": 37.987249, + "ave_all_frame_msssim_y": 0.952923, + "ave_all_frame_msssim_u": 0.968200, + "ave_all_frame_msssim_v": 0.967697, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004099, + "ave_i_frame_psnr": 32.216232, + "ave_i_frame_msssim": 0.937775, + "ave_i_frame_psnr_y": 30.710259, + "ave_i_frame_psnr_u": 36.324310, + "ave_i_frame_psnr_v": 37.143989, + "ave_i_frame_msssim_y": 0.930398, + "ave_i_frame_msssim_u": 0.959616, + "ave_i_frame_msssim_v": 0.960200, + "test_time": 12817.076375, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004099, + "ave_all_frame_psnr": 32.216232, + "ave_all_frame_msssim": 0.937775, + "ave_all_frame_psnr_y": 30.710259, + "ave_all_frame_psnr_u": 36.324310, + "ave_all_frame_psnr_v": 37.143989, + "ave_all_frame_msssim_y": 0.930398, + "ave_all_frame_msssim_u": 0.959616, + "ave_all_frame_msssim_v": 0.960200, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002600, + "ave_i_frame_psnr": 30.826063, + "ave_i_frame_msssim": 0.914366, + "ave_i_frame_psnr_y": 29.134047, + "ave_i_frame_psnr_u": 35.445072, + "ave_i_frame_psnr_v": 36.359150, + "ave_i_frame_msssim_y": 0.902165, + "ave_i_frame_msssim_u": 0.949795, + "ave_i_frame_msssim_v": 0.952141, + "test_time": 9964.271855, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002600, + "ave_all_frame_psnr": 30.826063, + "ave_all_frame_msssim": 0.914366, + "ave_all_frame_psnr_y": 29.134047, + "ave_all_frame_psnr_u": 35.445072, + "ave_all_frame_psnr_v": 36.359150, + "ave_all_frame_msssim_y": 0.902165, + "ave_all_frame_msssim_u": 0.949795, + "ave_all_frame_msssim_v": 0.952141, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001613, + "ave_i_frame_psnr": 29.461393, + "ave_i_frame_msssim": 0.884175, + "ave_i_frame_psnr_y": 27.701136, + "ave_i_frame_psnr_u": 34.273084, + "ave_i_frame_psnr_v": 35.211247, + "ave_i_frame_msssim_y": 0.867541, + "ave_i_frame_msssim_u": 0.931549, + "ave_i_frame_msssim_v": 0.936608, + "test_time": 7583.794887, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001613, + "ave_all_frame_psnr": 29.461393, + "ave_all_frame_msssim": 0.884175, + "ave_all_frame_psnr_y": 27.701136, + "ave_all_frame_psnr_u": 34.273084, + "ave_all_frame_psnr_v": 35.211247, + "ave_all_frame_msssim_y": 0.867541, + "ave_all_frame_msssim_u": 0.931549, + "ave_all_frame_msssim_v": 0.936608, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000998, + "ave_i_frame_psnr": 28.235498, + "ave_i_frame_msssim": 0.848853, + "ave_i_frame_psnr_y": 26.443143, + "ave_i_frame_psnr_u": 33.127648, + "ave_i_frame_psnr_v": 34.097481, + "ave_i_frame_msssim_y": 0.827062, + "ave_i_frame_msssim_u": 0.910880, + "ave_i_frame_msssim_v": 0.917572, + "test_time": 5686.564836, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000998, + "ave_all_frame_psnr": 28.235498, + "ave_all_frame_msssim": 0.848853, + "ave_all_frame_psnr_y": 26.443143, + "ave_all_frame_psnr_u": 33.127648, + "ave_all_frame_psnr_v": 34.097481, + "ave_all_frame_msssim_y": 0.827062, + "ave_all_frame_msssim_u": 0.910880, + "ave_all_frame_msssim_v": 0.917572, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC18_1920x1080_25.yuv" + } + }, + "videoSRC19_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.099998, + "ave_i_frame_psnr": 43.749820, + "ave_i_frame_msssim": 0.994230, + "ave_i_frame_psnr_y": 42.818337, + "ave_i_frame_psnr_u": 46.358205, + "ave_i_frame_psnr_v": 46.730338, + "ave_i_frame_msssim_y": 0.994296, + "ave_i_frame_msssim_u": 0.993690, + "ave_i_frame_msssim_v": 0.994377, + "test_time": 115748.799413, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.099998, + "ave_all_frame_psnr": 43.749820, + "ave_all_frame_msssim": 0.994230, + "ave_all_frame_psnr_y": 42.818337, + "ave_all_frame_psnr_u": 46.358205, + "ave_all_frame_psnr_v": 46.730338, + "ave_all_frame_msssim_y": 0.994296, + "ave_all_frame_msssim_u": 0.993690, + "ave_all_frame_msssim_v": 0.994377, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.065110, + "ave_i_frame_psnr": 41.990615, + "ave_i_frame_msssim": 0.990904, + "ave_i_frame_psnr_y": 40.928287, + "ave_i_frame_psnr_u": 45.101587, + "ave_i_frame_psnr_v": 45.253618, + "ave_i_frame_msssim_y": 0.990775, + "ave_i_frame_msssim_u": 0.990983, + "ave_i_frame_msssim_v": 0.991600, + "test_time": 91556.397878, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.065110, + "ave_all_frame_psnr": 41.990615, + "ave_all_frame_msssim": 0.990904, + "ave_all_frame_psnr_y": 40.928287, + "ave_all_frame_psnr_u": 45.101587, + "ave_all_frame_psnr_v": 45.253618, + "ave_all_frame_msssim_y": 0.990775, + "ave_all_frame_msssim_u": 0.990983, + "ave_all_frame_msssim_v": 0.991600, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.042197, + "ave_i_frame_psnr": 40.206427, + "ave_i_frame_msssim": 0.985542, + "ave_i_frame_psnr_y": 38.979269, + "ave_i_frame_psnr_u": 43.928063, + "ave_i_frame_psnr_v": 43.847735, + "ave_i_frame_msssim_y": 0.984852, + "ave_i_frame_msssim_u": 0.987470, + "ave_i_frame_msssim_v": 0.987752, + "test_time": 71393.994396, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.042197, + "ave_all_frame_psnr": 40.206427, + "ave_all_frame_msssim": 0.985542, + "ave_all_frame_psnr_y": 38.979269, + "ave_all_frame_psnr_u": 43.928063, + "ave_all_frame_psnr_v": 43.847735, + "ave_all_frame_msssim_y": 0.984852, + "ave_all_frame_msssim_u": 0.987470, + "ave_all_frame_msssim_v": 0.987752, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.027312, + "ave_i_frame_psnr": 38.509062, + "ave_i_frame_msssim": 0.977546, + "ave_i_frame_psnr_y": 37.039713, + "ave_i_frame_psnr_u": 43.023460, + "ave_i_frame_psnr_v": 42.810760, + "ave_i_frame_msssim_y": 0.975361, + "ave_i_frame_msssim_u": 0.984080, + "ave_i_frame_msssim_v": 0.984122, + "test_time": 57123.978937, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.027312, + "ave_all_frame_psnr": 38.509062, + "ave_all_frame_msssim": 0.977546, + "ave_all_frame_psnr_y": 37.039713, + "ave_all_frame_psnr_u": 43.023460, + "ave_all_frame_psnr_v": 42.810760, + "ave_all_frame_msssim_y": 0.975361, + "ave_all_frame_msssim_u": 0.984080, + "ave_all_frame_msssim_v": 0.984122, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.018741, + "ave_i_frame_psnr": 37.026564, + "ave_i_frame_msssim": 0.967220, + "ave_i_frame_psnr_y": 35.413894, + "ave_i_frame_psnr_u": 42.079247, + "ave_i_frame_psnr_v": 41.649903, + "ave_i_frame_msssim_y": 0.963231, + "ave_i_frame_msssim_u": 0.979645, + "ave_i_frame_msssim_v": 0.978734, + "test_time": 44765.510062, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.018741, + "ave_all_frame_psnr": 37.026564, + "ave_all_frame_msssim": 0.967220, + "ave_all_frame_psnr_y": 35.413894, + "ave_all_frame_psnr_u": 42.079247, + "ave_all_frame_psnr_v": 41.649903, + "ave_all_frame_msssim_y": 0.963231, + "ave_all_frame_msssim_u": 0.979645, + "ave_all_frame_msssim_v": 0.978734, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012727, + "ave_i_frame_psnr": 35.598653, + "ave_i_frame_msssim": 0.953199, + "ave_i_frame_psnr_y": 33.811966, + "ave_i_frame_psnr_u": 41.083443, + "ave_i_frame_psnr_v": 40.833989, + "ave_i_frame_msssim_y": 0.946254, + "ave_i_frame_msssim_u": 0.974023, + "ave_i_frame_msssim_v": 0.974044, + "test_time": 34651.957324, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012727, + "ave_all_frame_psnr": 35.598653, + "ave_all_frame_msssim": 0.953199, + "ave_all_frame_psnr_y": 33.811966, + "ave_all_frame_psnr_u": 41.083443, + "ave_all_frame_psnr_v": 40.833989, + "ave_all_frame_msssim_y": 0.946254, + "ave_all_frame_msssim_u": 0.974023, + "ave_all_frame_msssim_v": 0.974044, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008527, + "ave_i_frame_psnr": 34.246894, + "ave_i_frame_msssim": 0.935358, + "ave_i_frame_psnr_y": 32.280195, + "ave_i_frame_psnr_u": 40.373974, + "ave_i_frame_psnr_v": 39.920007, + "ave_i_frame_msssim_y": 0.924398, + "ave_i_frame_msssim_u": 0.968873, + "ave_i_frame_msssim_v": 0.967605, + "test_time": 26674.103305, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008527, + "ave_all_frame_psnr": 34.246894, + "ave_all_frame_msssim": 0.935358, + "ave_all_frame_psnr_y": 32.280195, + "ave_all_frame_psnr_u": 40.373974, + "ave_all_frame_psnr_v": 39.920007, + "ave_all_frame_msssim_y": 0.924398, + "ave_all_frame_msssim_u": 0.968873, + "ave_all_frame_msssim_v": 0.967605, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005658, + "ave_i_frame_psnr": 32.956937, + "ave_i_frame_msssim": 0.913521, + "ave_i_frame_psnr_y": 30.809006, + "ave_i_frame_psnr_u": 39.653133, + "ave_i_frame_psnr_v": 39.148333, + "ave_i_frame_msssim_y": 0.897284, + "ave_i_frame_msssim_u": 0.963410, + "ave_i_frame_msssim_v": 0.961052, + "test_time": 19775.686455, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005658, + "ave_all_frame_psnr": 32.956937, + "ave_all_frame_msssim": 0.913521, + "ave_all_frame_psnr_y": 30.809006, + "ave_all_frame_psnr_u": 39.653133, + "ave_all_frame_psnr_v": 39.148333, + "ave_all_frame_msssim_y": 0.897284, + "ave_all_frame_msssim_u": 0.963410, + "ave_all_frame_msssim_v": 0.961052, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003674, + "ave_i_frame_psnr": 31.625546, + "ave_i_frame_msssim": 0.886877, + "ave_i_frame_psnr_y": 29.369083, + "ave_i_frame_psnr_u": 38.755818, + "ave_i_frame_psnr_v": 38.034051, + "ave_i_frame_msssim_y": 0.864829, + "ave_i_frame_msssim_u": 0.955193, + "ave_i_frame_msssim_v": 0.950848, + "test_time": 14311.310655, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003674, + "ave_all_frame_psnr": 31.625546, + "ave_all_frame_msssim": 0.886877, + "ave_all_frame_psnr_y": 29.369083, + "ave_all_frame_psnr_u": 38.755818, + "ave_all_frame_psnr_v": 38.034051, + "ave_all_frame_msssim_y": 0.864829, + "ave_all_frame_msssim_u": 0.955193, + "ave_all_frame_msssim_v": 0.950848, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002380, + "ave_i_frame_psnr": 30.359576, + "ave_i_frame_msssim": 0.857587, + "ave_i_frame_psnr_y": 28.012267, + "ave_i_frame_psnr_u": 37.826991, + "ave_i_frame_psnr_v": 36.976009, + "ave_i_frame_msssim_y": 0.829417, + "ave_i_frame_msssim_u": 0.945771, + "ave_i_frame_msssim_v": 0.938418, + "test_time": 8862.853216, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002380, + "ave_all_frame_psnr": 30.359576, + "ave_all_frame_msssim": 0.857587, + "ave_all_frame_psnr_y": 28.012267, + "ave_all_frame_psnr_u": 37.826991, + "ave_all_frame_psnr_v": 36.976009, + "ave_all_frame_msssim_y": 0.829417, + "ave_all_frame_msssim_u": 0.945771, + "ave_all_frame_msssim_v": 0.938418, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC19_1920x1080_30.yuv" + } + }, + "videoSRC20_1920x1080_25.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.039596, + "ave_i_frame_psnr": 46.499189, + "ave_i_frame_msssim": 0.997033, + "ave_i_frame_psnr_y": 45.961044, + "ave_i_frame_psnr_u": 47.623890, + "ave_i_frame_psnr_v": 48.603353, + "ave_i_frame_msssim_y": 0.996909, + "ave_i_frame_msssim_u": 0.997183, + "ave_i_frame_msssim_v": 0.997623, + "test_time": 34618.064792, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.039596, + "ave_all_frame_psnr": 46.499189, + "ave_all_frame_msssim": 0.997033, + "ave_all_frame_psnr_y": 45.961044, + "ave_all_frame_psnr_u": 47.623890, + "ave_all_frame_psnr_v": 48.603353, + "ave_all_frame_msssim_y": 0.996909, + "ave_all_frame_msssim_u": 0.997183, + "ave_all_frame_msssim_v": 0.997623, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.026926, + "ave_i_frame_psnr": 44.525572, + "ave_i_frame_msssim": 0.995137, + "ave_i_frame_psnr_y": 43.932700, + "ave_i_frame_psnr_u": 45.782135, + "ave_i_frame_psnr_v": 46.826238, + "ave_i_frame_msssim_y": 0.994856, + "ave_i_frame_msssim_u": 0.995601, + "ave_i_frame_msssim_v": 0.996360, + "test_time": 29478.314483, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.026926, + "ave_all_frame_psnr": 44.525572, + "ave_all_frame_msssim": 0.995137, + "ave_all_frame_psnr_y": 43.932700, + "ave_all_frame_psnr_u": 45.782135, + "ave_all_frame_psnr_v": 46.826238, + "ave_all_frame_msssim_y": 0.994856, + "ave_all_frame_msssim_u": 0.995601, + "ave_all_frame_msssim_v": 0.996360, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.018628, + "ave_i_frame_psnr": 42.613367, + "ave_i_frame_msssim": 0.992173, + "ave_i_frame_psnr_y": 41.933349, + "ave_i_frame_psnr_u": 44.179372, + "ave_i_frame_psnr_v": 45.127475, + "ave_i_frame_msssim_y": 0.991589, + "ave_i_frame_msssim_u": 0.993414, + "ave_i_frame_msssim_v": 0.994435, + "test_time": 25218.127123, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.018628, + "ave_all_frame_psnr": 42.613367, + "ave_all_frame_msssim": 0.992173, + "ave_all_frame_psnr_y": 41.933349, + "ave_all_frame_psnr_u": 44.179372, + "ave_all_frame_psnr_v": 45.127475, + "ave_all_frame_msssim_y": 0.991589, + "ave_all_frame_msssim_u": 0.993414, + "ave_all_frame_msssim_v": 0.994435, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013246, + "ave_i_frame_psnr": 40.773526, + "ave_i_frame_msssim": 0.987750, + "ave_i_frame_psnr_y": 39.953009, + "ave_i_frame_psnr_u": 42.799372, + "ave_i_frame_psnr_v": 43.670777, + "ave_i_frame_msssim_y": 0.986568, + "ave_i_frame_msssim_u": 0.990603, + "ave_i_frame_msssim_v": 0.991990, + "test_time": 21860.240581, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013246, + "ave_all_frame_psnr": 40.773526, + "ave_all_frame_msssim": 0.987750, + "ave_all_frame_psnr_y": 39.953009, + "ave_all_frame_psnr_u": 42.799372, + "ave_all_frame_psnr_v": 43.670777, + "ave_all_frame_msssim_y": 0.986568, + "ave_all_frame_msssim_u": 0.990603, + "ave_all_frame_msssim_v": 0.991990, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009746, + "ave_i_frame_psnr": 39.160773, + "ave_i_frame_msssim": 0.981920, + "ave_i_frame_psnr_y": 38.232043, + "ave_i_frame_psnr_u": 41.452901, + "ave_i_frame_psnr_v": 42.441025, + "ave_i_frame_msssim_y": 0.979939, + "ave_i_frame_msssim_u": 0.986858, + "ave_i_frame_msssim_v": 0.988868, + "test_time": 18655.092587, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009746, + "ave_all_frame_psnr": 39.160773, + "ave_all_frame_msssim": 0.981920, + "ave_all_frame_psnr_y": 38.232043, + "ave_all_frame_psnr_u": 41.452901, + "ave_all_frame_psnr_v": 42.441025, + "ave_all_frame_msssim_y": 0.979939, + "ave_all_frame_msssim_u": 0.986858, + "ave_all_frame_msssim_v": 0.988868, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007298, + "ave_i_frame_psnr": 37.631435, + "ave_i_frame_msssim": 0.974292, + "ave_i_frame_psnr_y": 36.568530, + "ave_i_frame_psnr_u": 40.348333, + "ave_i_frame_psnr_v": 41.291970, + "ave_i_frame_msssim_y": 0.970935, + "ave_i_frame_msssim_u": 0.983406, + "ave_i_frame_msssim_v": 0.985321, + "test_time": 16015.724488, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007298, + "ave_all_frame_psnr": 37.631435, + "ave_all_frame_msssim": 0.974292, + "ave_all_frame_psnr_y": 36.568530, + "ave_all_frame_psnr_u": 40.348333, + "ave_all_frame_psnr_v": 41.291970, + "ave_all_frame_msssim_y": 0.970935, + "ave_all_frame_msssim_u": 0.983406, + "ave_all_frame_msssim_v": 0.985321, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005432, + "ave_i_frame_psnr": 36.057010, + "ave_i_frame_msssim": 0.963627, + "ave_i_frame_psnr_y": 34.887707, + "ave_i_frame_psnr_u": 39.149181, + "ave_i_frame_psnr_v": 39.980655, + "ave_i_frame_msssim_y": 0.958480, + "ave_i_frame_msssim_u": 0.977948, + "ave_i_frame_msssim_v": 0.980187, + "test_time": 13485.105743, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005432, + "ave_all_frame_psnr": 36.057010, + "ave_all_frame_msssim": 0.963627, + "ave_all_frame_psnr_y": 34.887707, + "ave_all_frame_psnr_u": 39.149181, + "ave_all_frame_psnr_v": 39.980655, + "ave_all_frame_msssim_y": 0.958480, + "ave_all_frame_msssim_u": 0.977948, + "ave_all_frame_msssim_v": 0.980187, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004057, + "ave_i_frame_psnr": 34.487590, + "ave_i_frame_msssim": 0.949820, + "ave_i_frame_psnr_y": 33.188742, + "ave_i_frame_psnr_u": 37.903264, + "ave_i_frame_psnr_v": 38.865005, + "ave_i_frame_msssim_y": 0.941898, + "ave_i_frame_msssim_u": 0.972019, + "ave_i_frame_msssim_v": 0.975148, + "test_time": 11205.581405, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004057, + "ave_all_frame_psnr": 34.487590, + "ave_all_frame_msssim": 0.949820, + "ave_all_frame_psnr_y": 33.188742, + "ave_all_frame_psnr_u": 37.903264, + "ave_all_frame_psnr_v": 38.865005, + "ave_all_frame_msssim_y": 0.941898, + "ave_all_frame_msssim_u": 0.972019, + "ave_all_frame_msssim_v": 0.975148, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002936, + "ave_i_frame_psnr": 32.761938, + "ave_i_frame_msssim": 0.929914, + "ave_i_frame_psnr_y": 31.431952, + "ave_i_frame_psnr_u": 36.266882, + "ave_i_frame_psnr_v": 37.236910, + "ave_i_frame_msssim_y": 0.918952, + "ave_i_frame_msssim_u": 0.960471, + "ave_i_frame_msssim_v": 0.965129, + "test_time": 9076.932284, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002936, + "ave_all_frame_psnr": 32.761938, + "ave_all_frame_msssim": 0.929914, + "ave_all_frame_psnr_y": 31.431952, + "ave_all_frame_psnr_u": 36.266882, + "ave_all_frame_psnr_v": 37.236910, + "ave_all_frame_msssim_y": 0.918952, + "ave_all_frame_msssim_u": 0.960471, + "ave_all_frame_msssim_v": 0.965129, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 125, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002068, + "ave_i_frame_psnr": 31.057577, + "ave_i_frame_msssim": 0.904095, + "ave_i_frame_psnr_y": 29.727877, + "ave_i_frame_psnr_u": 34.602915, + "ave_i_frame_psnr_v": 35.490443, + "ave_i_frame_msssim_y": 0.889371, + "ave_i_frame_msssim_u": 0.944668, + "ave_i_frame_msssim_v": 0.951860, + "test_time": 6676.046819, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002068, + "ave_all_frame_psnr": 31.057577, + "ave_all_frame_msssim": 0.904095, + "ave_all_frame_psnr_y": 29.727877, + "ave_all_frame_psnr_u": 34.602915, + "ave_all_frame_psnr_v": 35.490443, + "ave_all_frame_msssim_y": 0.889371, + "ave_all_frame_msssim_u": 0.944668, + "ave_all_frame_msssim_v": 0.951860, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC20_1920x1080_25.yuv" + } + }, + "videoSRC21_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.044026, + "ave_i_frame_psnr": 47.690990, + "ave_i_frame_msssim": 0.995417, + "ave_i_frame_psnr_y": 46.956704, + "ave_i_frame_psnr_u": 50.059387, + "ave_i_frame_psnr_v": 49.728306, + "ave_i_frame_msssim_y": 0.994991, + "ave_i_frame_msssim_u": 0.996877, + "ave_i_frame_msssim_v": 0.996516, + "test_time": 55496.714324, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.044026, + "ave_all_frame_psnr": 47.690990, + "ave_all_frame_msssim": 0.995417, + "ave_all_frame_psnr_y": 46.956704, + "ave_all_frame_psnr_u": 50.059387, + "ave_all_frame_psnr_v": 49.728306, + "ave_all_frame_msssim_y": 0.994991, + "ave_all_frame_msssim_u": 0.996877, + "ave_all_frame_msssim_v": 0.996516, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.027833, + "ave_i_frame_psnr": 46.507786, + "ave_i_frame_msssim": 0.993819, + "ave_i_frame_psnr_y": 45.691935, + "ave_i_frame_psnr_u": 49.095287, + "ave_i_frame_psnr_v": 48.815393, + "ave_i_frame_msssim_y": 0.993152, + "ave_i_frame_msssim_u": 0.996028, + "ave_i_frame_msssim_v": 0.995613, + "test_time": 43066.859581, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.027833, + "ave_all_frame_psnr": 46.507786, + "ave_all_frame_msssim": 0.993819, + "ave_all_frame_psnr_y": 45.691935, + "ave_all_frame_psnr_u": 49.095287, + "ave_all_frame_psnr_v": 48.815393, + "ave_all_frame_msssim_y": 0.993152, + "ave_all_frame_msssim_u": 0.996028, + "ave_all_frame_msssim_v": 0.995613, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017572, + "ave_i_frame_psnr": 45.123795, + "ave_i_frame_msssim": 0.991288, + "ave_i_frame_psnr_y": 44.180134, + "ave_i_frame_psnr_u": 48.075036, + "ave_i_frame_psnr_v": 47.834519, + "ave_i_frame_msssim_y": 0.990145, + "ave_i_frame_msssim_u": 0.994976, + "ave_i_frame_msssim_v": 0.994460, + "test_time": 31364.252712, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017572, + "ave_all_frame_psnr": 45.123795, + "ave_all_frame_msssim": 0.991288, + "ave_all_frame_psnr_y": 44.180134, + "ave_all_frame_psnr_u": 48.075036, + "ave_all_frame_psnr_v": 47.834519, + "ave_all_frame_msssim_y": 0.990145, + "ave_all_frame_msssim_u": 0.994976, + "ave_all_frame_msssim_v": 0.994460, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011142, + "ave_i_frame_psnr": 43.665909, + "ave_i_frame_msssim": 0.987652, + "ave_i_frame_psnr_y": 42.507477, + "ave_i_frame_psnr_u": 47.252749, + "ave_i_frame_psnr_v": 47.029663, + "ave_i_frame_msssim_y": 0.985636, + "ave_i_frame_msssim_u": 0.993981, + "ave_i_frame_msssim_v": 0.993418, + "test_time": 22713.847243, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011142, + "ave_all_frame_psnr": 43.665909, + "ave_all_frame_msssim": 0.987652, + "ave_all_frame_psnr_y": 42.507477, + "ave_all_frame_psnr_u": 47.252749, + "ave_all_frame_psnr_v": 47.029663, + "ave_all_frame_msssim_y": 0.985636, + "ave_all_frame_msssim_u": 0.993981, + "ave_all_frame_msssim_v": 0.993418, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007632, + "ave_i_frame_psnr": 42.364587, + "ave_i_frame_msssim": 0.983559, + "ave_i_frame_psnr_y": 41.098138, + "ave_i_frame_psnr_u": 46.279310, + "ave_i_frame_psnr_v": 46.048561, + "ave_i_frame_msssim_y": 0.980663, + "ave_i_frame_msssim_u": 0.992579, + "ave_i_frame_msssim_v": 0.991920, + "test_time": 17007.956131, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007632, + "ave_all_frame_psnr": 42.364587, + "ave_all_frame_msssim": 0.983559, + "ave_all_frame_psnr_y": 41.098138, + "ave_all_frame_psnr_u": 46.279310, + "ave_all_frame_psnr_v": 46.048561, + "ave_all_frame_msssim_y": 0.980663, + "ave_all_frame_msssim_u": 0.992579, + "ave_all_frame_msssim_v": 0.991920, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005222, + "ave_i_frame_psnr": 41.105971, + "ave_i_frame_msssim": 0.978562, + "ave_i_frame_psnr_y": 39.653279, + "ave_i_frame_psnr_u": 45.500111, + "ave_i_frame_psnr_v": 45.427987, + "ave_i_frame_msssim_y": 0.974397, + "ave_i_frame_msssim_u": 0.991393, + "ave_i_frame_msssim_v": 0.990718, + "test_time": 12946.654217, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005222, + "ave_all_frame_psnr": 41.105971, + "ave_all_frame_msssim": 0.978562, + "ave_all_frame_psnr_y": 39.653279, + "ave_all_frame_psnr_u": 45.500111, + "ave_all_frame_psnr_v": 45.427987, + "ave_all_frame_msssim_y": 0.974397, + "ave_all_frame_msssim_u": 0.991393, + "ave_all_frame_msssim_v": 0.990718, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003545, + "ave_i_frame_psnr": 39.767547, + "ave_i_frame_msssim": 0.972347, + "ave_i_frame_psnr_y": 38.206668, + "ave_i_frame_psnr_u": 44.504494, + "ave_i_frame_psnr_v": 44.395875, + "ave_i_frame_msssim_y": 0.966787, + "ave_i_frame_msssim_u": 0.989420, + "ave_i_frame_msssim_v": 0.988634, + "test_time": 9512.615753, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003545, + "ave_all_frame_psnr": 39.767547, + "ave_all_frame_msssim": 0.972347, + "ave_all_frame_psnr_y": 38.206668, + "ave_all_frame_psnr_u": 44.504494, + "ave_all_frame_psnr_v": 44.395875, + "ave_all_frame_msssim_y": 0.966787, + "ave_all_frame_msssim_u": 0.989420, + "ave_all_frame_msssim_v": 0.988634, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002415, + "ave_i_frame_psnr": 38.415927, + "ave_i_frame_msssim": 0.964787, + "ave_i_frame_psnr_y": 36.719467, + "ave_i_frame_psnr_u": 43.520376, + "ave_i_frame_psnr_v": 43.490239, + "ave_i_frame_msssim_y": 0.957469, + "ave_i_frame_msssim_u": 0.987246, + "ave_i_frame_msssim_v": 0.986237, + "test_time": 7242.512917, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002415, + "ave_all_frame_psnr": 38.415927, + "ave_all_frame_msssim": 0.964787, + "ave_all_frame_psnr_y": 36.719467, + "ave_all_frame_psnr_u": 43.520376, + "ave_all_frame_psnr_v": 43.490239, + "ave_all_frame_msssim_y": 0.957469, + "ave_all_frame_msssim_u": 0.987246, + "ave_all_frame_msssim_v": 0.986237, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001643, + "ave_i_frame_psnr": 36.969227, + "ave_i_frame_msssim": 0.955793, + "ave_i_frame_psnr_y": 35.208538, + "ave_i_frame_psnr_u": 42.253171, + "ave_i_frame_psnr_v": 42.249422, + "ave_i_frame_msssim_y": 0.946558, + "ave_i_frame_msssim_u": 0.984110, + "ave_i_frame_msssim_v": 0.982886, + "test_time": 5530.971504, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001643, + "ave_all_frame_psnr": 36.969227, + "ave_all_frame_msssim": 0.955793, + "ave_all_frame_psnr_y": 35.208538, + "ave_all_frame_psnr_u": 42.253171, + "ave_all_frame_psnr_v": 42.249422, + "ave_all_frame_msssim_y": 0.946558, + "ave_all_frame_msssim_u": 0.984110, + "ave_all_frame_msssim_v": 0.982886, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001126, + "ave_i_frame_psnr": 35.429275, + "ave_i_frame_msssim": 0.944332, + "ave_i_frame_psnr_y": 33.638896, + "ave_i_frame_psnr_u": 40.747375, + "ave_i_frame_psnr_v": 40.853446, + "ave_i_frame_msssim_y": 0.932744, + "ave_i_frame_msssim_u": 0.980018, + "ave_i_frame_msssim_v": 0.978173, + "test_time": 4328.036729, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001126, + "ave_all_frame_psnr": 35.429275, + "ave_all_frame_msssim": 0.944332, + "ave_all_frame_psnr_y": 33.638896, + "ave_all_frame_psnr_u": 40.747375, + "ave_all_frame_psnr_v": 40.853446, + "ave_all_frame_msssim_y": 0.932744, + "ave_all_frame_msssim_u": 0.980018, + "ave_all_frame_msssim_v": 0.978173, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC21_1920x1080_24.yuv" + } + }, + "videoSRC22_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.181025, + "ave_i_frame_psnr": 44.409112, + "ave_i_frame_msssim": 0.994090, + "ave_i_frame_psnr_y": 43.203809, + "ave_i_frame_psnr_u": 47.542270, + "ave_i_frame_psnr_v": 48.507766, + "ave_i_frame_msssim_y": 0.994063, + "ave_i_frame_msssim_u": 0.993671, + "ave_i_frame_msssim_v": 0.994672, + "test_time": 126167.977566, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.181025, + "ave_all_frame_psnr": 44.409112, + "ave_all_frame_msssim": 0.994090, + "ave_all_frame_psnr_y": 43.203809, + "ave_all_frame_psnr_u": 47.542270, + "ave_all_frame_psnr_v": 48.507766, + "ave_all_frame_msssim_y": 0.994063, + "ave_all_frame_msssim_u": 0.993671, + "ave_all_frame_msssim_v": 0.994672, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.117144, + "ave_i_frame_psnr": 42.770513, + "ave_i_frame_msssim": 0.991009, + "ave_i_frame_psnr_y": 41.347554, + "ave_i_frame_psnr_u": 46.537829, + "ave_i_frame_psnr_v": 47.540949, + "ave_i_frame_msssim_y": 0.990558, + "ave_i_frame_msssim_u": 0.991552, + "ave_i_frame_msssim_v": 0.993171, + "test_time": 107322.983225, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.117144, + "ave_all_frame_psnr": 42.770513, + "ave_all_frame_msssim": 0.991009, + "ave_all_frame_psnr_y": 41.347554, + "ave_all_frame_psnr_u": 46.537829, + "ave_all_frame_psnr_v": 47.540949, + "ave_all_frame_msssim_y": 0.990558, + "ave_all_frame_msssim_u": 0.991552, + "ave_all_frame_msssim_v": 0.993171, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.076282, + "ave_i_frame_psnr": 41.038562, + "ave_i_frame_msssim": 0.985997, + "ave_i_frame_psnr_y": 39.340916, + "ave_i_frame_psnr_u": 45.602841, + "ave_i_frame_psnr_v": 46.660160, + "ave_i_frame_msssim_y": 0.984529, + "ave_i_frame_msssim_u": 0.989230, + "ave_i_frame_msssim_v": 0.991574, + "test_time": 87413.235557, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.076282, + "ave_all_frame_psnr": 41.038562, + "ave_all_frame_msssim": 0.985997, + "ave_all_frame_psnr_y": 39.340916, + "ave_all_frame_psnr_u": 45.602841, + "ave_all_frame_psnr_v": 46.660160, + "ave_all_frame_msssim_y": 0.984529, + "ave_all_frame_msssim_u": 0.989230, + "ave_all_frame_msssim_v": 0.991574, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.048954, + "ave_i_frame_psnr": 39.278075, + "ave_i_frame_msssim": 0.977875, + "ave_i_frame_psnr_y": 37.191655, + "ave_i_frame_psnr_u": 44.975015, + "ave_i_frame_psnr_v": 46.099659, + "ave_i_frame_msssim_y": 0.974184, + "ave_i_frame_msssim_u": 0.987495, + "ave_i_frame_msssim_v": 0.990399, + "test_time": 67863.388968, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.048954, + "ave_all_frame_psnr": 39.278075, + "ave_all_frame_msssim": 0.977875, + "ave_all_frame_psnr_y": 37.191655, + "ave_all_frame_psnr_u": 44.975015, + "ave_all_frame_psnr_v": 46.099659, + "ave_all_frame_msssim_y": 0.974184, + "ave_all_frame_msssim_u": 0.987495, + "ave_all_frame_msssim_v": 0.990399, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.033630, + "ave_i_frame_psnr": 37.811653, + "ave_i_frame_msssim": 0.968121, + "ave_i_frame_psnr_y": 35.462531, + "ave_i_frame_psnr_u": 44.279989, + "ave_i_frame_psnr_v": 45.438046, + "ave_i_frame_msssim_y": 0.961726, + "ave_i_frame_msssim_u": 0.985532, + "ave_i_frame_msssim_v": 0.989082, + "test_time": 51344.696219, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.033630, + "ave_all_frame_psnr": 37.811653, + "ave_all_frame_msssim": 0.968121, + "ave_all_frame_psnr_y": 35.462531, + "ave_all_frame_psnr_u": 44.279989, + "ave_all_frame_psnr_v": 45.438046, + "ave_all_frame_msssim_y": 0.961726, + "ave_all_frame_msssim_u": 0.985532, + "ave_all_frame_msssim_v": 0.989082, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022490, + "ave_i_frame_psnr": 36.389269, + "ave_i_frame_msssim": 0.954313, + "ave_i_frame_psnr_y": 33.717212, + "ave_i_frame_psnr_u": 43.812595, + "ave_i_frame_psnr_v": 44.998285, + "ave_i_frame_msssim_y": 0.943685, + "ave_i_frame_msssim_u": 0.984167, + "ave_i_frame_msssim_v": 0.988222, + "test_time": 40784.238423, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022490, + "ave_all_frame_psnr": 36.389269, + "ave_all_frame_msssim": 0.954313, + "ave_all_frame_psnr_y": 33.717212, + "ave_all_frame_psnr_u": 43.812595, + "ave_all_frame_psnr_v": 44.998285, + "ave_all_frame_msssim_y": 0.943685, + "ave_all_frame_msssim_u": 0.984167, + "ave_all_frame_msssim_v": 0.988222, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014656, + "ave_i_frame_psnr": 34.921407, + "ave_i_frame_msssim": 0.935257, + "ave_i_frame_psnr_y": 32.014810, + "ave_i_frame_psnr_u": 42.999406, + "ave_i_frame_psnr_v": 44.282988, + "ave_i_frame_msssim_y": 0.918905, + "ave_i_frame_msssim_u": 0.981992, + "ave_i_frame_msssim_v": 0.986640, + "test_time": 30351.907440, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014656, + "ave_all_frame_psnr": 34.921407, + "ave_all_frame_msssim": 0.935257, + "ave_all_frame_psnr_y": 32.014810, + "ave_all_frame_psnr_u": 42.999406, + "ave_all_frame_psnr_v": 44.282988, + "ave_all_frame_msssim_y": 0.918905, + "ave_all_frame_msssim_u": 0.981992, + "ave_all_frame_msssim_v": 0.986640, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009265, + "ave_i_frame_psnr": 33.497726, + "ave_i_frame_msssim": 0.910534, + "ave_i_frame_psnr_y": 30.376291, + "ave_i_frame_psnr_u": 42.272200, + "ave_i_frame_psnr_v": 43.451861, + "ave_i_frame_msssim_y": 0.886501, + "ave_i_frame_msssim_u": 0.979962, + "ave_i_frame_msssim_v": 0.985303, + "test_time": 21330.902320, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009265, + "ave_all_frame_psnr": 33.497726, + "ave_all_frame_msssim": 0.910534, + "ave_all_frame_psnr_y": 30.376291, + "ave_all_frame_psnr_u": 42.272200, + "ave_all_frame_psnr_v": 43.451861, + "ave_all_frame_msssim_y": 0.886501, + "ave_all_frame_msssim_u": 0.979962, + "ave_all_frame_msssim_v": 0.985303, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005738, + "ave_i_frame_psnr": 32.096496, + "ave_i_frame_msssim": 0.880576, + "ave_i_frame_psnr_y": 28.841012, + "ave_i_frame_psnr_u": 41.190727, + "ave_i_frame_psnr_v": 42.535168, + "ave_i_frame_msssim_y": 0.847316, + "ave_i_frame_msssim_u": 0.977346, + "ave_i_frame_msssim_v": 0.983367, + "test_time": 14883.887471, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005738, + "ave_all_frame_psnr": 32.096496, + "ave_all_frame_msssim": 0.880576, + "ave_all_frame_psnr_y": 28.841012, + "ave_all_frame_psnr_u": 41.190727, + "ave_all_frame_psnr_v": 42.535168, + "ave_all_frame_msssim_y": 0.847316, + "ave_all_frame_msssim_u": 0.977346, + "ave_all_frame_msssim_v": 0.983367, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003514, + "ave_i_frame_psnr": 30.912001, + "ave_i_frame_msssim": 0.846836, + "ave_i_frame_psnr_y": 27.425638, + "ave_i_frame_psnr_u": 40.482588, + "ave_i_frame_psnr_v": 42.259596, + "ave_i_frame_msssim_y": 0.802868, + "ave_i_frame_msssim_u": 0.975487, + "ave_i_frame_msssim_v": 0.981991, + "test_time": 8583.650316, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003514, + "ave_all_frame_psnr": 30.912001, + "ave_all_frame_msssim": 0.846836, + "ave_all_frame_psnr_y": 27.425638, + "ave_all_frame_psnr_u": 40.482588, + "ave_all_frame_psnr_v": 42.259596, + "ave_all_frame_msssim_y": 0.802868, + "ave_all_frame_msssim_u": 0.975487, + "ave_all_frame_msssim_v": 0.981991, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC22_1920x1080_24.yuv" + } + }, + "videoSRC23_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.059965, + "ave_i_frame_psnr": 44.961432, + "ave_i_frame_msssim": 0.995644, + "ave_i_frame_psnr_y": 43.987339, + "ave_i_frame_psnr_u": 48.485222, + "ave_i_frame_psnr_v": 47.282197, + "ave_i_frame_msssim_y": 0.995814, + "ave_i_frame_msssim_u": 0.995428, + "ave_i_frame_msssim_v": 0.994844, + "test_time": 54643.919242, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.059965, + "ave_all_frame_psnr": 44.961432, + "ave_all_frame_msssim": 0.995644, + "ave_all_frame_psnr_y": 43.987339, + "ave_all_frame_psnr_u": 48.485222, + "ave_all_frame_psnr_v": 47.282197, + "ave_all_frame_msssim_y": 0.995814, + "ave_all_frame_msssim_u": 0.995428, + "ave_all_frame_msssim_v": 0.994844, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.036896, + "ave_i_frame_psnr": 43.438495, + "ave_i_frame_msssim": 0.993814, + "ave_i_frame_psnr_y": 42.309712, + "ave_i_frame_psnr_u": 47.538046, + "ave_i_frame_psnr_v": 46.111644, + "ave_i_frame_msssim_y": 0.993915, + "ave_i_frame_msssim_u": 0.994159, + "ave_i_frame_msssim_v": 0.992862, + "test_time": 44344.652956, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.036896, + "ave_all_frame_psnr": 43.438495, + "ave_all_frame_msssim": 0.993814, + "ave_all_frame_psnr_y": 42.309712, + "ave_all_frame_psnr_u": 47.538046, + "ave_all_frame_psnr_v": 46.111644, + "ave_all_frame_msssim_y": 0.993915, + "ave_all_frame_msssim_u": 0.994159, + "ave_all_frame_msssim_v": 0.992862, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.023153, + "ave_i_frame_psnr": 41.826084, + "ave_i_frame_msssim": 0.990992, + "ave_i_frame_psnr_y": 40.527839, + "ave_i_frame_psnr_u": 46.527783, + "ave_i_frame_psnr_v": 44.913855, + "ave_i_frame_msssim_y": 0.990883, + "ave_i_frame_msssim_u": 0.992497, + "ave_i_frame_msssim_v": 0.990143, + "test_time": 35345.446220, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.023153, + "ave_all_frame_psnr": 41.826084, + "ave_all_frame_msssim": 0.990992, + "ave_all_frame_psnr_y": 40.527839, + "ave_all_frame_psnr_u": 46.527783, + "ave_all_frame_psnr_v": 44.913855, + "ave_all_frame_msssim_y": 0.990883, + "ave_all_frame_msssim_u": 0.992497, + "ave_all_frame_msssim_v": 0.990143, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014685, + "ave_i_frame_psnr": 40.180344, + "ave_i_frame_msssim": 0.986761, + "ave_i_frame_psnr_y": 38.675143, + "ave_i_frame_psnr_u": 45.538786, + "ave_i_frame_psnr_v": 43.853106, + "ave_i_frame_msssim_y": 0.986083, + "ave_i_frame_msssim_u": 0.990575, + "ave_i_frame_msssim_v": 0.987015, + "test_time": 27312.679588, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014685, + "ave_all_frame_psnr": 40.180344, + "ave_all_frame_msssim": 0.986761, + "ave_all_frame_psnr_y": 38.675143, + "ave_all_frame_psnr_u": 45.538786, + "ave_all_frame_psnr_v": 43.853106, + "ave_all_frame_msssim_y": 0.986083, + "ave_all_frame_msssim_u": 0.990575, + "ave_all_frame_msssim_v": 0.987015, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009914, + "ave_i_frame_psnr": 38.672539, + "ave_i_frame_msssim": 0.981062, + "ave_i_frame_psnr_y": 37.044638, + "ave_i_frame_psnr_u": 44.402787, + "ave_i_frame_psnr_v": 42.709694, + "ave_i_frame_msssim_y": 0.979635, + "ave_i_frame_msssim_u": 0.987978, + "ave_i_frame_msssim_v": 0.982708, + "test_time": 20901.305797, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009914, + "ave_all_frame_psnr": 38.672539, + "ave_all_frame_msssim": 0.981062, + "ave_all_frame_psnr_y": 37.044638, + "ave_all_frame_psnr_u": 44.402787, + "ave_all_frame_psnr_v": 42.709694, + "ave_all_frame_msssim_y": 0.979635, + "ave_all_frame_msssim_u": 0.987978, + "ave_all_frame_msssim_v": 0.982708, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006664, + "ave_i_frame_psnr": 37.258601, + "ave_i_frame_msssim": 0.973195, + "ave_i_frame_psnr_y": 35.404096, + "ave_i_frame_psnr_u": 43.609693, + "ave_i_frame_psnr_v": 42.034539, + "ave_i_frame_msssim_y": 0.970099, + "ave_i_frame_msssim_u": 0.985667, + "ave_i_frame_msssim_v": 0.979300, + "test_time": 16255.755041, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006664, + "ave_all_frame_psnr": 37.258601, + "ave_all_frame_msssim": 0.973195, + "ave_all_frame_psnr_y": 35.404096, + "ave_all_frame_psnr_u": 43.609693, + "ave_all_frame_psnr_v": 42.034539, + "ave_all_frame_msssim_y": 0.970099, + "ave_all_frame_msssim_u": 0.985667, + "ave_all_frame_msssim_v": 0.979300, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004427, + "ave_i_frame_psnr": 35.799883, + "ave_i_frame_msssim": 0.961666, + "ave_i_frame_psnr_y": 33.752710, + "ave_i_frame_psnr_u": 42.688220, + "ave_i_frame_psnr_v": 41.194585, + "ave_i_frame_msssim_y": 0.956050, + "ave_i_frame_msssim_u": 0.982539, + "ave_i_frame_msssim_v": 0.974491, + "test_time": 12364.405516, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004427, + "ave_all_frame_psnr": 35.799883, + "ave_all_frame_msssim": 0.961666, + "ave_all_frame_psnr_y": 33.752710, + "ave_all_frame_psnr_u": 42.688220, + "ave_all_frame_psnr_v": 41.194585, + "ave_all_frame_msssim_y": 0.956050, + "ave_all_frame_msssim_u": 0.982539, + "ave_all_frame_msssim_v": 0.974491, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002921, + "ave_i_frame_psnr": 34.403165, + "ave_i_frame_msssim": 0.946348, + "ave_i_frame_psnr_y": 32.131217, + "ave_i_frame_psnr_u": 41.905862, + "ave_i_frame_psnr_v": 40.532159, + "ave_i_frame_msssim_y": 0.936854, + "ave_i_frame_msssim_u": 0.979551, + "ave_i_frame_msssim_v": 0.970112, + "test_time": 9576.741942, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002921, + "ave_all_frame_psnr": 34.403165, + "ave_all_frame_msssim": 0.946348, + "ave_all_frame_psnr_y": 32.131217, + "ave_all_frame_psnr_u": 41.905862, + "ave_all_frame_psnr_v": 40.532159, + "ave_all_frame_msssim_y": 0.936854, + "ave_all_frame_msssim_u": 0.979551, + "ave_all_frame_msssim_v": 0.970112, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001895, + "ave_i_frame_psnr": 32.916424, + "ave_i_frame_msssim": 0.925430, + "ave_i_frame_psnr_y": 30.553281, + "ave_i_frame_psnr_u": 40.589854, + "ave_i_frame_psnr_v": 39.421853, + "ave_i_frame_msssim_y": 0.911418, + "ave_i_frame_msssim_u": 0.972811, + "ave_i_frame_msssim_v": 0.962121, + "test_time": 7213.514639, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001895, + "ave_all_frame_psnr": 32.916424, + "ave_all_frame_msssim": 0.925430, + "ave_all_frame_psnr_y": 30.553281, + "ave_all_frame_psnr_u": 40.589854, + "ave_all_frame_psnr_v": 39.421853, + "ave_all_frame_msssim_y": 0.911418, + "ave_all_frame_msssim_u": 0.972811, + "ave_all_frame_msssim_v": 0.962121, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001212, + "ave_i_frame_psnr": 31.445607, + "ave_i_frame_msssim": 0.897671, + "ave_i_frame_psnr_y": 29.038083, + "ave_i_frame_psnr_u": 39.052060, + "ave_i_frame_psnr_v": 38.284298, + "ave_i_frame_msssim_y": 0.877779, + "ave_i_frame_msssim_u": 0.962700, + "ave_i_frame_msssim_v": 0.951992, + "test_time": 5079.050457, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001212, + "ave_all_frame_psnr": 31.445607, + "ave_all_frame_msssim": 0.897671, + "ave_all_frame_psnr_y": 29.038083, + "ave_all_frame_psnr_u": 39.052060, + "ave_all_frame_psnr_v": 38.284298, + "ave_all_frame_msssim_y": 0.877779, + "ave_all_frame_msssim_u": 0.962700, + "ave_all_frame_msssim_v": 0.951992, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC23_1920x1080_24.yuv" + } + }, + "videoSRC24_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.054688, + "ave_i_frame_psnr": 45.954511, + "ave_i_frame_msssim": 0.996975, + "ave_i_frame_psnr_y": 45.644609, + "ave_i_frame_psnr_u": 47.008904, + "ave_i_frame_psnr_v": 46.759523, + "ave_i_frame_msssim_y": 0.996960, + "ave_i_frame_msssim_u": 0.996894, + "ave_i_frame_msssim_v": 0.997148, + "test_time": 59074.548592, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.054688, + "ave_all_frame_psnr": 45.954511, + "ave_all_frame_msssim": 0.996975, + "ave_all_frame_psnr_y": 45.644609, + "ave_all_frame_psnr_u": 47.008904, + "ave_all_frame_psnr_v": 46.759523, + "ave_all_frame_msssim_y": 0.996960, + "ave_all_frame_msssim_u": 0.996894, + "ave_all_frame_msssim_v": 0.997148, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.033296, + "ave_i_frame_psnr": 44.422208, + "ave_i_frame_msssim": 0.995867, + "ave_i_frame_psnr_y": 44.174901, + "ave_i_frame_psnr_u": 45.328564, + "ave_i_frame_psnr_v": 44.999696, + "ave_i_frame_msssim_y": 0.995939, + "ave_i_frame_msssim_u": 0.995441, + "ave_i_frame_msssim_v": 0.995858, + "test_time": 46409.834249, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.033296, + "ave_all_frame_psnr": 44.422208, + "ave_all_frame_msssim": 0.995867, + "ave_all_frame_psnr_y": 44.174901, + "ave_all_frame_psnr_u": 45.328564, + "ave_all_frame_psnr_v": 44.999696, + "ave_all_frame_msssim_y": 0.995939, + "ave_all_frame_msssim_u": 0.995441, + "ave_all_frame_msssim_v": 0.995858, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.020771, + "ave_i_frame_psnr": 42.782946, + "ave_i_frame_msssim": 0.994133, + "ave_i_frame_psnr_y": 42.540215, + "ave_i_frame_psnr_u": 43.729929, + "ave_i_frame_psnr_v": 43.292353, + "ave_i_frame_msssim_y": 0.994311, + "ave_i_frame_msssim_u": 0.993359, + "ave_i_frame_msssim_v": 0.993838, + "test_time": 36945.832681, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.020771, + "ave_all_frame_psnr": 42.782946, + "ave_all_frame_msssim": 0.994133, + "ave_all_frame_psnr_y": 42.540215, + "ave_all_frame_psnr_u": 43.729929, + "ave_all_frame_psnr_v": 43.292353, + "ave_all_frame_msssim_y": 0.994311, + "ave_all_frame_msssim_u": 0.993359, + "ave_all_frame_msssim_v": 0.993838, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013387, + "ave_i_frame_psnr": 41.139334, + "ave_i_frame_msssim": 0.991611, + "ave_i_frame_psnr_y": 40.790954, + "ave_i_frame_psnr_u": 42.425757, + "ave_i_frame_psnr_v": 41.943188, + "ave_i_frame_msssim_y": 0.991755, + "ave_i_frame_msssim_u": 0.990784, + "ave_i_frame_msssim_v": 0.991575, + "test_time": 27654.835405, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013387, + "ave_all_frame_psnr": 41.139334, + "ave_all_frame_msssim": 0.991611, + "ave_all_frame_psnr_y": 40.790954, + "ave_all_frame_psnr_u": 42.425757, + "ave_all_frame_psnr_v": 41.943188, + "ave_all_frame_msssim_y": 0.991755, + "ave_all_frame_msssim_u": 0.990784, + "ave_all_frame_msssim_v": 0.991575, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009201, + "ave_i_frame_psnr": 39.661999, + "ave_i_frame_msssim": 0.988372, + "ave_i_frame_psnr_y": 39.277770, + "ave_i_frame_psnr_u": 41.095616, + "ave_i_frame_psnr_v": 40.533756, + "ave_i_frame_msssim_y": 0.988598, + "ave_i_frame_msssim_u": 0.987278, + "ave_i_frame_msssim_v": 0.988106, + "test_time": 20879.508987, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009201, + "ave_all_frame_psnr": 39.661999, + "ave_all_frame_msssim": 0.988372, + "ave_all_frame_psnr_y": 39.277770, + "ave_all_frame_psnr_u": 41.095616, + "ave_all_frame_psnr_v": 40.533756, + "ave_all_frame_msssim_y": 0.988598, + "ave_all_frame_msssim_u": 0.987278, + "ave_all_frame_msssim_v": 0.988106, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006488, + "ave_i_frame_psnr": 38.243631, + "ave_i_frame_msssim": 0.984187, + "ave_i_frame_psnr_y": 37.714760, + "ave_i_frame_psnr_u": 40.113317, + "ave_i_frame_psnr_v": 39.547174, + "ave_i_frame_msssim_y": 0.984055, + "ave_i_frame_msssim_u": 0.983961, + "ave_i_frame_msssim_v": 0.985208, + "test_time": 16467.988740, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006488, + "ave_all_frame_psnr": 38.243631, + "ave_all_frame_msssim": 0.984187, + "ave_all_frame_psnr_y": 37.714760, + "ave_all_frame_psnr_u": 40.113317, + "ave_all_frame_psnr_v": 39.547174, + "ave_all_frame_msssim_y": 0.984055, + "ave_all_frame_msssim_u": 0.983961, + "ave_all_frame_msssim_v": 0.985208, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004487, + "ave_i_frame_psnr": 36.710371, + "ave_i_frame_msssim": 0.977925, + "ave_i_frame_psnr_y": 36.088283, + "ave_i_frame_psnr_u": 38.912908, + "ave_i_frame_psnr_v": 38.240365, + "ave_i_frame_msssim_y": 0.977564, + "ave_i_frame_msssim_u": 0.978438, + "ave_i_frame_msssim_v": 0.979583, + "test_time": 12659.748704, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004487, + "ave_all_frame_psnr": 36.710371, + "ave_all_frame_msssim": 0.977925, + "ave_all_frame_psnr_y": 36.088283, + "ave_all_frame_psnr_u": 38.912908, + "ave_all_frame_psnr_v": 38.240365, + "ave_all_frame_msssim_y": 0.977564, + "ave_all_frame_msssim_u": 0.978438, + "ave_all_frame_msssim_v": 0.979583, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003131, + "ave_i_frame_psnr": 35.190407, + "ave_i_frame_msssim": 0.969428, + "ave_i_frame_psnr_y": 34.442148, + "ave_i_frame_psnr_u": 37.811924, + "ave_i_frame_psnr_v": 37.058445, + "ave_i_frame_msssim_y": 0.968451, + "ave_i_frame_msssim_u": 0.971686, + "ave_i_frame_msssim_v": 0.973029, + "test_time": 9845.475751, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003131, + "ave_all_frame_psnr": 35.190407, + "ave_all_frame_msssim": 0.969428, + "ave_all_frame_psnr_y": 34.442148, + "ave_all_frame_psnr_u": 37.811924, + "ave_all_frame_psnr_v": 37.058445, + "ave_all_frame_msssim_y": 0.968451, + "ave_all_frame_msssim_u": 0.971686, + "ave_all_frame_msssim_v": 0.973029, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002113, + "ave_i_frame_psnr": 33.540373, + "ave_i_frame_msssim": 0.956724, + "ave_i_frame_psnr_y": 32.748244, + "ave_i_frame_psnr_u": 36.288763, + "ave_i_frame_psnr_v": 35.544756, + "ave_i_frame_msssim_y": 0.955446, + "ave_i_frame_msssim_u": 0.959576, + "ave_i_frame_msssim_v": 0.961542, + "test_time": 7593.826220, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002113, + "ave_all_frame_psnr": 33.540373, + "ave_all_frame_msssim": 0.956724, + "ave_all_frame_psnr_y": 32.748244, + "ave_all_frame_psnr_u": 36.288763, + "ave_all_frame_psnr_v": 35.544756, + "ave_all_frame_msssim_y": 0.955446, + "ave_all_frame_msssim_u": 0.959576, + "ave_all_frame_msssim_v": 0.961542, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001415, + "ave_i_frame_psnr": 31.886805, + "ave_i_frame_msssim": 0.938785, + "ave_i_frame_psnr_y": 31.059044, + "ave_i_frame_psnr_u": 34.729572, + "ave_i_frame_psnr_v": 34.010605, + "ave_i_frame_msssim_y": 0.937254, + "ave_i_frame_msssim_u": 0.942338, + "ave_i_frame_msssim_v": 0.944419, + "test_time": 5238.315655, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001415, + "ave_all_frame_psnr": 31.886805, + "ave_all_frame_msssim": 0.938785, + "ave_all_frame_psnr_y": 31.059044, + "ave_all_frame_psnr_u": 34.729572, + "ave_all_frame_psnr_v": 34.010605, + "ave_all_frame_msssim_y": 0.937254, + "ave_all_frame_msssim_u": 0.942338, + "ave_all_frame_msssim_v": 0.944419, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC24_1920x1080_24.yuv" + } + }, + "videoSRC25_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.389474, + "ave_i_frame_psnr": 41.419847, + "ave_i_frame_msssim": 0.996066, + "ave_i_frame_psnr_y": 41.129092, + "ave_i_frame_psnr_u": 41.714177, + "ave_i_frame_psnr_v": 42.870046, + "ave_i_frame_msssim_y": 0.997044, + "ave_i_frame_msssim_u": 0.993661, + "ave_i_frame_msssim_v": 0.992608, + "test_time": 114890.348583, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.389474, + "ave_all_frame_psnr": 41.419847, + "ave_all_frame_msssim": 0.996066, + "ave_all_frame_psnr_y": 41.129092, + "ave_all_frame_psnr_u": 41.714177, + "ave_all_frame_psnr_v": 42.870046, + "ave_all_frame_msssim_y": 0.997044, + "ave_all_frame_msssim_u": 0.993661, + "ave_all_frame_msssim_v": 0.992608, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.228553, + "ave_i_frame_psnr": 38.933180, + "ave_i_frame_msssim": 0.992914, + "ave_i_frame_psnr_y": 38.505887, + "ave_i_frame_psnr_u": 39.467697, + "ave_i_frame_psnr_v": 40.962419, + "ave_i_frame_msssim_y": 0.994434, + "ave_i_frame_msssim_u": 0.988942, + "ave_i_frame_msssim_v": 0.987765, + "test_time": 102614.134319, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.228553, + "ave_all_frame_psnr": 38.933180, + "ave_all_frame_msssim": 0.992914, + "ave_all_frame_psnr_y": 38.505887, + "ave_all_frame_psnr_u": 39.467697, + "ave_all_frame_psnr_v": 40.962419, + "ave_all_frame_msssim_y": 0.994434, + "ave_all_frame_msssim_u": 0.988942, + "ave_all_frame_msssim_v": 0.987765, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.136206, + "ave_i_frame_psnr": 36.722760, + "ave_i_frame_msssim": 0.987682, + "ave_i_frame_psnr_y": 36.147596, + "ave_i_frame_psnr_u": 37.572384, + "ave_i_frame_psnr_v": 39.324115, + "ave_i_frame_msssim_y": 0.989693, + "ave_i_frame_msssim_u": 0.982031, + "ave_i_frame_msssim_v": 0.981270, + "test_time": 85971.957114, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.136206, + "ave_all_frame_psnr": 36.722760, + "ave_all_frame_msssim": 0.987682, + "ave_all_frame_psnr_y": 36.147596, + "ave_all_frame_psnr_u": 37.572384, + "ave_all_frame_psnr_v": 39.324115, + "ave_all_frame_msssim_y": 0.989693, + "ave_all_frame_msssim_u": 0.982031, + "ave_all_frame_msssim_v": 0.981270, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.082414, + "ave_i_frame_psnr": 34.725661, + "ave_i_frame_msssim": 0.979623, + "ave_i_frame_psnr_y": 33.892495, + "ave_i_frame_psnr_u": 36.294610, + "ave_i_frame_psnr_v": 38.155705, + "ave_i_frame_msssim_y": 0.981170, + "ave_i_frame_msssim_u": 0.975019, + "ave_i_frame_msssim_v": 0.974945, + "test_time": 76613.444876, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.082414, + "ave_all_frame_psnr": 34.725661, + "ave_all_frame_msssim": 0.979623, + "ave_all_frame_psnr_y": 33.892495, + "ave_all_frame_psnr_u": 36.294610, + "ave_all_frame_psnr_v": 38.155705, + "ave_all_frame_msssim_y": 0.981170, + "ave_all_frame_msssim_u": 0.975019, + "ave_all_frame_msssim_v": 0.974945, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.053067, + "ave_i_frame_psnr": 33.098185, + "ave_i_frame_msssim": 0.969154, + "ave_i_frame_psnr_y": 32.142333, + "ave_i_frame_psnr_u": 35.011924, + "ave_i_frame_psnr_v": 36.919559, + "ave_i_frame_msssim_y": 0.970379, + "ave_i_frame_msssim_u": 0.965252, + "ave_i_frame_msssim_v": 0.965707, + "test_time": 60311.704316, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.053067, + "ave_all_frame_psnr": 33.098185, + "ave_all_frame_msssim": 0.969154, + "ave_all_frame_psnr_y": 32.142333, + "ave_all_frame_psnr_u": 35.011924, + "ave_all_frame_psnr_v": 36.919559, + "ave_all_frame_msssim_y": 0.970379, + "ave_all_frame_msssim_u": 0.965252, + "ave_all_frame_msssim_v": 0.965707, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.033483, + "ave_i_frame_psnr": 31.567305, + "ave_i_frame_msssim": 0.954686, + "ave_i_frame_psnr_y": 30.453829, + "ave_i_frame_psnr_u": 33.840864, + "ave_i_frame_psnr_v": 35.974606, + "ave_i_frame_msssim_y": 0.954558, + "ave_i_frame_msssim_u": 0.953400, + "ave_i_frame_msssim_v": 0.956746, + "test_time": 46952.129086, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.033483, + "ave_all_frame_psnr": 31.567305, + "ave_all_frame_msssim": 0.954686, + "ave_all_frame_psnr_y": 30.453829, + "ave_all_frame_psnr_u": 33.840864, + "ave_all_frame_psnr_v": 35.974606, + "ave_all_frame_msssim_y": 0.954558, + "ave_all_frame_msssim_u": 0.953400, + "ave_all_frame_msssim_v": 0.956746, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.020107, + "ave_i_frame_psnr": 30.036986, + "ave_i_frame_msssim": 0.933600, + "ave_i_frame_psnr_y": 28.841016, + "ave_i_frame_psnr_u": 32.476230, + "ave_i_frame_psnr_v": 34.773559, + "ave_i_frame_msssim_y": 0.932145, + "ave_i_frame_msssim_u": 0.933978, + "ave_i_frame_msssim_v": 0.941957, + "test_time": 37311.516871, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.020107, + "ave_all_frame_psnr": 30.036986, + "ave_all_frame_msssim": 0.933600, + "ave_all_frame_psnr_y": 28.841016, + "ave_all_frame_psnr_u": 32.476230, + "ave_all_frame_psnr_v": 34.773559, + "ave_all_frame_msssim_y": 0.932145, + "ave_all_frame_msssim_u": 0.933978, + "ave_all_frame_msssim_v": 0.941957, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011753, + "ave_i_frame_psnr": 28.615115, + "ave_i_frame_msssim": 0.905970, + "ave_i_frame_psnr_y": 27.318754, + "ave_i_frame_psnr_u": 31.264240, + "ave_i_frame_psnr_v": 33.744156, + "ave_i_frame_msssim_y": 0.901836, + "ave_i_frame_msssim_u": 0.911017, + "ave_i_frame_msssim_v": 0.925724, + "test_time": 26864.577124, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011753, + "ave_all_frame_psnr": 28.615115, + "ave_all_frame_msssim": 0.905970, + "ave_all_frame_psnr_y": 27.318754, + "ave_all_frame_psnr_u": 31.264240, + "ave_all_frame_psnr_v": 33.744156, + "ave_all_frame_msssim_y": 0.901836, + "ave_all_frame_msssim_u": 0.911017, + "ave_all_frame_msssim_v": 0.925724, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006510, + "ave_i_frame_psnr": 27.258371, + "ave_i_frame_msssim": 0.870388, + "ave_i_frame_psnr_y": 25.899861, + "ave_i_frame_psnr_u": 30.109653, + "ave_i_frame_psnr_v": 32.558147, + "ave_i_frame_msssim_y": 0.863192, + "ave_i_frame_msssim_u": 0.881602, + "ave_i_frame_msssim_v": 0.902348, + "test_time": 17215.099505, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006510, + "ave_all_frame_psnr": 27.258371, + "ave_all_frame_msssim": 0.870388, + "ave_all_frame_psnr_y": 25.899861, + "ave_all_frame_psnr_u": 30.109653, + "ave_all_frame_psnr_v": 32.558147, + "ave_all_frame_msssim_y": 0.863192, + "ave_all_frame_msssim_u": 0.881602, + "ave_all_frame_msssim_v": 0.902348, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003576, + "ave_i_frame_psnr": 26.053273, + "ave_i_frame_msssim": 0.829714, + "ave_i_frame_psnr_y": 24.655252, + "ave_i_frame_psnr_u": 29.054625, + "ave_i_frame_psnr_v": 31.440045, + "ave_i_frame_msssim_y": 0.819058, + "ave_i_frame_msssim_u": 0.847864, + "ave_i_frame_msssim_v": 0.875499, + "test_time": 9565.973822, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003576, + "ave_all_frame_psnr": 26.053273, + "ave_all_frame_msssim": 0.829714, + "ave_all_frame_psnr_y": 24.655252, + "ave_all_frame_psnr_u": 29.054625, + "ave_all_frame_psnr_v": 31.440045, + "ave_all_frame_msssim_y": 0.819058, + "ave_all_frame_msssim_u": 0.847864, + "ave_all_frame_msssim_v": 0.875499, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC25_1920x1080_24.yuv" + } + }, + "videoSRC26_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.040465, + "ave_i_frame_psnr": 45.842465, + "ave_i_frame_msssim": 0.995544, + "ave_i_frame_psnr_y": 44.993769, + "ave_i_frame_psnr_u": 47.867254, + "ave_i_frame_psnr_v": 48.909855, + "ave_i_frame_msssim_y": 0.995431, + "ave_i_frame_msssim_u": 0.995528, + "ave_i_frame_msssim_v": 0.996241, + "test_time": 77680.377521, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.040465, + "ave_all_frame_psnr": 45.842465, + "ave_all_frame_msssim": 0.995544, + "ave_all_frame_psnr_y": 44.993769, + "ave_all_frame_psnr_u": 47.867254, + "ave_all_frame_psnr_v": 48.909855, + "ave_all_frame_msssim_y": 0.995431, + "ave_all_frame_msssim_u": 0.995528, + "ave_all_frame_msssim_v": 0.996241, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.026605, + "ave_i_frame_psnr": 44.831234, + "ave_i_frame_msssim": 0.994103, + "ave_i_frame_psnr_y": 43.960070, + "ave_i_frame_psnr_u": 47.017562, + "ave_i_frame_psnr_v": 47.871889, + "ave_i_frame_msssim_y": 0.993944, + "ave_i_frame_msssim_u": 0.994205, + "ave_i_frame_msssim_v": 0.994954, + "test_time": 59591.395367, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.026605, + "ave_all_frame_psnr": 44.831234, + "ave_all_frame_msssim": 0.994103, + "ave_all_frame_psnr_y": 43.960070, + "ave_all_frame_psnr_u": 47.017562, + "ave_all_frame_psnr_v": 47.871889, + "ave_all_frame_msssim_y": 0.993944, + "ave_all_frame_msssim_u": 0.994205, + "ave_all_frame_msssim_v": 0.994954, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017749, + "ave_i_frame_psnr": 43.617446, + "ave_i_frame_msssim": 0.991919, + "ave_i_frame_psnr_y": 42.687479, + "ave_i_frame_psnr_u": 46.065364, + "ave_i_frame_psnr_v": 46.749332, + "ave_i_frame_msssim_y": 0.991607, + "ave_i_frame_msssim_u": 0.992554, + "ave_i_frame_msssim_v": 0.993155, + "test_time": 44013.876024, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017749, + "ave_all_frame_psnr": 43.617446, + "ave_all_frame_msssim": 0.991919, + "ave_all_frame_psnr_y": 42.687479, + "ave_all_frame_psnr_u": 46.065364, + "ave_all_frame_psnr_v": 46.749332, + "ave_all_frame_msssim_y": 0.991607, + "ave_all_frame_msssim_u": 0.992554, + "ave_all_frame_msssim_v": 0.993155, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011991, + "ave_i_frame_psnr": 42.282641, + "ave_i_frame_msssim": 0.988731, + "ave_i_frame_psnr_y": 41.172934, + "ave_i_frame_psnr_u": 45.323893, + "ave_i_frame_psnr_v": 45.899634, + "ave_i_frame_msssim_y": 0.987969, + "ave_i_frame_msssim_u": 0.990707, + "ave_i_frame_msssim_v": 0.991326, + "test_time": 32474.229808, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011991, + "ave_all_frame_psnr": 42.282641, + "ave_all_frame_msssim": 0.988731, + "ave_all_frame_psnr_y": 41.172934, + "ave_all_frame_psnr_u": 45.323893, + "ave_all_frame_psnr_v": 45.899634, + "ave_all_frame_msssim_y": 0.987969, + "ave_all_frame_msssim_u": 0.990707, + "ave_all_frame_msssim_v": 0.991326, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008650, + "ave_i_frame_psnr": 40.998606, + "ave_i_frame_msssim": 0.984819, + "ave_i_frame_psnr_y": 39.795433, + "ave_i_frame_psnr_u": 44.362414, + "ave_i_frame_psnr_v": 44.853838, + "ave_i_frame_msssim_y": 0.983568, + "ave_i_frame_msssim_u": 0.988179, + "ave_i_frame_msssim_v": 0.988964, + "test_time": 24299.953546, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008650, + "ave_all_frame_psnr": 40.998606, + "ave_all_frame_msssim": 0.984819, + "ave_all_frame_psnr_y": 39.795433, + "ave_all_frame_psnr_u": 44.362414, + "ave_all_frame_psnr_v": 44.853838, + "ave_all_frame_msssim_y": 0.983568, + "ave_all_frame_msssim_u": 0.988179, + "ave_all_frame_msssim_v": 0.988964, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006242, + "ave_i_frame_psnr": 39.643423, + "ave_i_frame_msssim": 0.979406, + "ave_i_frame_psnr_y": 38.308280, + "ave_i_frame_psnr_u": 43.229400, + "ave_i_frame_psnr_v": 44.068302, + "ave_i_frame_msssim_y": 0.977433, + "ave_i_frame_msssim_u": 0.984125, + "ave_i_frame_msssim_v": 0.986527, + "test_time": 18912.623039, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006242, + "ave_all_frame_psnr": 39.643423, + "ave_all_frame_msssim": 0.979406, + "ave_all_frame_psnr_y": 38.308280, + "ave_all_frame_psnr_u": 43.229400, + "ave_all_frame_psnr_v": 44.068302, + "ave_all_frame_msssim_y": 0.977433, + "ave_all_frame_msssim_u": 0.984125, + "ave_all_frame_msssim_v": 0.986527, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004492, + "ave_i_frame_psnr": 38.203917, + "ave_i_frame_msssim": 0.972197, + "ave_i_frame_psnr_y": 36.742154, + "ave_i_frame_psnr_u": 42.180871, + "ave_i_frame_psnr_v": 42.997544, + "ave_i_frame_msssim_y": 0.969021, + "ave_i_frame_msssim_u": 0.980248, + "ave_i_frame_msssim_v": 0.983200, + "test_time": 14549.978100, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004492, + "ave_all_frame_psnr": 38.203917, + "ave_all_frame_msssim": 0.972197, + "ave_all_frame_psnr_y": 36.742154, + "ave_all_frame_psnr_u": 42.180871, + "ave_all_frame_psnr_v": 42.997544, + "ave_all_frame_msssim_y": 0.969021, + "ave_all_frame_msssim_u": 0.980248, + "ave_all_frame_msssim_v": 0.983200, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003219, + "ave_i_frame_psnr": 36.767200, + "ave_i_frame_msssim": 0.962650, + "ave_i_frame_psnr_y": 35.084236, + "ave_i_frame_psnr_u": 41.433948, + "ave_i_frame_psnr_v": 42.198237, + "ave_i_frame_msssim_y": 0.957381, + "ave_i_frame_msssim_u": 0.976919, + "ave_i_frame_msssim_v": 0.979998, + "test_time": 11326.378763, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003219, + "ave_all_frame_psnr": 36.767200, + "ave_all_frame_msssim": 0.962650, + "ave_all_frame_psnr_y": 35.084236, + "ave_all_frame_psnr_u": 41.433948, + "ave_all_frame_psnr_v": 42.198237, + "ave_all_frame_msssim_y": 0.957381, + "ave_all_frame_msssim_u": 0.976919, + "ave_all_frame_msssim_v": 0.979998, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002293, + "ave_i_frame_psnr": 35.096132, + "ave_i_frame_msssim": 0.948653, + "ave_i_frame_psnr_y": 33.342320, + "ave_i_frame_psnr_u": 39.792640, + "ave_i_frame_psnr_v": 40.922501, + "ave_i_frame_msssim_y": 0.940927, + "ave_i_frame_msssim_u": 0.969747, + "ave_i_frame_msssim_v": 0.973911, + "test_time": 8719.355085, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002293, + "ave_all_frame_psnr": 35.096132, + "ave_all_frame_msssim": 0.948653, + "ave_all_frame_psnr_y": 33.342320, + "ave_all_frame_psnr_u": 39.792640, + "ave_all_frame_psnr_v": 40.922501, + "ave_all_frame_msssim_y": 0.940927, + "ave_all_frame_msssim_u": 0.969747, + "ave_all_frame_msssim_v": 0.973911, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001639, + "ave_i_frame_psnr": 33.422280, + "ave_i_frame_msssim": 0.930798, + "ave_i_frame_psnr_y": 31.609417, + "ave_i_frame_psnr_u": 38.330776, + "ave_i_frame_psnr_v": 39.390962, + "ave_i_frame_msssim_y": 0.919676, + "ave_i_frame_msssim_u": 0.961013, + "ave_i_frame_msssim_v": 0.967309, + "test_time": 5901.266698, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001639, + "ave_all_frame_psnr": 33.422280, + "ave_all_frame_msssim": 0.930798, + "ave_all_frame_psnr_y": 31.609417, + "ave_all_frame_psnr_u": 38.330776, + "ave_all_frame_psnr_v": 39.390962, + "ave_all_frame_msssim_y": 0.919676, + "ave_all_frame_msssim_u": 0.961013, + "ave_all_frame_msssim_v": 0.967309, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC26_1920x1080_30.yuv" + } + }, + "videoSRC27_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.131505, + "ave_i_frame_psnr": 43.859593, + "ave_i_frame_msssim": 0.995129, + "ave_i_frame_psnr_y": 42.699440, + "ave_i_frame_psnr_u": 47.044798, + "ave_i_frame_psnr_v": 47.635310, + "ave_i_frame_msssim_y": 0.995523, + "ave_i_frame_msssim_u": 0.993768, + "ave_i_frame_msssim_v": 0.994122, + "test_time": 118976.869858, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.131505, + "ave_all_frame_psnr": 43.859593, + "ave_all_frame_msssim": 0.995129, + "ave_all_frame_psnr_y": 42.699440, + "ave_all_frame_psnr_u": 47.044798, + "ave_all_frame_psnr_v": 47.635310, + "ave_all_frame_msssim_y": 0.995523, + "ave_all_frame_msssim_u": 0.993768, + "ave_all_frame_msssim_v": 0.994122, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.080175, + "ave_i_frame_psnr": 41.963198, + "ave_i_frame_msssim": 0.992348, + "ave_i_frame_psnr_y": 40.513346, + "ave_i_frame_psnr_u": 45.766812, + "ave_i_frame_psnr_v": 46.858695, + "ave_i_frame_msssim_y": 0.992548, + "ave_i_frame_msssim_u": 0.990975, + "ave_i_frame_msssim_v": 0.992523, + "test_time": 98011.396091, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.080175, + "ave_all_frame_psnr": 41.963198, + "ave_all_frame_msssim": 0.992348, + "ave_all_frame_psnr_y": 40.513346, + "ave_all_frame_psnr_u": 45.766812, + "ave_all_frame_psnr_v": 46.858695, + "ave_all_frame_msssim_y": 0.992548, + "ave_all_frame_msssim_u": 0.990975, + "ave_all_frame_msssim_v": 0.992523, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.047393, + "ave_i_frame_psnr": 40.108819, + "ave_i_frame_msssim": 0.987962, + "ave_i_frame_psnr_y": 38.373036, + "ave_i_frame_psnr_u": 44.498369, + "ave_i_frame_psnr_v": 46.133967, + "ave_i_frame_msssim_y": 0.987611, + "ave_i_frame_msssim_u": 0.987197, + "ave_i_frame_msssim_v": 0.990831, + "test_time": 74803.735183, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.047393, + "ave_all_frame_psnr": 40.108819, + "ave_all_frame_msssim": 0.987962, + "ave_all_frame_psnr_y": 38.373036, + "ave_all_frame_psnr_u": 44.498369, + "ave_all_frame_psnr_v": 46.133967, + "ave_all_frame_msssim_y": 0.987611, + "ave_all_frame_msssim_u": 0.987197, + "ave_all_frame_msssim_v": 0.990831, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.027325, + "ave_i_frame_psnr": 38.367876, + "ave_i_frame_msssim": 0.981341, + "ave_i_frame_psnr_y": 36.337623, + "ave_i_frame_psnr_u": 43.357241, + "ave_i_frame_psnr_v": 45.560028, + "ave_i_frame_msssim_y": 0.979775, + "ave_i_frame_msssim_u": 0.982596, + "ave_i_frame_msssim_v": 0.989479, + "test_time": 54062.111823, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.027325, + "ave_all_frame_psnr": 38.367876, + "ave_all_frame_msssim": 0.981341, + "ave_all_frame_psnr_y": 36.337623, + "ave_all_frame_psnr_u": 43.357241, + "ave_all_frame_psnr_v": 45.560028, + "ave_all_frame_msssim_y": 0.979775, + "ave_all_frame_msssim_u": 0.982596, + "ave_all_frame_msssim_v": 0.989479, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017000, + "ave_i_frame_psnr": 36.917398, + "ave_i_frame_msssim": 0.973182, + "ave_i_frame_psnr_y": 34.714596, + "ave_i_frame_psnr_u": 42.209354, + "ave_i_frame_psnr_v": 44.842258, + "ave_i_frame_msssim_y": 0.970150, + "ave_i_frame_msssim_u": 0.976767, + "ave_i_frame_msssim_v": 0.987788, + "test_time": 41582.315130, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017000, + "ave_all_frame_psnr": 36.917398, + "ave_all_frame_msssim": 0.973182, + "ave_all_frame_psnr_y": 34.714596, + "ave_all_frame_psnr_u": 42.209354, + "ave_all_frame_psnr_v": 44.842258, + "ave_all_frame_msssim_y": 0.970150, + "ave_all_frame_msssim_u": 0.976767, + "ave_all_frame_msssim_v": 0.987788, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.010439, + "ave_i_frame_psnr": 35.645555, + "ave_i_frame_msssim": 0.962347, + "ave_i_frame_psnr_y": 33.159257, + "ave_i_frame_psnr_u": 41.572397, + "ave_i_frame_psnr_v": 44.636500, + "ave_i_frame_msssim_y": 0.956474, + "ave_i_frame_msssim_u": 0.972635, + "ave_i_frame_msssim_v": 0.987298, + "test_time": 30345.406096, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.010439, + "ave_all_frame_psnr": 35.645555, + "ave_all_frame_msssim": 0.962347, + "ave_all_frame_psnr_y": 33.159257, + "ave_all_frame_psnr_u": 41.572397, + "ave_all_frame_psnr_v": 44.636500, + "ave_all_frame_msssim_y": 0.956474, + "ave_all_frame_msssim_u": 0.972635, + "ave_all_frame_msssim_v": 0.987298, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006362, + "ave_i_frame_psnr": 34.357370, + "ave_i_frame_msssim": 0.947547, + "ave_i_frame_psnr_y": 31.651609, + "ave_i_frame_psnr_u": 40.824197, + "ave_i_frame_psnr_v": 44.125110, + "ave_i_frame_msssim_y": 0.937850, + "ave_i_frame_msssim_u": 0.967285, + "ave_i_frame_msssim_v": 0.985996, + "test_time": 22487.427191, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006362, + "ave_all_frame_psnr": 34.357370, + "ave_all_frame_msssim": 0.947547, + "ave_all_frame_psnr_y": 31.651609, + "ave_all_frame_psnr_u": 40.824197, + "ave_all_frame_psnr_v": 44.125110, + "ave_all_frame_msssim_y": 0.937850, + "ave_all_frame_msssim_u": 0.967285, + "ave_all_frame_msssim_v": 0.985996, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003880, + "ave_i_frame_psnr": 33.107417, + "ave_i_frame_msssim": 0.927723, + "ave_i_frame_psnr_y": 30.195968, + "ave_i_frame_psnr_u": 40.135141, + "ave_i_frame_psnr_v": 43.548391, + "ave_i_frame_msssim_y": 0.912618, + "ave_i_frame_msssim_u": 0.962196, + "ave_i_frame_msssim_v": 0.983879, + "test_time": 16516.429394, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003880, + "ave_all_frame_psnr": 33.107417, + "ave_all_frame_msssim": 0.927723, + "ave_all_frame_psnr_y": 30.195968, + "ave_all_frame_psnr_u": 40.135141, + "ave_all_frame_psnr_v": 43.548391, + "ave_all_frame_msssim_y": 0.912618, + "ave_all_frame_msssim_u": 0.962196, + "ave_all_frame_msssim_v": 0.983879, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002362, + "ave_i_frame_psnr": 31.773955, + "ave_i_frame_msssim": 0.902719, + "ave_i_frame_psnr_y": 28.796768, + "ave_i_frame_psnr_u": 38.943965, + "ave_i_frame_psnr_v": 42.467065, + "ave_i_frame_msssim_y": 0.880884, + "ave_i_frame_msssim_u": 0.952830, + "ave_i_frame_msssim_v": 0.983615, + "test_time": 12156.768780, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002362, + "ave_all_frame_psnr": 31.773955, + "ave_all_frame_msssim": 0.902719, + "ave_all_frame_psnr_y": 28.796768, + "ave_all_frame_psnr_u": 38.943965, + "ave_all_frame_psnr_v": 42.467065, + "ave_all_frame_msssim_y": 0.880884, + "ave_all_frame_msssim_u": 0.952830, + "ave_all_frame_msssim_v": 0.983615, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001448, + "ave_i_frame_psnr": 30.438976, + "ave_i_frame_msssim": 0.870311, + "ave_i_frame_psnr_y": 27.435311, + "ave_i_frame_psnr_u": 37.796835, + "ave_i_frame_psnr_v": 41.103106, + "ave_i_frame_msssim_y": 0.839956, + "ave_i_frame_msssim_u": 0.941155, + "ave_i_frame_msssim_v": 0.981596, + "test_time": 7084.168777, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001448, + "ave_all_frame_psnr": 30.438976, + "ave_all_frame_msssim": 0.870311, + "ave_all_frame_psnr_y": 27.435311, + "ave_all_frame_psnr_u": 37.796835, + "ave_all_frame_psnr_v": 41.103106, + "ave_all_frame_msssim_y": 0.839956, + "ave_all_frame_msssim_u": 0.941155, + "ave_all_frame_msssim_v": 0.981596, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC27_1920x1080_30.yuv" + } + }, + "videoSRC28_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017248, + "ave_i_frame_psnr": 45.034046, + "ave_i_frame_msssim": 0.995051, + "ave_i_frame_psnr_y": 44.053928, + "ave_i_frame_psnr_u": 47.491068, + "ave_i_frame_psnr_v": 48.457739, + "ave_i_frame_msssim_y": 0.994645, + "ave_i_frame_msssim_u": 0.996153, + "ave_i_frame_msssim_v": 0.996385, + "test_time": 46112.755479, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017248, + "ave_all_frame_psnr": 45.034046, + "ave_all_frame_msssim": 0.995051, + "ave_all_frame_psnr_y": 44.053928, + "ave_all_frame_psnr_u": 47.491068, + "ave_all_frame_psnr_v": 48.457739, + "ave_all_frame_msssim_y": 0.994645, + "ave_all_frame_msssim_u": 0.996153, + "ave_all_frame_msssim_v": 0.996385, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011118, + "ave_i_frame_psnr": 44.006647, + "ave_i_frame_msssim": 0.994043, + "ave_i_frame_psnr_y": 43.009125, + "ave_i_frame_psnr_u": 46.484535, + "ave_i_frame_psnr_v": 47.513889, + "ave_i_frame_msssim_y": 0.993696, + "ave_i_frame_msssim_u": 0.994906, + "ave_i_frame_msssim_v": 0.995262, + "test_time": 36021.845582, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011118, + "ave_all_frame_psnr": 44.006647, + "ave_all_frame_msssim": 0.994043, + "ave_all_frame_psnr_y": 43.009125, + "ave_all_frame_psnr_u": 46.484535, + "ave_all_frame_psnr_v": 47.513889, + "ave_all_frame_msssim_y": 0.993696, + "ave_all_frame_msssim_u": 0.994906, + "ave_all_frame_msssim_v": 0.995262, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007347, + "ave_i_frame_psnr": 42.765543, + "ave_i_frame_msssim": 0.992420, + "ave_i_frame_psnr_y": 41.713252, + "ave_i_frame_psnr_u": 45.372411, + "ave_i_frame_psnr_v": 46.472417, + "ave_i_frame_msssim_y": 0.992091, + "ave_i_frame_msssim_u": 0.993122, + "ave_i_frame_msssim_v": 0.993689, + "test_time": 26137.155791, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007347, + "ave_all_frame_psnr": 42.765543, + "ave_all_frame_msssim": 0.992420, + "ave_all_frame_psnr_y": 41.713252, + "ave_all_frame_psnr_u": 45.372411, + "ave_all_frame_psnr_v": 46.472417, + "ave_all_frame_msssim_y": 0.992091, + "ave_all_frame_msssim_u": 0.993122, + "ave_all_frame_msssim_v": 0.993689, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005027, + "ave_i_frame_psnr": 41.468156, + "ave_i_frame_msssim": 0.990235, + "ave_i_frame_psnr_y": 40.309566, + "ave_i_frame_psnr_u": 44.320135, + "ave_i_frame_psnr_v": 45.567719, + "ave_i_frame_msssim_y": 0.989776, + "ave_i_frame_msssim_u": 0.991045, + "ave_i_frame_msssim_v": 0.992175, + "test_time": 19327.668826, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005027, + "ave_all_frame_psnr": 41.468156, + "ave_all_frame_msssim": 0.990235, + "ave_all_frame_psnr_y": 40.309566, + "ave_all_frame_psnr_u": 44.320135, + "ave_all_frame_psnr_v": 45.567719, + "ave_all_frame_msssim_y": 0.989776, + "ave_all_frame_msssim_u": 0.991045, + "ave_all_frame_msssim_v": 0.992175, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003912, + "ave_i_frame_psnr": 40.144364, + "ave_i_frame_msssim": 0.987383, + "ave_i_frame_psnr_y": 38.876224, + "ave_i_frame_psnr_u": 43.161894, + "ave_i_frame_psnr_v": 44.735677, + "ave_i_frame_msssim_y": 0.986753, + "ave_i_frame_msssim_u": 0.988013, + "ave_i_frame_msssim_v": 0.990534, + "test_time": 15623.069221, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003912, + "ave_all_frame_psnr": 40.144364, + "ave_all_frame_msssim": 0.987383, + "ave_all_frame_psnr_y": 38.876224, + "ave_all_frame_psnr_u": 43.161894, + "ave_all_frame_psnr_v": 44.735677, + "ave_all_frame_msssim_y": 0.986753, + "ave_all_frame_msssim_u": 0.988013, + "ave_all_frame_msssim_v": 0.990534, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002761, + "ave_i_frame_psnr": 38.789977, + "ave_i_frame_msssim": 0.983452, + "ave_i_frame_psnr_y": 37.348707, + "ave_i_frame_psnr_u": 42.205487, + "ave_i_frame_psnr_v": 44.022083, + "ave_i_frame_msssim_y": 0.982184, + "ave_i_frame_msssim_u": 0.985627, + "ave_i_frame_msssim_v": 0.988881, + "test_time": 11952.672379, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002761, + "ave_all_frame_psnr": 38.789977, + "ave_all_frame_msssim": 0.983452, + "ave_all_frame_psnr_y": 37.348707, + "ave_all_frame_psnr_u": 42.205487, + "ave_all_frame_psnr_v": 44.022083, + "ave_all_frame_msssim_y": 0.982184, + "ave_all_frame_msssim_u": 0.985627, + "ave_all_frame_msssim_v": 0.988881, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001954, + "ave_i_frame_psnr": 37.419643, + "ave_i_frame_msssim": 0.978058, + "ave_i_frame_psnr_y": 35.810661, + "ave_i_frame_psnr_u": 41.214632, + "ave_i_frame_psnr_v": 43.278546, + "ave_i_frame_msssim_y": 0.976004, + "ave_i_frame_msssim_u": 0.981794, + "ave_i_frame_msssim_v": 0.986645, + "test_time": 9337.569979, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001954, + "ave_all_frame_psnr": 37.419643, + "ave_all_frame_msssim": 0.978058, + "ave_all_frame_psnr_y": 35.810661, + "ave_all_frame_psnr_u": 41.214632, + "ave_all_frame_psnr_v": 43.278546, + "ave_all_frame_msssim_y": 0.976004, + "ave_all_frame_msssim_u": 0.981794, + "ave_all_frame_msssim_v": 0.986645, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001369, + "ave_i_frame_psnr": 36.016985, + "ave_i_frame_msssim": 0.970710, + "ave_i_frame_psnr_y": 34.205360, + "ave_i_frame_psnr_u": 40.244539, + "ave_i_frame_psnr_v": 42.659185, + "ave_i_frame_msssim_y": 0.967179, + "ave_i_frame_msssim_u": 0.978052, + "ave_i_frame_msssim_v": 0.984559, + "test_time": 7408.341439, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001369, + "ave_all_frame_psnr": 36.016985, + "ave_all_frame_msssim": 0.970710, + "ave_all_frame_psnr_y": 34.205360, + "ave_all_frame_psnr_u": 40.244539, + "ave_all_frame_psnr_v": 42.659185, + "ave_all_frame_msssim_y": 0.967179, + "ave_all_frame_msssim_u": 0.978052, + "ave_all_frame_msssim_v": 0.984559, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000961, + "ave_i_frame_psnr": 34.481116, + "ave_i_frame_msssim": 0.960553, + "ave_i_frame_psnr_y": 32.625267, + "ave_i_frame_psnr_u": 38.842186, + "ave_i_frame_psnr_v": 41.255135, + "ave_i_frame_msssim_y": 0.955619, + "ave_i_frame_msssim_u": 0.970242, + "ave_i_frame_msssim_v": 0.980469, + "test_time": 5952.486252, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000961, + "ave_all_frame_psnr": 34.481116, + "ave_all_frame_msssim": 0.960553, + "ave_all_frame_psnr_y": 32.625267, + "ave_all_frame_psnr_u": 38.842186, + "ave_all_frame_psnr_v": 41.255135, + "ave_all_frame_msssim_y": 0.955619, + "ave_all_frame_msssim_u": 0.970242, + "ave_all_frame_msssim_v": 0.980469, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000668, + "ave_i_frame_psnr": 33.033272, + "ave_i_frame_msssim": 0.948301, + "ave_i_frame_psnr_y": 31.074706, + "ave_i_frame_psnr_u": 37.740254, + "ave_i_frame_psnr_v": 40.077688, + "ave_i_frame_msssim_y": 0.941161, + "ave_i_frame_msssim_u": 0.963515, + "ave_i_frame_msssim_v": 0.975927, + "test_time": 4379.567741, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000668, + "ave_all_frame_psnr": 33.033272, + "ave_all_frame_msssim": 0.948301, + "ave_all_frame_psnr_y": 31.074706, + "ave_all_frame_psnr_u": 37.740254, + "ave_all_frame_psnr_v": 40.077688, + "ave_all_frame_msssim_y": 0.941161, + "ave_all_frame_msssim_u": 0.963515, + "ave_all_frame_msssim_v": 0.975927, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC28_1920x1080_30.yuv" + } + }, + "videoSRC29_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003445, + "ave_i_frame_psnr": 48.181782, + "ave_i_frame_msssim": 0.995614, + "ave_i_frame_psnr_y": 46.891368, + "ave_i_frame_psnr_u": 52.603863, + "ave_i_frame_psnr_v": 51.502186, + "ave_i_frame_msssim_y": 0.994852, + "ave_i_frame_msssim_u": 0.998166, + "ave_i_frame_msssim_v": 0.997637, + "test_time": 14564.017950, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003445, + "ave_all_frame_psnr": 48.181782, + "ave_all_frame_msssim": 0.995614, + "ave_all_frame_psnr_y": 46.891368, + "ave_all_frame_psnr_u": 52.603863, + "ave_all_frame_psnr_v": 51.502186, + "ave_all_frame_msssim_y": 0.994852, + "ave_all_frame_msssim_u": 0.998166, + "ave_all_frame_msssim_v": 0.997637, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002087, + "ave_i_frame_psnr": 47.504125, + "ave_i_frame_msssim": 0.994494, + "ave_i_frame_psnr_y": 46.230613, + "ave_i_frame_psnr_u": 51.815685, + "ave_i_frame_psnr_v": 50.833638, + "ave_i_frame_msssim_y": 0.993520, + "ave_i_frame_msssim_u": 0.997716, + "ave_i_frame_msssim_v": 0.997117, + "test_time": 10933.391809, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002087, + "ave_all_frame_psnr": 47.504125, + "ave_all_frame_msssim": 0.994494, + "ave_all_frame_psnr_y": 46.230613, + "ave_all_frame_psnr_u": 51.815685, + "ave_all_frame_psnr_v": 50.833638, + "ave_all_frame_msssim_y": 0.993520, + "ave_all_frame_msssim_u": 0.997716, + "ave_all_frame_msssim_v": 0.997117, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001332, + "ave_i_frame_psnr": 46.708101, + "ave_i_frame_msssim": 0.992893, + "ave_i_frame_psnr_y": 45.431351, + "ave_i_frame_psnr_u": 50.912290, + "ave_i_frame_psnr_v": 50.164411, + "ave_i_frame_msssim_y": 0.991573, + "ave_i_frame_msssim_u": 0.997135, + "ave_i_frame_msssim_v": 0.996571, + "test_time": 8172.511451, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001332, + "ave_all_frame_psnr": 46.708101, + "ave_all_frame_msssim": 0.992893, + "ave_all_frame_psnr_y": 45.431351, + "ave_all_frame_psnr_u": 50.912290, + "ave_all_frame_psnr_v": 50.164411, + "ave_all_frame_msssim_y": 0.991573, + "ave_all_frame_msssim_u": 0.997135, + "ave_all_frame_msssim_v": 0.996571, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000869, + "ave_i_frame_psnr": 45.791318, + "ave_i_frame_msssim": 0.990703, + "ave_i_frame_psnr_y": 44.536463, + "ave_i_frame_psnr_u": 49.869161, + "ave_i_frame_psnr_v": 49.242599, + "ave_i_frame_msssim_y": 0.988942, + "ave_i_frame_msssim_u": 0.996336, + "ave_i_frame_msssim_v": 0.995642, + "test_time": 6122.453170, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000869, + "ave_all_frame_psnr": 45.791318, + "ave_all_frame_msssim": 0.990703, + "ave_all_frame_psnr_y": 44.536463, + "ave_all_frame_psnr_u": 49.869161, + "ave_all_frame_psnr_v": 49.242599, + "ave_all_frame_msssim_y": 0.988942, + "ave_all_frame_msssim_u": 0.996336, + "ave_all_frame_msssim_v": 0.995642, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000602, + "ave_i_frame_psnr": 44.733192, + "ave_i_frame_msssim": 0.987611, + "ave_i_frame_psnr_y": 43.512138, + "ave_i_frame_psnr_u": 48.589381, + "ave_i_frame_psnr_v": 48.203325, + "ave_i_frame_msssim_y": 0.985212, + "ave_i_frame_msssim_u": 0.994999, + "ave_i_frame_msssim_v": 0.994618, + "test_time": 4825.659344, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000602, + "ave_all_frame_psnr": 44.733192, + "ave_all_frame_msssim": 0.987611, + "ave_all_frame_psnr_y": 43.512138, + "ave_all_frame_psnr_u": 48.589381, + "ave_all_frame_psnr_v": 48.203325, + "ave_all_frame_msssim_y": 0.985212, + "ave_all_frame_msssim_u": 0.994999, + "ave_all_frame_msssim_v": 0.994618, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000427, + "ave_i_frame_psnr": 43.712567, + "ave_i_frame_msssim": 0.983802, + "ave_i_frame_psnr_y": 42.408692, + "ave_i_frame_psnr_u": 47.665260, + "ave_i_frame_psnr_v": 47.583120, + "ave_i_frame_msssim_y": 0.980425, + "ave_i_frame_msssim_u": 0.994054, + "ave_i_frame_msssim_v": 0.993812, + "test_time": 3861.615205, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000427, + "ave_all_frame_psnr": 43.712567, + "ave_all_frame_msssim": 0.983802, + "ave_all_frame_psnr_y": 42.408692, + "ave_all_frame_psnr_u": 47.665260, + "ave_all_frame_psnr_v": 47.583120, + "ave_all_frame_msssim_y": 0.980425, + "ave_all_frame_msssim_u": 0.994054, + "ave_all_frame_msssim_v": 0.993812, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000308, + "ave_i_frame_psnr": 42.683720, + "ave_i_frame_msssim": 0.979116, + "ave_i_frame_psnr_y": 41.303942, + "ave_i_frame_psnr_u": 47.007889, + "ave_i_frame_psnr_v": 46.638224, + "ave_i_frame_msssim_y": 0.974655, + "ave_i_frame_msssim_u": 0.992639, + "ave_i_frame_msssim_v": 0.992360, + "test_time": 3189.882658, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000308, + "ave_all_frame_psnr": 42.683720, + "ave_all_frame_msssim": 0.979116, + "ave_all_frame_psnr_y": 41.303942, + "ave_all_frame_psnr_u": 47.007889, + "ave_all_frame_psnr_v": 46.638224, + "ave_all_frame_msssim_y": 0.974655, + "ave_all_frame_msssim_u": 0.992639, + "ave_all_frame_msssim_v": 0.992360, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000227, + "ave_i_frame_psnr": 41.615454, + "ave_i_frame_msssim": 0.973227, + "ave_i_frame_psnr_y": 40.089640, + "ave_i_frame_psnr_u": 46.405797, + "ave_i_frame_psnr_v": 45.979997, + "ave_i_frame_msssim_y": 0.967297, + "ave_i_frame_msssim_u": 0.991048, + "ave_i_frame_msssim_v": 0.990982, + "test_time": 2777.711915, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000227, + "ave_all_frame_psnr": 41.615454, + "ave_all_frame_msssim": 0.973227, + "ave_all_frame_psnr_y": 40.089640, + "ave_all_frame_psnr_u": 46.405797, + "ave_all_frame_psnr_v": 45.979997, + "ave_all_frame_msssim_y": 0.967297, + "ave_all_frame_msssim_u": 0.991048, + "ave_all_frame_msssim_v": 0.990982, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000176, + "ave_i_frame_psnr": 40.313562, + "ave_i_frame_msssim": 0.966239, + "ave_i_frame_psnr_y": 38.908468, + "ave_i_frame_psnr_u": 44.486923, + "ave_i_frame_psnr_v": 44.570764, + "ave_i_frame_msssim_y": 0.958803, + "ave_i_frame_msssim_u": 0.988630, + "ave_i_frame_msssim_v": 0.988464, + "test_time": 2595.212722, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000176, + "ave_all_frame_psnr": 40.313562, + "ave_all_frame_msssim": 0.966239, + "ave_all_frame_psnr_y": 38.908468, + "ave_all_frame_psnr_u": 44.486923, + "ave_all_frame_psnr_v": 44.570764, + "ave_all_frame_msssim_y": 0.958803, + "ave_all_frame_msssim_u": 0.988630, + "ave_all_frame_msssim_v": 0.988464, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 120, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000133, + "ave_i_frame_psnr": 38.870428, + "ave_i_frame_msssim": 0.957097, + "ave_i_frame_psnr_y": 37.593330, + "ave_i_frame_psnr_u": 43.141382, + "ave_i_frame_psnr_v": 42.262061, + "ave_i_frame_msssim_y": 0.948056, + "ave_i_frame_msssim_u": 0.984056, + "ave_i_frame_msssim_v": 0.984383, + "test_time": 2338.119594, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000133, + "ave_all_frame_psnr": 38.870428, + "ave_all_frame_msssim": 0.957097, + "ave_all_frame_psnr_y": 37.593330, + "ave_all_frame_psnr_u": 43.141382, + "ave_all_frame_psnr_v": 42.262061, + "ave_all_frame_msssim_y": 0.948056, + "ave_all_frame_msssim_u": 0.984056, + "ave_all_frame_msssim_v": 0.984383, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC29_1920x1080_24.yuv" + } + }, + "videoSRC30_1920x1080_30.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012696, + "ave_i_frame_psnr": 43.212154, + "ave_i_frame_msssim": 0.994088, + "ave_i_frame_psnr_y": 42.418892, + "ave_i_frame_psnr_u": 43.798274, + "ave_i_frame_psnr_v": 47.385602, + "ave_i_frame_msssim_y": 0.993941, + "ave_i_frame_msssim_u": 0.992554, + "ave_i_frame_msssim_v": 0.996508, + "test_time": 34049.879100, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012696, + "ave_all_frame_psnr": 43.212154, + "ave_all_frame_msssim": 0.994088, + "ave_all_frame_psnr_y": 42.418892, + "ave_all_frame_psnr_u": 43.798274, + "ave_all_frame_psnr_v": 47.385602, + "ave_all_frame_msssim_y": 0.993941, + "ave_all_frame_msssim_u": 0.992554, + "ave_all_frame_msssim_v": 0.996508, + "qp": 22, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005939, + "ave_i_frame_psnr": 42.562833, + "ave_i_frame_msssim": 0.992711, + "ave_i_frame_psnr_y": 41.759632, + "ave_i_frame_psnr_u": 43.330371, + "ave_i_frame_psnr_v": 46.614499, + "ave_i_frame_msssim_y": 0.992488, + "ave_i_frame_msssim_u": 0.991156, + "ave_i_frame_msssim_v": 0.995603, + "test_time": 22203.335407, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005939, + "ave_all_frame_psnr": 42.562833, + "ave_all_frame_msssim": 0.992711, + "ave_all_frame_psnr_y": 41.759632, + "ave_all_frame_psnr_u": 43.330371, + "ave_all_frame_psnr_v": 46.614499, + "ave_all_frame_msssim_y": 0.992488, + "ave_all_frame_msssim_u": 0.991156, + "ave_all_frame_msssim_v": 0.995603, + "qp": 25, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003502, + "ave_i_frame_psnr": 41.835928, + "ave_i_frame_msssim": 0.990769, + "ave_i_frame_psnr_y": 41.034278, + "ave_i_frame_psnr_u": 42.765379, + "ave_i_frame_psnr_v": 45.716383, + "ave_i_frame_msssim_y": 0.990471, + "ave_i_frame_msssim_u": 0.989065, + "ave_i_frame_msssim_v": 0.994260, + "test_time": 15784.742998, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003502, + "ave_all_frame_psnr": 41.835928, + "ave_all_frame_msssim": 0.990769, + "ave_all_frame_psnr_y": 41.034278, + "ave_all_frame_psnr_u": 42.765379, + "ave_all_frame_psnr_v": 45.716383, + "ave_all_frame_msssim_y": 0.990471, + "ave_all_frame_msssim_u": 0.989065, + "ave_all_frame_msssim_v": 0.994260, + "qp": 28, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002267, + "ave_i_frame_psnr": 40.991164, + "ave_i_frame_msssim": 0.987990, + "ave_i_frame_psnr_y": 40.172156, + "ave_i_frame_psnr_u": 42.136369, + "ave_i_frame_psnr_v": 44.760005, + "ave_i_frame_msssim_y": 0.987496, + "ave_i_frame_msssim_u": 0.986582, + "ave_i_frame_msssim_v": 0.992361, + "test_time": 11938.487609, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002267, + "ave_all_frame_psnr": 40.991164, + "ave_all_frame_msssim": 0.987990, + "ave_all_frame_psnr_y": 40.172156, + "ave_all_frame_psnr_u": 42.136369, + "ave_all_frame_psnr_v": 44.760005, + "ave_all_frame_msssim_y": 0.987496, + "ave_all_frame_msssim_u": 0.986582, + "ave_all_frame_msssim_v": 0.992361, + "qp": 31, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001565, + "ave_i_frame_psnr": 40.044020, + "ave_i_frame_msssim": 0.984087, + "ave_i_frame_psnr_y": 39.193265, + "ave_i_frame_psnr_u": 41.466936, + "ave_i_frame_psnr_v": 43.725631, + "ave_i_frame_msssim_y": 0.983169, + "ave_i_frame_msssim_u": 0.983697, + "ave_i_frame_msssim_v": 0.989984, + "test_time": 9494.194076, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001565, + "ave_all_frame_psnr": 40.044020, + "ave_all_frame_msssim": 0.984087, + "ave_all_frame_psnr_y": 39.193265, + "ave_all_frame_psnr_u": 41.466936, + "ave_all_frame_psnr_v": 43.725631, + "ave_all_frame_msssim_y": 0.983169, + "ave_all_frame_msssim_u": 0.983697, + "ave_all_frame_msssim_v": 0.989984, + "qp": 34, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001102, + "ave_i_frame_psnr": 38.995185, + "ave_i_frame_msssim": 0.978565, + "ave_i_frame_psnr_y": 38.092158, + "ave_i_frame_psnr_u": 40.863747, + "ave_i_frame_psnr_v": 42.544790, + "ave_i_frame_msssim_y": 0.976992, + "ave_i_frame_msssim_u": 0.980578, + "ave_i_frame_msssim_v": 0.985988, + "test_time": 7554.637034, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001102, + "ave_all_frame_psnr": 38.995185, + "ave_all_frame_msssim": 0.978565, + "ave_all_frame_psnr_y": 38.092158, + "ave_all_frame_psnr_u": 40.863747, + "ave_all_frame_psnr_v": 42.544790, + "ave_all_frame_msssim_y": 0.976992, + "ave_all_frame_msssim_u": 0.980578, + "ave_all_frame_msssim_v": 0.985988, + "qp": 37, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000789, + "ave_i_frame_psnr": 37.959137, + "ave_i_frame_msssim": 0.971990, + "ave_i_frame_psnr_y": 36.954936, + "ave_i_frame_psnr_u": 40.174687, + "ave_i_frame_psnr_v": 41.768798, + "ave_i_frame_msssim_y": 0.969245, + "ave_i_frame_msssim_u": 0.977129, + "ave_i_frame_msssim_v": 0.983324, + "test_time": 5844.954067, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000789, + "ave_all_frame_psnr": 37.959137, + "ave_all_frame_msssim": 0.971990, + "ave_all_frame_psnr_y": 36.954936, + "ave_all_frame_psnr_u": 40.174687, + "ave_all_frame_psnr_v": 41.768798, + "ave_all_frame_msssim_y": 0.969245, + "ave_all_frame_msssim_u": 0.977129, + "ave_all_frame_msssim_v": 0.983324, + "qp": 40, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000567, + "ave_i_frame_psnr": 36.916153, + "ave_i_frame_msssim": 0.963843, + "ave_i_frame_psnr_y": 35.723287, + "ave_i_frame_psnr_u": 39.846528, + "ave_i_frame_psnr_v": 41.142972, + "ave_i_frame_msssim_y": 0.959152, + "ave_i_frame_msssim_u": 0.975109, + "ave_i_frame_msssim_v": 0.980726, + "test_time": 4788.378983, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000567, + "ave_all_frame_psnr": 36.916153, + "ave_all_frame_msssim": 0.963843, + "ave_all_frame_psnr_y": 35.723287, + "ave_all_frame_psnr_u": 39.846528, + "ave_all_frame_psnr_v": 41.142972, + "ave_all_frame_msssim_y": 0.959152, + "ave_all_frame_msssim_u": 0.975109, + "ave_all_frame_msssim_v": 0.980726, + "qp": 43, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000405, + "ave_i_frame_psnr": 35.606739, + "ave_i_frame_msssim": 0.951893, + "ave_i_frame_psnr_y": 34.379890, + "ave_i_frame_psnr_u": 38.645400, + "ave_i_frame_psnr_v": 39.929174, + "ave_i_frame_msssim_y": 0.945299, + "ave_i_frame_msssim_u": 0.967566, + "ave_i_frame_msssim_v": 0.975782, + "test_time": 4152.349759, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000405, + "ave_all_frame_psnr": 35.606739, + "ave_all_frame_msssim": 0.951893, + "ave_all_frame_psnr_y": 34.379890, + "ave_all_frame_psnr_u": 38.645400, + "ave_all_frame_psnr_v": 39.929174, + "ave_all_frame_msssim_y": 0.945299, + "ave_all_frame_msssim_u": 0.967566, + "ave_all_frame_msssim_v": 0.975782, + "qp": 46, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 150, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000291, + "ave_i_frame_psnr": 34.298630, + "ave_i_frame_msssim": 0.938135, + "ave_i_frame_psnr_y": 33.056508, + "ave_i_frame_psnr_u": 37.563562, + "ave_i_frame_psnr_v": 38.486433, + "ave_i_frame_msssim_y": 0.929475, + "ave_i_frame_msssim_u": 0.959322, + "ave_i_frame_msssim_v": 0.968909, + "test_time": 3264.554779, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000291, + "ave_all_frame_psnr": 34.298630, + "ave_all_frame_msssim": 0.938135, + "ave_all_frame_psnr_y": 33.056508, + "ave_all_frame_psnr_u": 37.563562, + "ave_all_frame_psnr_v": 38.486433, + "ave_all_frame_msssim_y": 0.929475, + "ave_all_frame_msssim_u": 0.959322, + "ave_all_frame_msssim_v": 0.968909, + "qp": 49, + "ds_name": "MCL-JCV", + "seq_name": "videoSRC30_1920x1080_30.yuv" + } + } + }, + "HEVC_B": { + "BQTerrace_1920x1080_60.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.285800, + "ave_i_frame_psnr": 39.105063, + "ave_i_frame_msssim": 0.989609, + "ave_i_frame_psnr_y": 37.784362, + "ave_i_frame_psnr_u": 41.938444, + "ave_i_frame_psnr_v": 44.195891, + "ave_i_frame_msssim_y": 0.989235, + "ave_i_frame_msssim_u": 0.989066, + "ave_i_frame_msssim_v": 0.992393, + "test_time": 527563.798756, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.285800, + "ave_all_frame_psnr": 39.105063, + "ave_all_frame_msssim": 0.989609, + "ave_all_frame_psnr_y": 37.784362, + "ave_all_frame_psnr_u": 41.938444, + "ave_all_frame_psnr_v": 44.195891, + "ave_all_frame_msssim_y": 0.989235, + "ave_all_frame_msssim_u": 0.989066, + "ave_all_frame_msssim_v": 0.992393, + "qp": 22, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.060786, + "ave_i_frame_psnr": 37.578083, + "ave_i_frame_msssim": 0.986358, + "ave_i_frame_psnr_y": 35.930072, + "ave_i_frame_psnr_u": 41.316365, + "ave_i_frame_psnr_v": 43.727866, + "ave_i_frame_msssim_y": 0.985536, + "ave_i_frame_msssim_u": 0.986606, + "ave_i_frame_msssim_v": 0.991042, + "test_time": 277231.377609, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.060786, + "ave_all_frame_psnr": 37.578083, + "ave_all_frame_msssim": 0.986358, + "ave_all_frame_psnr_y": 35.930072, + "ave_all_frame_psnr_u": 41.316365, + "ave_all_frame_psnr_v": 43.727866, + "ave_all_frame_msssim_y": 0.985536, + "ave_all_frame_msssim_u": 0.986606, + "ave_all_frame_msssim_v": 0.991042, + "qp": 25, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.023952, + "ave_i_frame_psnr": 36.699769, + "ave_i_frame_msssim": 0.983049, + "ave_i_frame_psnr_y": 34.958679, + "ave_i_frame_psnr_u": 40.660604, + "ave_i_frame_psnr_v": 43.185479, + "ave_i_frame_msssim_y": 0.981986, + "ave_i_frame_msssim_u": 0.983301, + "ave_i_frame_msssim_v": 0.989176, + "test_time": 165333.418104, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.023952, + "ave_all_frame_psnr": 36.699769, + "ave_all_frame_msssim": 0.983049, + "ave_all_frame_psnr_y": 34.958679, + "ave_all_frame_psnr_u": 40.660604, + "ave_all_frame_psnr_v": 43.185479, + "ave_all_frame_msssim_y": 0.981986, + "ave_all_frame_msssim_u": 0.983301, + "ave_all_frame_msssim_v": 0.989176, + "qp": 28, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012110, + "ave_i_frame_psnr": 35.739175, + "ave_i_frame_msssim": 0.978533, + "ave_i_frame_psnr_y": 33.909812, + "ave_i_frame_psnr_u": 39.947353, + "ave_i_frame_psnr_v": 42.507174, + "ave_i_frame_msssim_y": 0.977201, + "ave_i_frame_msssim_u": 0.978757, + "ave_i_frame_msssim_v": 0.986298, + "test_time": 120062.108924, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012110, + "ave_all_frame_psnr": 35.739175, + "ave_all_frame_msssim": 0.978533, + "ave_all_frame_psnr_y": 33.909812, + "ave_all_frame_psnr_u": 39.947353, + "ave_all_frame_psnr_v": 42.507174, + "ave_all_frame_msssim_y": 0.977201, + "ave_all_frame_msssim_u": 0.978757, + "ave_all_frame_msssim_v": 0.986298, + "qp": 31, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007098, + "ave_i_frame_psnr": 34.735979, + "ave_i_frame_msssim": 0.972738, + "ave_i_frame_psnr_y": 32.819273, + "ave_i_frame_psnr_u": 39.104387, + "ave_i_frame_psnr_v": 41.867810, + "ave_i_frame_msssim_y": 0.971118, + "ave_i_frame_msssim_u": 0.972021, + "ave_i_frame_msssim_v": 0.983178, + "test_time": 99280.342564, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007098, + "ave_all_frame_psnr": 34.735979, + "ave_all_frame_msssim": 0.972738, + "ave_all_frame_psnr_y": 32.819273, + "ave_all_frame_psnr_u": 39.104387, + "ave_all_frame_psnr_v": 41.867810, + "ave_all_frame_msssim_y": 0.971118, + "ave_all_frame_msssim_u": 0.972021, + "ave_all_frame_msssim_v": 0.983178, + "qp": 34, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004303, + "ave_i_frame_psnr": 33.640583, + "ave_i_frame_msssim": 0.965290, + "ave_i_frame_psnr_y": 31.632006, + "ave_i_frame_psnr_u": 38.204934, + "ave_i_frame_psnr_v": 41.127699, + "ave_i_frame_msssim_y": 0.962730, + "ave_i_frame_msssim_u": 0.966395, + "ave_i_frame_msssim_v": 0.979543, + "test_time": 79715.584309, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004303, + "ave_all_frame_psnr": 33.640583, + "ave_all_frame_msssim": 0.965290, + "ave_all_frame_psnr_y": 31.632006, + "ave_all_frame_psnr_u": 38.204934, + "ave_all_frame_psnr_v": 41.127699, + "ave_all_frame_msssim_y": 0.962730, + "ave_all_frame_msssim_u": 0.966395, + "ave_all_frame_msssim_v": 0.979543, + "qp": 37, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002653, + "ave_i_frame_psnr": 32.557066, + "ave_i_frame_msssim": 0.955485, + "ave_i_frame_psnr_y": 30.355026, + "ave_i_frame_psnr_u": 37.633457, + "ave_i_frame_psnr_v": 40.692921, + "ave_i_frame_msssim_y": 0.951273, + "ave_i_frame_msssim_u": 0.959785, + "ave_i_frame_msssim_v": 0.976456, + "test_time": 63785.661585, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002653, + "ave_all_frame_psnr": 32.557066, + "ave_all_frame_msssim": 0.955485, + "ave_all_frame_psnr_y": 30.355026, + "ave_all_frame_psnr_u": 37.633457, + "ave_all_frame_psnr_v": 40.692921, + "ave_all_frame_msssim_y": 0.951273, + "ave_all_frame_msssim_u": 0.959785, + "ave_all_frame_msssim_v": 0.976456, + "qp": 40, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001656, + "ave_i_frame_psnr": 31.425647, + "ave_i_frame_msssim": 0.942742, + "ave_i_frame_psnr_y": 29.001316, + "ave_i_frame_psnr_u": 37.218668, + "ave_i_frame_psnr_v": 40.178614, + "ave_i_frame_msssim_y": 0.935697, + "ave_i_frame_msssim_u": 0.954456, + "ave_i_frame_msssim_v": 0.973296, + "test_time": 50009.426445, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001656, + "ave_all_frame_psnr": 31.425647, + "ave_all_frame_msssim": 0.942742, + "ave_all_frame_psnr_y": 29.001316, + "ave_all_frame_psnr_u": 37.218668, + "ave_all_frame_psnr_v": 40.178614, + "ave_all_frame_msssim_y": 0.935697, + "ave_all_frame_msssim_u": 0.954456, + "ave_all_frame_msssim_v": 0.973296, + "qp": 43, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001042, + "ave_i_frame_psnr": 30.221130, + "ave_i_frame_msssim": 0.924305, + "ave_i_frame_psnr_y": 27.596044, + "ave_i_frame_psnr_u": 36.591594, + "ave_i_frame_psnr_v": 39.601178, + "ave_i_frame_msssim_y": 0.913372, + "ave_i_frame_msssim_u": 0.945854, + "ave_i_frame_msssim_v": 0.968351, + "test_time": 40167.858897, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001042, + "ave_all_frame_psnr": 30.221130, + "ave_all_frame_msssim": 0.924305, + "ave_all_frame_psnr_y": 27.596044, + "ave_all_frame_psnr_u": 36.591594, + "ave_all_frame_psnr_v": 39.601178, + "ave_all_frame_msssim_y": 0.913372, + "ave_all_frame_msssim_u": 0.945854, + "ave_all_frame_msssim_v": 0.968351, + "qp": 46, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000674, + "ave_i_frame_psnr": 28.992283, + "ave_i_frame_msssim": 0.900124, + "ave_i_frame_psnr_y": 26.201782, + "ave_i_frame_psnr_u": 35.706314, + "ave_i_frame_psnr_v": 39.021258, + "ave_i_frame_msssim_y": 0.884515, + "ave_i_frame_msssim_u": 0.931162, + "ave_i_frame_msssim_v": 0.962740, + "test_time": 33118.586561, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000674, + "ave_all_frame_psnr": 28.992283, + "ave_all_frame_msssim": 0.900124, + "ave_all_frame_psnr_y": 26.201782, + "ave_all_frame_psnr_u": 35.706314, + "ave_all_frame_psnr_v": 39.021258, + "ave_all_frame_msssim_y": 0.884515, + "ave_all_frame_msssim_u": 0.931162, + "ave_all_frame_msssim_v": 0.962740, + "qp": 49, + "ds_name": "HEVC_B", + "seq_name": "BQTerrace_1920x1080_60.yuv" + } + }, + "BasketballDrive_1920x1080_50.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.135275, + "ave_i_frame_psnr": 40.688221, + "ave_i_frame_msssim": 0.991232, + "ave_i_frame_psnr_y": 39.434589, + "ave_i_frame_psnr_u": 43.791905, + "ave_i_frame_psnr_v": 45.106331, + "ave_i_frame_msssim_y": 0.990331, + "ave_i_frame_msssim_u": 0.992803, + "ave_i_frame_msssim_v": 0.995069, + "test_time": 461585.392666, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.135275, + "ave_all_frame_psnr": 40.688221, + "ave_all_frame_msssim": 0.991232, + "ave_all_frame_psnr_y": 39.434589, + "ave_all_frame_psnr_u": 43.791905, + "ave_all_frame_psnr_v": 45.106331, + "ave_all_frame_msssim_y": 0.990331, + "ave_all_frame_msssim_u": 0.992803, + "ave_all_frame_msssim_v": 0.995069, + "qp": 22, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.066119, + "ave_i_frame_psnr": 39.617369, + "ave_i_frame_msssim": 0.988327, + "ave_i_frame_psnr_y": 38.344042, + "ave_i_frame_psnr_u": 43.024812, + "ave_i_frame_psnr_v": 43.849889, + "ave_i_frame_msssim_y": 0.987110, + "ave_i_frame_msssim_u": 0.990749, + "ave_i_frame_msssim_v": 0.993205, + "test_time": 311988.311746, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.066119, + "ave_all_frame_psnr": 39.617369, + "ave_all_frame_msssim": 0.988327, + "ave_all_frame_psnr_y": 38.344042, + "ave_all_frame_psnr_u": 43.024812, + "ave_all_frame_psnr_v": 43.849889, + "ave_all_frame_msssim_y": 0.987110, + "ave_all_frame_msssim_u": 0.990749, + "ave_all_frame_msssim_v": 0.993205, + "qp": 25, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.038683, + "ave_i_frame_psnr": 38.560272, + "ave_i_frame_msssim": 0.984347, + "ave_i_frame_psnr_y": 37.288700, + "ave_i_frame_psnr_u": 42.187651, + "ave_i_frame_psnr_v": 42.562325, + "ave_i_frame_msssim_y": 0.982689, + "ave_i_frame_msssim_u": 0.988037, + "ave_i_frame_msssim_v": 0.990604, + "test_time": 223751.999995, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.038683, + "ave_all_frame_psnr": 38.560272, + "ave_all_frame_msssim": 0.984347, + "ave_all_frame_psnr_y": 37.288700, + "ave_all_frame_psnr_u": 42.187651, + "ave_all_frame_psnr_v": 42.562325, + "ave_all_frame_msssim_y": 0.982689, + "ave_all_frame_msssim_u": 0.988037, + "ave_all_frame_msssim_v": 0.990604, + "qp": 28, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.023976, + "ave_i_frame_psnr": 37.430623, + "ave_i_frame_msssim": 0.978687, + "ave_i_frame_psnr_y": 36.083907, + "ave_i_frame_psnr_u": 41.435282, + "ave_i_frame_psnr_v": 41.506261, + "ave_i_frame_msssim_y": 0.976137, + "ave_i_frame_msssim_u": 0.984999, + "ave_i_frame_msssim_v": 0.987676, + "test_time": 168887.813599, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.023976, + "ave_all_frame_psnr": 37.430623, + "ave_all_frame_msssim": 0.978687, + "ave_all_frame_psnr_y": 36.083907, + "ave_all_frame_psnr_u": 41.435282, + "ave_all_frame_psnr_v": 41.506261, + "ave_all_frame_msssim_y": 0.976137, + "ave_all_frame_msssim_u": 0.984999, + "ave_all_frame_msssim_v": 0.987676, + "qp": 31, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016151, + "ave_i_frame_psnr": 36.347209, + "ave_i_frame_msssim": 0.971688, + "ave_i_frame_psnr_y": 34.968140, + "ave_i_frame_psnr_u": 40.575672, + "ave_i_frame_psnr_v": 40.393158, + "ave_i_frame_msssim_y": 0.968133, + "ave_i_frame_msssim_u": 0.980929, + "ave_i_frame_msssim_v": 0.983780, + "test_time": 129710.941245, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016151, + "ave_all_frame_psnr": 36.347209, + "ave_all_frame_msssim": 0.971688, + "ave_all_frame_psnr_y": 34.968140, + "ave_all_frame_psnr_u": 40.575672, + "ave_all_frame_psnr_v": 40.393158, + "ave_all_frame_msssim_y": 0.968133, + "ave_all_frame_msssim_u": 0.980929, + "ave_all_frame_msssim_v": 0.983780, + "qp": 34, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.010895, + "ave_i_frame_psnr": 35.229597, + "ave_i_frame_msssim": 0.962664, + "ave_i_frame_psnr_y": 33.759488, + "ave_i_frame_psnr_u": 39.896525, + "ave_i_frame_psnr_v": 39.383318, + "ave_i_frame_msssim_y": 0.957259, + "ave_i_frame_msssim_u": 0.977702, + "ave_i_frame_msssim_v": 0.980059, + "test_time": 110961.344840, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.010895, + "ave_all_frame_psnr": 35.229597, + "ave_all_frame_msssim": 0.962664, + "ave_all_frame_psnr_y": 33.759488, + "ave_all_frame_psnr_u": 39.896525, + "ave_all_frame_psnr_v": 39.383318, + "ave_all_frame_msssim_y": 0.957259, + "ave_all_frame_msssim_u": 0.977702, + "ave_all_frame_msssim_v": 0.980059, + "qp": 37, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007237, + "ave_i_frame_psnr": 34.019510, + "ave_i_frame_msssim": 0.950231, + "ave_i_frame_psnr_y": 32.455138, + "ave_i_frame_psnr_u": 39.142030, + "ave_i_frame_psnr_v": 38.283221, + "ave_i_frame_msssim_y": 0.942332, + "ave_i_frame_msssim_u": 0.973131, + "ave_i_frame_msssim_v": 0.974724, + "test_time": 90868.039006, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007237, + "ave_all_frame_psnr": 34.019510, + "ave_all_frame_msssim": 0.950231, + "ave_all_frame_psnr_y": 32.455138, + "ave_all_frame_psnr_u": 39.142030, + "ave_all_frame_psnr_v": 38.283221, + "ave_all_frame_msssim_y": 0.942332, + "ave_all_frame_msssim_u": 0.973131, + "ave_all_frame_msssim_v": 0.974724, + "qp": 40, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004785, + "ave_i_frame_psnr": 32.757080, + "ave_i_frame_msssim": 0.934276, + "ave_i_frame_psnr_y": 31.100547, + "ave_i_frame_psnr_u": 38.305718, + "ave_i_frame_psnr_v": 37.147644, + "ave_i_frame_msssim_y": 0.923316, + "ave_i_frame_msssim_u": 0.966662, + "ave_i_frame_msssim_v": 0.967650, + "test_time": 69331.701732, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004785, + "ave_all_frame_psnr": 32.757080, + "ave_all_frame_msssim": 0.934276, + "ave_all_frame_psnr_y": 31.100547, + "ave_all_frame_psnr_u": 38.305718, + "ave_all_frame_psnr_v": 37.147644, + "ave_all_frame_msssim_y": 0.923316, + "ave_all_frame_msssim_u": 0.966662, + "ave_all_frame_msssim_v": 0.967650, + "qp": 43, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003125, + "ave_i_frame_psnr": 31.374815, + "ave_i_frame_msssim": 0.912077, + "ave_i_frame_psnr_y": 29.673807, + "ave_i_frame_psnr_u": 37.198585, + "ave_i_frame_psnr_v": 35.757095, + "ave_i_frame_msssim_y": 0.897363, + "ave_i_frame_msssim_u": 0.956490, + "ave_i_frame_msssim_v": 0.955943, + "test_time": 51787.508821, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003125, + "ave_all_frame_psnr": 31.374815, + "ave_all_frame_msssim": 0.912077, + "ave_all_frame_psnr_y": 29.673807, + "ave_all_frame_psnr_u": 37.198585, + "ave_all_frame_psnr_v": 35.757095, + "ave_all_frame_msssim_y": 0.897363, + "ave_all_frame_msssim_u": 0.956490, + "ave_all_frame_msssim_v": 0.955943, + "qp": 46, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002023, + "ave_i_frame_psnr": 29.939274, + "ave_i_frame_msssim": 0.884204, + "ave_i_frame_psnr_y": 28.211490, + "ave_i_frame_psnr_u": 35.995827, + "ave_i_frame_psnr_v": 34.249424, + "ave_i_frame_msssim_y": 0.865245, + "ave_i_frame_msssim_u": 0.943110, + "ave_i_frame_msssim_v": 0.939051, + "test_time": 38490.867930, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002023, + "ave_all_frame_psnr": 29.939274, + "ave_all_frame_msssim": 0.884204, + "ave_all_frame_psnr_y": 28.211490, + "ave_all_frame_psnr_u": 35.995827, + "ave_all_frame_psnr_v": 34.249424, + "ave_all_frame_msssim_y": 0.865245, + "ave_all_frame_msssim_u": 0.943110, + "ave_all_frame_msssim_v": 0.939051, + "qp": 49, + "ds_name": "HEVC_B", + "seq_name": "BasketballDrive_1920x1080_50.yuv" + } + }, + "Cactus_1920x1080_50.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.107342, + "ave_i_frame_psnr": 39.340006, + "ave_i_frame_msssim": 0.989854, + "ave_i_frame_psnr_y": 38.572573, + "ave_i_frame_psnr_u": 39.970201, + "ave_i_frame_psnr_v": 43.314410, + "ave_i_frame_msssim_y": 0.990269, + "ave_i_frame_msssim_u": 0.984681, + "ave_i_frame_msssim_v": 0.992531, + "test_time": 344890.592024, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.107342, + "ave_all_frame_psnr": 39.340006, + "ave_all_frame_msssim": 0.989854, + "ave_all_frame_psnr_y": 38.572573, + "ave_all_frame_psnr_u": 39.970201, + "ave_all_frame_psnr_v": 43.314410, + "ave_all_frame_msssim_y": 0.990269, + "ave_all_frame_msssim_u": 0.984681, + "ave_all_frame_msssim_v": 0.992531, + "qp": 22, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.049678, + "ave_i_frame_psnr": 38.340338, + "ave_i_frame_msssim": 0.986921, + "ave_i_frame_psnr_y": 37.494940, + "ave_i_frame_psnr_u": 39.446252, + "ave_i_frame_psnr_v": 42.306816, + "ave_i_frame_msssim_y": 0.987362, + "ave_i_frame_msssim_u": 0.981375, + "ave_i_frame_msssim_v": 0.989820, + "test_time": 220775.482064, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.049678, + "ave_all_frame_psnr": 38.340338, + "ave_all_frame_msssim": 0.986921, + "ave_all_frame_psnr_y": 37.494940, + "ave_all_frame_psnr_u": 39.446252, + "ave_all_frame_psnr_v": 42.306816, + "ave_all_frame_msssim_y": 0.987362, + "ave_all_frame_msssim_u": 0.981375, + "ave_all_frame_msssim_v": 0.989820, + "qp": 25, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.028787, + "ave_i_frame_psnr": 37.298711, + "ave_i_frame_msssim": 0.982726, + "ave_i_frame_psnr_y": 36.368384, + "ave_i_frame_psnr_u": 38.937754, + "ave_i_frame_psnr_v": 41.241629, + "ave_i_frame_msssim_y": 0.982998, + "ave_i_frame_msssim_u": 0.977670, + "ave_i_frame_msssim_v": 0.986156, + "test_time": 162081.470255, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.028787, + "ave_all_frame_psnr": 37.298711, + "ave_all_frame_msssim": 0.982726, + "ave_all_frame_psnr_y": 36.368384, + "ave_all_frame_psnr_u": 38.937754, + "ave_all_frame_psnr_v": 41.241629, + "ave_all_frame_msssim_y": 0.982998, + "ave_all_frame_msssim_u": 0.977670, + "ave_all_frame_msssim_v": 0.986156, + "qp": 28, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.017584, + "ave_i_frame_psnr": 36.161116, + "ave_i_frame_msssim": 0.976632, + "ave_i_frame_psnr_y": 35.109999, + "ave_i_frame_psnr_u": 38.399112, + "ave_i_frame_psnr_v": 40.229828, + "ave_i_frame_msssim_y": 0.976331, + "ave_i_frame_msssim_u": 0.973212, + "ave_i_frame_msssim_v": 0.981858, + "test_time": 128051.668201, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.017584, + "ave_all_frame_psnr": 36.161116, + "ave_all_frame_msssim": 0.976632, + "ave_all_frame_psnr_y": 35.109999, + "ave_all_frame_psnr_u": 38.399112, + "ave_all_frame_psnr_v": 40.229828, + "ave_all_frame_msssim_y": 0.976331, + "ave_all_frame_msssim_u": 0.973212, + "ave_all_frame_msssim_v": 0.981858, + "qp": 31, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.011568, + "ave_i_frame_psnr": 35.009877, + "ave_i_frame_msssim": 0.968378, + "ave_i_frame_psnr_y": 33.865588, + "ave_i_frame_psnr_u": 37.764355, + "ave_i_frame_psnr_v": 39.121128, + "ave_i_frame_msssim_y": 0.967313, + "ave_i_frame_msssim_u": 0.967222, + "ave_i_frame_msssim_v": 0.975919, + "test_time": 108083.284448, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.011568, + "ave_all_frame_psnr": 35.009877, + "ave_all_frame_msssim": 0.968378, + "ave_all_frame_psnr_y": 33.865588, + "ave_all_frame_psnr_u": 37.764355, + "ave_all_frame_psnr_v": 39.121128, + "ave_all_frame_msssim_y": 0.967313, + "ave_all_frame_msssim_u": 0.967222, + "ave_all_frame_msssim_v": 0.975919, + "qp": 34, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007612, + "ave_i_frame_psnr": 33.802251, + "ave_i_frame_msssim": 0.956755, + "ave_i_frame_psnr_y": 32.535993, + "ave_i_frame_psnr_u": 37.000190, + "ave_i_frame_psnr_v": 38.201857, + "ave_i_frame_msssim_y": 0.953852, + "ave_i_frame_msssim_u": 0.960012, + "ave_i_frame_msssim_v": 0.970916, + "test_time": 90403.432687, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007612, + "ave_all_frame_psnr": 33.802251, + "ave_all_frame_msssim": 0.956755, + "ave_all_frame_psnr_y": 32.535993, + "ave_all_frame_psnr_u": 37.000190, + "ave_all_frame_psnr_v": 38.201857, + "ave_all_frame_msssim_y": 0.953852, + "ave_all_frame_msssim_u": 0.960012, + "ave_all_frame_msssim_v": 0.970916, + "qp": 37, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004956, + "ave_i_frame_psnr": 32.596839, + "ave_i_frame_msssim": 0.941105, + "ave_i_frame_psnr_y": 31.183366, + "ave_i_frame_psnr_u": 36.382240, + "ave_i_frame_psnr_v": 37.292272, + "ave_i_frame_msssim_y": 0.935460, + "ave_i_frame_msssim_u": 0.952101, + "ave_i_frame_msssim_v": 0.963979, + "test_time": 70908.847060, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004956, + "ave_all_frame_psnr": 32.596839, + "ave_all_frame_msssim": 0.941105, + "ave_all_frame_psnr_y": 31.183366, + "ave_all_frame_psnr_u": 36.382240, + "ave_all_frame_psnr_v": 37.292272, + "ave_all_frame_msssim_y": 0.935460, + "ave_all_frame_msssim_u": 0.952101, + "ave_all_frame_msssim_v": 0.963979, + "qp": 40, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003221, + "ave_i_frame_psnr": 31.392601, + "ave_i_frame_msssim": 0.920884, + "ave_i_frame_psnr_y": 29.795968, + "ave_i_frame_psnr_u": 35.871253, + "ave_i_frame_psnr_v": 36.493749, + "ave_i_frame_msssim_y": 0.911041, + "ave_i_frame_msssim_u": 0.944612, + "ave_i_frame_msssim_v": 0.956210, + "test_time": 54457.272378, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003221, + "ave_all_frame_psnr": 31.392601, + "ave_all_frame_msssim": 0.920884, + "ave_all_frame_psnr_y": 29.795968, + "ave_all_frame_psnr_u": 35.871253, + "ave_all_frame_psnr_v": 36.493749, + "ave_all_frame_msssim_y": 0.911041, + "ave_all_frame_msssim_u": 0.944612, + "ave_all_frame_msssim_v": 0.956210, + "qp": 43, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002065, + "ave_i_frame_psnr": 30.050242, + "ave_i_frame_msssim": 0.893554, + "ave_i_frame_psnr_y": 28.364430, + "ave_i_frame_psnr_u": 35.020549, + "ave_i_frame_psnr_v": 35.194811, + "ave_i_frame_msssim_y": 0.879233, + "ave_i_frame_msssim_u": 0.931428, + "ave_i_frame_msssim_v": 0.941604, + "test_time": 41664.537653, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002065, + "ave_all_frame_psnr": 30.050242, + "ave_all_frame_msssim": 0.893554, + "ave_all_frame_psnr_y": 28.364430, + "ave_all_frame_psnr_u": 35.020549, + "ave_all_frame_psnr_v": 35.194811, + "ave_all_frame_msssim_y": 0.879233, + "ave_all_frame_msssim_u": 0.931428, + "ave_all_frame_msssim_v": 0.941604, + "qp": 46, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001329, + "ave_i_frame_psnr": 28.676159, + "ave_i_frame_msssim": 0.856625, + "ave_i_frame_psnr_y": 26.918576, + "ave_i_frame_psnr_u": 34.063936, + "ave_i_frame_psnr_v": 33.833879, + "ave_i_frame_msssim_y": 0.836243, + "ave_i_frame_msssim_u": 0.913822, + "ave_i_frame_msssim_v": 0.921716, + "test_time": 32481.527578, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001329, + "ave_all_frame_psnr": 28.676159, + "ave_all_frame_msssim": 0.856625, + "ave_all_frame_psnr_y": 26.918576, + "ave_all_frame_psnr_u": 34.063936, + "ave_all_frame_psnr_v": 33.833879, + "ave_all_frame_msssim_y": 0.836243, + "ave_all_frame_msssim_u": 0.913822, + "ave_all_frame_msssim_v": 0.921716, + "qp": 49, + "ds_name": "HEVC_B", + "seq_name": "Cactus_1920x1080_50.yuv" + } + }, + "Kimono1_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.078177, + "ave_i_frame_psnr": 42.331098, + "ave_i_frame_msssim": 0.991768, + "ave_i_frame_psnr_y": 41.713020, + "ave_i_frame_psnr_u": 43.275274, + "ave_i_frame_psnr_v": 45.095396, + "ave_i_frame_msssim_y": 0.992453, + "ave_i_frame_msssim_u": 0.988245, + "ave_i_frame_msssim_v": 0.991177, + "test_time": 157158.116172, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.078177, + "ave_all_frame_psnr": 42.331098, + "ave_all_frame_msssim": 0.991768, + "ave_all_frame_psnr_y": 41.713020, + "ave_all_frame_psnr_u": 43.275274, + "ave_all_frame_psnr_v": 45.095396, + "ave_all_frame_msssim_y": 0.992453, + "ave_all_frame_msssim_u": 0.988245, + "ave_all_frame_msssim_v": 0.991177, + "qp": 22, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.048485, + "ave_i_frame_psnr": 41.220754, + "ave_i_frame_msssim": 0.988544, + "ave_i_frame_psnr_y": 40.566123, + "ave_i_frame_psnr_u": 42.328724, + "ave_i_frame_psnr_v": 44.040573, + "ave_i_frame_msssim_y": 0.989426, + "ave_i_frame_msssim_u": 0.983937, + "ave_i_frame_msssim_v": 0.987863, + "test_time": 122287.951528, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.048485, + "ave_all_frame_psnr": 41.220754, + "ave_all_frame_msssim": 0.988544, + "ave_all_frame_psnr_y": 40.566123, + "ave_all_frame_psnr_u": 42.328724, + "ave_all_frame_psnr_v": 44.040573, + "ave_all_frame_msssim_y": 0.989426, + "ave_all_frame_msssim_u": 0.983937, + "ave_all_frame_msssim_v": 0.987863, + "qp": 25, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.030357, + "ave_i_frame_psnr": 39.902500, + "ave_i_frame_msssim": 0.983397, + "ave_i_frame_psnr_y": 39.126911, + "ave_i_frame_psnr_u": 41.408681, + "ave_i_frame_psnr_v": 43.049854, + "ave_i_frame_msssim_y": 0.984096, + "ave_i_frame_msssim_u": 0.978618, + "ave_i_frame_msssim_v": 0.983982, + "test_time": 102893.929726, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.030357, + "ave_all_frame_psnr": 39.902500, + "ave_all_frame_msssim": 0.983397, + "ave_all_frame_psnr_y": 39.126911, + "ave_all_frame_psnr_u": 41.408681, + "ave_all_frame_psnr_v": 43.049854, + "ave_all_frame_msssim_y": 0.984096, + "ave_all_frame_msssim_u": 0.978618, + "ave_all_frame_msssim_v": 0.983982, + "qp": 28, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.019047, + "ave_i_frame_psnr": 38.467328, + "ave_i_frame_msssim": 0.975642, + "ave_i_frame_psnr_y": 37.478533, + "ave_i_frame_psnr_u": 40.642648, + "ave_i_frame_psnr_v": 42.224776, + "ave_i_frame_msssim_y": 0.975260, + "ave_i_frame_msssim_u": 0.973321, + "ave_i_frame_msssim_v": 0.980253, + "test_time": 81065.107711, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.019047, + "ave_all_frame_psnr": 38.467328, + "ave_all_frame_msssim": 0.975642, + "ave_all_frame_psnr_y": 37.478533, + "ave_all_frame_psnr_u": 40.642648, + "ave_all_frame_psnr_v": 42.224776, + "ave_all_frame_msssim_y": 0.975260, + "ave_all_frame_msssim_u": 0.973321, + "ave_all_frame_msssim_v": 0.980253, + "qp": 31, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.012643, + "ave_i_frame_psnr": 37.159446, + "ave_i_frame_msssim": 0.965771, + "ave_i_frame_psnr_y": 35.999810, + "ave_i_frame_psnr_u": 39.833914, + "ave_i_frame_psnr_v": 41.442797, + "ave_i_frame_msssim_y": 0.963943, + "ave_i_frame_msssim_u": 0.966451, + "ave_i_frame_msssim_v": 0.976064, + "test_time": 61996.893653, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.012643, + "ave_all_frame_psnr": 37.159446, + "ave_all_frame_msssim": 0.965771, + "ave_all_frame_psnr_y": 35.999810, + "ave_all_frame_psnr_u": 39.833914, + "ave_all_frame_psnr_v": 41.442797, + "ave_all_frame_msssim_y": 0.963943, + "ave_all_frame_msssim_u": 0.966451, + "ave_all_frame_msssim_v": 0.976064, + "qp": 34, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008270, + "ave_i_frame_psnr": 35.795823, + "ave_i_frame_msssim": 0.951971, + "ave_i_frame_psnr_y": 34.464165, + "ave_i_frame_psnr_u": 39.178918, + "ave_i_frame_psnr_v": 40.402674, + "ave_i_frame_msssim_y": 0.947638, + "ave_i_frame_msssim_u": 0.960366, + "ave_i_frame_msssim_v": 0.969577, + "test_time": 47074.912929, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008270, + "ave_all_frame_psnr": 35.795823, + "ave_all_frame_msssim": 0.951971, + "ave_all_frame_psnr_y": 34.464165, + "ave_all_frame_psnr_u": 39.178918, + "ave_all_frame_psnr_v": 40.402674, + "ave_all_frame_msssim_y": 0.947638, + "ave_all_frame_msssim_u": 0.960366, + "ave_all_frame_msssim_v": 0.969577, + "qp": 37, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005306, + "ave_i_frame_psnr": 34.527352, + "ave_i_frame_msssim": 0.934223, + "ave_i_frame_psnr_y": 32.947686, + "ave_i_frame_psnr_u": 38.543988, + "ave_i_frame_psnr_v": 39.988712, + "ave_i_frame_msssim_y": 0.925702, + "ave_i_frame_msssim_u": 0.953211, + "ave_i_frame_msssim_v": 0.966363, + "test_time": 34941.357389, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005306, + "ave_all_frame_psnr": 34.527352, + "ave_all_frame_msssim": 0.934223, + "ave_all_frame_psnr_y": 32.947686, + "ave_all_frame_psnr_u": 38.543988, + "ave_all_frame_psnr_v": 39.988712, + "ave_all_frame_msssim_y": 0.925702, + "ave_all_frame_msssim_u": 0.953211, + "ave_all_frame_msssim_v": 0.966363, + "qp": 40, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003345, + "ave_i_frame_psnr": 33.288460, + "ave_i_frame_msssim": 0.911780, + "ave_i_frame_psnr_y": 31.464566, + "ave_i_frame_psnr_u": 37.978162, + "ave_i_frame_psnr_v": 39.542118, + "ave_i_frame_msssim_y": 0.897516, + "ave_i_frame_msssim_u": 0.946435, + "ave_i_frame_msssim_v": 0.962714, + "test_time": 26258.423957, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003345, + "ave_all_frame_psnr": 33.288460, + "ave_all_frame_msssim": 0.911780, + "ave_all_frame_psnr_y": 31.464566, + "ave_all_frame_psnr_u": 37.978162, + "ave_all_frame_psnr_v": 39.542118, + "ave_all_frame_msssim_y": 0.897516, + "ave_all_frame_msssim_u": 0.946435, + "ave_all_frame_msssim_v": 0.962714, + "qp": 43, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002068, + "ave_i_frame_psnr": 32.039458, + "ave_i_frame_msssim": 0.883632, + "ave_i_frame_psnr_y": 30.050988, + "ave_i_frame_psnr_u": 37.180076, + "ave_i_frame_psnr_v": 38.829662, + "ave_i_frame_msssim_y": 0.862601, + "ave_i_frame_msssim_u": 0.936176, + "ave_i_frame_msssim_v": 0.957275, + "test_time": 19468.246550, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002068, + "ave_all_frame_psnr": 32.039458, + "ave_all_frame_msssim": 0.883632, + "ave_all_frame_psnr_y": 30.050988, + "ave_all_frame_psnr_u": 37.180076, + "ave_all_frame_psnr_v": 38.829662, + "ave_all_frame_msssim_y": 0.862601, + "ave_all_frame_msssim_u": 0.936176, + "ave_all_frame_msssim_v": 0.957275, + "qp": 46, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001249, + "ave_i_frame_psnr": 30.851346, + "ave_i_frame_msssim": 0.851428, + "ave_i_frame_psnr_y": 28.724813, + "ave_i_frame_psnr_u": 36.296465, + "ave_i_frame_psnr_v": 38.165424, + "ave_i_frame_msssim_y": 0.822595, + "ave_i_frame_msssim_u": 0.923796, + "ave_i_frame_msssim_v": 0.952059, + "test_time": 14069.280591, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001249, + "ave_all_frame_psnr": 30.851346, + "ave_all_frame_msssim": 0.851428, + "ave_all_frame_psnr_y": 28.724813, + "ave_all_frame_psnr_u": 36.296465, + "ave_all_frame_psnr_v": 38.165424, + "ave_all_frame_msssim_y": 0.822595, + "ave_all_frame_msssim_u": 0.923796, + "ave_all_frame_msssim_v": 0.952059, + "qp": 49, + "ds_name": "HEVC_B", + "seq_name": "Kimono1_1920x1080_24.yuv" + } + }, + "ParkScene_1920x1080_24.yuv": { + "022": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.118100, + "ave_i_frame_psnr": 40.469166, + "ave_i_frame_msssim": 0.990954, + "ave_i_frame_psnr_y": 39.747635, + "ave_i_frame_psnr_u": 41.746605, + "ave_i_frame_psnr_v": 43.520913, + "ave_i_frame_msssim_y": 0.991663, + "ave_i_frame_msssim_u": 0.987830, + "ave_i_frame_msssim_v": 0.989829, + "test_time": 134865.136006, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.118100, + "ave_all_frame_psnr": 40.469166, + "ave_all_frame_msssim": 0.990954, + "ave_all_frame_psnr_y": 39.747635, + "ave_all_frame_psnr_u": 41.746605, + "ave_all_frame_psnr_v": 43.520913, + "ave_all_frame_msssim_y": 0.991663, + "ave_all_frame_msssim_u": 0.987830, + "ave_all_frame_msssim_v": 0.989829, + "qp": 22, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "025": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.066291, + "ave_i_frame_psnr": 38.857342, + "ave_i_frame_msssim": 0.986589, + "ave_i_frame_psnr_y": 37.984546, + "ave_i_frame_psnr_u": 40.566507, + "ave_i_frame_psnr_v": 42.384955, + "ave_i_frame_msssim_y": 0.987337, + "ave_i_frame_msssim_u": 0.983155, + "ave_i_frame_msssim_v": 0.985536, + "test_time": 112428.263097, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.066291, + "ave_all_frame_psnr": 38.857342, + "ave_all_frame_msssim": 0.986589, + "ave_all_frame_psnr_y": 37.984546, + "ave_all_frame_psnr_u": 40.566507, + "ave_all_frame_psnr_v": 42.384955, + "ave_all_frame_msssim_y": 0.987337, + "ave_all_frame_msssim_u": 0.983155, + "ave_all_frame_msssim_v": 0.985536, + "qp": 25, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "028": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.038231, + "ave_i_frame_psnr": 37.290791, + "ave_i_frame_msssim": 0.980186, + "ave_i_frame_psnr_y": 36.249273, + "ave_i_frame_psnr_u": 39.451255, + "ave_i_frame_psnr_v": 41.379431, + "ave_i_frame_msssim_y": 0.980674, + "ave_i_frame_msssim_u": 0.976887, + "ave_i_frame_msssim_v": 0.980554, + "test_time": 90655.809546, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.038231, + "ave_all_frame_psnr": 37.290791, + "ave_all_frame_msssim": 0.980186, + "ave_all_frame_psnr_y": 36.249273, + "ave_all_frame_psnr_u": 39.451255, + "ave_all_frame_psnr_v": 41.379431, + "ave_all_frame_msssim_y": 0.980674, + "ave_all_frame_msssim_u": 0.976887, + "ave_all_frame_msssim_v": 0.980554, + "qp": 28, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "031": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022358, + "ave_i_frame_psnr": 35.812038, + "ave_i_frame_msssim": 0.971210, + "ave_i_frame_psnr_y": 34.581247, + "ave_i_frame_psnr_u": 38.454921, + "ave_i_frame_psnr_v": 40.553907, + "ave_i_frame_msssim_y": 0.970846, + "ave_i_frame_msssim_u": 0.969131, + "ave_i_frame_msssim_v": 0.975476, + "test_time": 69109.798470, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022358, + "ave_all_frame_psnr": 35.812038, + "ave_all_frame_msssim": 0.971210, + "ave_all_frame_psnr_y": 34.581247, + "ave_all_frame_psnr_u": 38.454921, + "ave_all_frame_psnr_v": 40.553907, + "ave_all_frame_msssim_y": 0.970846, + "ave_all_frame_msssim_u": 0.969131, + "ave_all_frame_msssim_v": 0.975476, + "qp": 31, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "034": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013772, + "ave_i_frame_psnr": 34.482363, + "ave_i_frame_msssim": 0.959329, + "ave_i_frame_psnr_y": 33.098852, + "ave_i_frame_psnr_u": 37.492985, + "ave_i_frame_psnr_v": 39.772802, + "ave_i_frame_msssim_y": 0.957631, + "ave_i_frame_msssim_u": 0.958984, + "ave_i_frame_msssim_v": 0.969862, + "test_time": 53240.093564, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013772, + "ave_all_frame_psnr": 34.482363, + "ave_all_frame_msssim": 0.959329, + "ave_all_frame_psnr_y": 33.098852, + "ave_all_frame_psnr_u": 37.492985, + "ave_all_frame_psnr_v": 39.772802, + "ave_all_frame_msssim_y": 0.957631, + "ave_all_frame_msssim_u": 0.958984, + "ave_all_frame_msssim_v": 0.969862, + "qp": 34, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "037": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008372, + "ave_i_frame_psnr": 33.141898, + "ave_i_frame_msssim": 0.943084, + "ave_i_frame_psnr_y": 31.642312, + "ave_i_frame_psnr_u": 36.834375, + "ave_i_frame_psnr_v": 38.446935, + "ave_i_frame_msssim_y": 0.938501, + "ave_i_frame_msssim_u": 0.952038, + "ave_i_frame_msssim_v": 0.961629, + "test_time": 41343.586527, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008372, + "ave_all_frame_psnr": 33.141898, + "ave_all_frame_msssim": 0.943084, + "ave_all_frame_psnr_y": 31.642312, + "ave_all_frame_psnr_u": 36.834375, + "ave_all_frame_psnr_v": 38.446935, + "ave_all_frame_msssim_y": 0.938501, + "ave_all_frame_msssim_u": 0.952038, + "ave_all_frame_msssim_v": 0.961629, + "qp": 37, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "040": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005020, + "ave_i_frame_psnr": 31.981517, + "ave_i_frame_msssim": 0.921714, + "ave_i_frame_psnr_y": 30.259064, + "ave_i_frame_psnr_u": 36.240430, + "ave_i_frame_psnr_v": 38.057319, + "ave_i_frame_msssim_y": 0.912235, + "ave_i_frame_msssim_u": 0.942711, + "ave_i_frame_msssim_v": 0.957591, + "test_time": 32012.827418, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005020, + "ave_all_frame_psnr": 31.981517, + "ave_all_frame_msssim": 0.921714, + "ave_all_frame_psnr_y": 30.259064, + "ave_all_frame_psnr_u": 36.240430, + "ave_all_frame_psnr_v": 38.057319, + "ave_all_frame_msssim_y": 0.912235, + "ave_all_frame_msssim_u": 0.942711, + "ave_all_frame_msssim_v": 0.957591, + "qp": 40, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "043": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002958, + "ave_i_frame_psnr": 30.889225, + "ave_i_frame_msssim": 0.893853, + "ave_i_frame_psnr_y": 28.938423, + "ave_i_frame_psnr_u": 35.710159, + "ave_i_frame_psnr_v": 37.773102, + "ave_i_frame_msssim_y": 0.877240, + "ave_i_frame_msssim_u": 0.933398, + "ave_i_frame_msssim_v": 0.953986, + "test_time": 25433.944611, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002958, + "ave_all_frame_psnr": 30.889225, + "ave_all_frame_msssim": 0.893853, + "ave_all_frame_psnr_y": 28.938423, + "ave_all_frame_psnr_u": 35.710159, + "ave_all_frame_psnr_v": 37.773102, + "ave_all_frame_msssim_y": 0.877240, + "ave_all_frame_msssim_u": 0.933398, + "ave_all_frame_msssim_v": 0.953986, + "qp": 43, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "046": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001715, + "ave_i_frame_psnr": 29.813171, + "ave_i_frame_msssim": 0.857921, + "ave_i_frame_psnr_y": 27.706036, + "ave_i_frame_psnr_u": 35.020480, + "ave_i_frame_psnr_v": 37.248671, + "ave_i_frame_msssim_y": 0.832864, + "ave_i_frame_msssim_u": 0.918774, + "ave_i_frame_msssim_v": 0.947409, + "test_time": 19274.153854, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001715, + "ave_all_frame_psnr": 29.813171, + "ave_all_frame_msssim": 0.857921, + "ave_all_frame_psnr_y": 27.706036, + "ave_all_frame_psnr_u": 35.020480, + "ave_all_frame_psnr_v": 37.248671, + "ave_all_frame_msssim_y": 0.832864, + "ave_all_frame_msssim_u": 0.918774, + "ave_all_frame_msssim_v": 0.947409, + "qp": 46, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + }, + "049": { + "frame_pixel_num": 2073600, + "i_frame_num": 240, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001005, + "ave_i_frame_psnr": 28.817181, + "ave_i_frame_msssim": 0.817773, + "ave_i_frame_psnr_y": 26.590940, + "ave_i_frame_psnr_u": 34.260478, + "ave_i_frame_psnr_v": 36.731330, + "ave_i_frame_msssim_y": 0.783462, + "ave_i_frame_msssim_u": 0.900985, + "ave_i_frame_msssim_v": 0.940427, + "test_time": 14370.919342, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001005, + "ave_all_frame_psnr": 28.817181, + "ave_all_frame_msssim": 0.817773, + "ave_all_frame_psnr_y": 26.590940, + "ave_all_frame_psnr_u": 34.260478, + "ave_all_frame_psnr_v": 36.731330, + "ave_all_frame_msssim_y": 0.783462, + "ave_all_frame_msssim_u": 0.900985, + "ave_all_frame_msssim_v": 0.940427, + "qp": 49, + "ds_name": "HEVC_B", + "seq_name": "ParkScene_1920x1080_24.yuv" + } + } + }, + "HEVC_E": { + "FourPeople_1280x720_60.yuv": { + "022": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.026730, + "ave_i_frame_psnr": 43.797679, + "ave_i_frame_msssim": 0.995433, + "ave_i_frame_psnr_y": 42.696640, + "ave_i_frame_psnr_u": 46.491752, + "ave_i_frame_psnr_v": 47.709840, + "ave_i_frame_msssim_y": 0.995547, + "ave_i_frame_msssim_u": 0.994441, + "ave_i_frame_msssim_v": 0.995747, + "test_time": 76399.278210, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.026730, + "ave_all_frame_psnr": 43.797679, + "ave_all_frame_msssim": 0.995433, + "ave_all_frame_psnr_y": 42.696640, + "ave_all_frame_psnr_u": 46.491752, + "ave_all_frame_psnr_v": 47.709840, + "ave_all_frame_msssim_y": 0.995547, + "ave_all_frame_msssim_u": 0.994441, + "ave_all_frame_msssim_v": 0.995747, + "qp": 22, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "025": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014927, + "ave_i_frame_psnr": 42.615446, + "ave_i_frame_msssim": 0.994200, + "ave_i_frame_psnr_y": 41.435897, + "ave_i_frame_psnr_u": 45.603935, + "ave_i_frame_psnr_v": 46.704251, + "ave_i_frame_msssim_y": 0.994428, + "ave_i_frame_msssim_u": 0.992759, + "ave_i_frame_msssim_v": 0.994272, + "test_time": 59579.643680, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014927, + "ave_all_frame_psnr": 42.615446, + "ave_all_frame_msssim": 0.994200, + "ave_all_frame_psnr_y": 41.435897, + "ave_all_frame_psnr_u": 45.603935, + "ave_all_frame_psnr_v": 46.704251, + "ave_all_frame_msssim_y": 0.994428, + "ave_all_frame_msssim_u": 0.992759, + "ave_all_frame_msssim_v": 0.994272, + "qp": 25, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "028": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009339, + "ave_i_frame_psnr": 41.322970, + "ave_i_frame_msssim": 0.992365, + "ave_i_frame_psnr_y": 40.065312, + "ave_i_frame_psnr_u": 44.612460, + "ave_i_frame_psnr_v": 45.579427, + "ave_i_frame_msssim_y": 0.992736, + "ave_i_frame_msssim_u": 0.990373, + "ave_i_frame_msssim_v": 0.992131, + "test_time": 45279.861127, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009339, + "ave_all_frame_psnr": 41.322970, + "ave_all_frame_msssim": 0.992365, + "ave_all_frame_psnr_y": 40.065312, + "ave_all_frame_psnr_u": 44.612460, + "ave_all_frame_psnr_v": 45.579427, + "ave_all_frame_msssim_y": 0.992736, + "ave_all_frame_msssim_u": 0.990373, + "ave_all_frame_msssim_v": 0.992131, + "qp": 28, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "031": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006109, + "ave_i_frame_psnr": 39.888841, + "ave_i_frame_msssim": 0.989609, + "ave_i_frame_psnr_y": 38.538427, + "ave_i_frame_psnr_u": 43.496163, + "ave_i_frame_psnr_v": 44.384006, + "ave_i_frame_msssim_y": 0.990154, + "ave_i_frame_msssim_u": 0.986932, + "ave_i_frame_msssim_v": 0.989016, + "test_time": 35436.041821, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006109, + "ave_all_frame_psnr": 39.888841, + "ave_all_frame_msssim": 0.989609, + "ave_all_frame_psnr_y": 38.538427, + "ave_all_frame_psnr_u": 43.496163, + "ave_all_frame_psnr_v": 44.384006, + "ave_all_frame_msssim_y": 0.990154, + "ave_all_frame_msssim_u": 0.986932, + "ave_all_frame_msssim_v": 0.989016, + "qp": 31, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "034": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004215, + "ave_i_frame_psnr": 38.427862, + "ave_i_frame_msssim": 0.985696, + "ave_i_frame_psnr_y": 36.976272, + "ave_i_frame_psnr_u": 42.422419, + "ave_i_frame_psnr_v": 43.142847, + "ave_i_frame_msssim_y": 0.986384, + "ave_i_frame_msssim_u": 0.982528, + "ave_i_frame_msssim_v": 0.984732, + "test_time": 29008.829978, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004215, + "ave_all_frame_psnr": 38.427862, + "ave_all_frame_msssim": 0.985696, + "ave_all_frame_psnr_y": 36.976272, + "ave_all_frame_psnr_u": 42.422419, + "ave_all_frame_psnr_v": 43.142847, + "ave_all_frame_msssim_y": 0.986384, + "ave_all_frame_msssim_u": 0.982528, + "ave_all_frame_msssim_v": 0.984732, + "qp": 34, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "037": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002934, + "ave_i_frame_psnr": 36.920541, + "ave_i_frame_msssim": 0.980194, + "ave_i_frame_psnr_y": 35.287365, + "ave_i_frame_psnr_u": 41.242294, + "ave_i_frame_psnr_v": 42.397842, + "ave_i_frame_msssim_y": 0.980442, + "ave_i_frame_msssim_u": 0.977107, + "ave_i_frame_msssim_v": 0.981791, + "test_time": 23819.080202, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002934, + "ave_all_frame_psnr": 36.920541, + "ave_all_frame_msssim": 0.980194, + "ave_all_frame_psnr_y": 35.287365, + "ave_all_frame_psnr_u": 41.242294, + "ave_all_frame_psnr_v": 42.397842, + "ave_all_frame_msssim_y": 0.980442, + "ave_all_frame_msssim_u": 0.977107, + "ave_all_frame_msssim_v": 0.981791, + "qp": 37, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "040": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002020, + "ave_i_frame_psnr": 35.380431, + "ave_i_frame_msssim": 0.971980, + "ave_i_frame_psnr_y": 33.521149, + "ave_i_frame_psnr_u": 40.493620, + "ave_i_frame_psnr_v": 41.422935, + "ave_i_frame_msssim_y": 0.971104, + "ave_i_frame_msssim_u": 0.972271, + "ave_i_frame_msssim_v": 0.976946, + "test_time": 19539.853987, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002020, + "ave_all_frame_psnr": 35.380431, + "ave_all_frame_msssim": 0.971980, + "ave_all_frame_psnr_y": 33.521149, + "ave_all_frame_psnr_u": 40.493620, + "ave_all_frame_psnr_v": 41.422935, + "ave_all_frame_msssim_y": 0.971104, + "ave_all_frame_msssim_u": 0.972271, + "ave_all_frame_msssim_v": 0.976946, + "qp": 40, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "043": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001395, + "ave_i_frame_psnr": 33.853490, + "ave_i_frame_msssim": 0.960282, + "ave_i_frame_psnr_y": 31.679177, + "ave_i_frame_psnr_u": 39.922081, + "ave_i_frame_psnr_v": 40.830775, + "ave_i_frame_msssim_y": 0.956862, + "ave_i_frame_msssim_u": 0.967800, + "ave_i_frame_msssim_v": 0.973286, + "test_time": 16030.312824, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001395, + "ave_all_frame_psnr": 33.853490, + "ave_all_frame_msssim": 0.960282, + "ave_all_frame_psnr_y": 31.679177, + "ave_all_frame_psnr_u": 39.922081, + "ave_all_frame_psnr_v": 40.830775, + "ave_all_frame_msssim_y": 0.956862, + "ave_all_frame_msssim_u": 0.967800, + "ave_all_frame_msssim_v": 0.973286, + "qp": 43, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "046": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000951, + "ave_i_frame_psnr": 32.162572, + "ave_i_frame_msssim": 0.941906, + "ave_i_frame_psnr_y": 29.885002, + "ave_i_frame_psnr_u": 38.509061, + "ave_i_frame_psnr_v": 39.481500, + "ave_i_frame_msssim_y": 0.936252, + "ave_i_frame_msssim_u": 0.954789, + "ave_i_frame_msssim_v": 0.962943, + "test_time": 13551.872015, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000951, + "ave_all_frame_psnr": 32.162572, + "ave_all_frame_msssim": 0.941906, + "ave_all_frame_psnr_y": 29.885002, + "ave_all_frame_psnr_u": 38.509061, + "ave_all_frame_psnr_v": 39.481500, + "ave_all_frame_msssim_y": 0.936252, + "ave_all_frame_msssim_u": 0.954789, + "ave_all_frame_msssim_v": 0.962943, + "qp": 46, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + }, + "049": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000650, + "ave_i_frame_psnr": 30.442438, + "ave_i_frame_msssim": 0.916546, + "ave_i_frame_psnr_y": 28.102072, + "ave_i_frame_psnr_u": 37.036472, + "ave_i_frame_psnr_v": 37.890600, + "ave_i_frame_msssim_y": 0.907817, + "ave_i_frame_msssim_u": 0.937134, + "ave_i_frame_msssim_v": 0.948334, + "test_time": 11419.368901, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000650, + "ave_all_frame_psnr": 30.442438, + "ave_all_frame_msssim": 0.916546, + "ave_all_frame_psnr_y": 28.102072, + "ave_all_frame_psnr_u": 37.036472, + "ave_all_frame_psnr_v": 37.890600, + "ave_all_frame_msssim_y": 0.907817, + "ave_all_frame_msssim_u": 0.937134, + "ave_all_frame_msssim_v": 0.948334, + "qp": 49, + "ds_name": "HEVC_E", + "seq_name": "FourPeople_1280x720_60.yuv" + } + }, + "Johnny_1280x720_60.yuv": { + "022": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016448, + "ave_i_frame_psnr": 44.321094, + "ave_i_frame_msssim": 0.994640, + "ave_i_frame_psnr_y": 43.019713, + "ave_i_frame_psnr_u": 48.010644, + "ave_i_frame_psnr_v": 48.439830, + "ave_i_frame_msssim_y": 0.993979, + "ave_i_frame_msssim_u": 0.996417, + "ave_i_frame_msssim_v": 0.996831, + "test_time": 66694.938506, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016448, + "ave_all_frame_psnr": 44.321094, + "ave_all_frame_msssim": 0.994640, + "ave_all_frame_psnr_y": 43.019713, + "ave_all_frame_psnr_u": 48.010644, + "ave_all_frame_psnr_v": 48.439830, + "ave_all_frame_msssim_y": 0.993979, + "ave_all_frame_msssim_u": 0.996417, + "ave_all_frame_msssim_v": 0.996831, + "qp": 22, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "025": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007539, + "ave_i_frame_psnr": 43.470937, + "ave_i_frame_msssim": 0.993677, + "ave_i_frame_psnr_y": 42.133819, + "ave_i_frame_psnr_u": 47.311322, + "ave_i_frame_psnr_v": 47.653263, + "ave_i_frame_msssim_y": 0.992915, + "ave_i_frame_msssim_u": 0.995743, + "ave_i_frame_msssim_v": 0.996184, + "test_time": 47269.208689, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007539, + "ave_all_frame_psnr": 43.470937, + "ave_all_frame_msssim": 0.993677, + "ave_all_frame_psnr_y": 42.133819, + "ave_all_frame_psnr_u": 47.311322, + "ave_all_frame_psnr_v": 47.653263, + "ave_all_frame_msssim_y": 0.992915, + "ave_all_frame_msssim_u": 0.995743, + "ave_all_frame_msssim_v": 0.996184, + "qp": 25, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "028": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004217, + "ave_i_frame_psnr": 42.496630, + "ave_i_frame_msssim": 0.992286, + "ave_i_frame_psnr_y": 41.122174, + "ave_i_frame_psnr_u": 46.532694, + "ave_i_frame_psnr_v": 46.707305, + "ave_i_frame_msssim_y": 0.991384, + "ave_i_frame_msssim_u": 0.994765, + "ave_i_frame_msssim_v": 0.995214, + "test_time": 34317.642217, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004217, + "ave_all_frame_psnr": 42.496630, + "ave_all_frame_msssim": 0.992286, + "ave_all_frame_psnr_y": 41.122174, + "ave_all_frame_psnr_u": 46.532694, + "ave_all_frame_psnr_v": 46.707305, + "ave_all_frame_msssim_y": 0.991384, + "ave_all_frame_msssim_u": 0.994765, + "ave_all_frame_msssim_v": 0.995214, + "qp": 28, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "031": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002663, + "ave_i_frame_psnr": 41.388833, + "ave_i_frame_msssim": 0.990395, + "ave_i_frame_psnr_y": 39.989776, + "ave_i_frame_psnr_u": 45.496655, + "ave_i_frame_psnr_v": 45.675351, + "ave_i_frame_msssim_y": 0.989369, + "ave_i_frame_msssim_u": 0.993134, + "ave_i_frame_msssim_v": 0.993813, + "test_time": 26062.218753, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002663, + "ave_all_frame_psnr": 41.388833, + "ave_all_frame_msssim": 0.990395, + "ave_all_frame_psnr_y": 39.989776, + "ave_all_frame_psnr_u": 45.496655, + "ave_all_frame_psnr_v": 45.675351, + "ave_all_frame_msssim_y": 0.989369, + "ave_all_frame_msssim_u": 0.993134, + "ave_all_frame_msssim_v": 0.993813, + "qp": 31, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "034": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001831, + "ave_i_frame_psnr": 40.176620, + "ave_i_frame_msssim": 0.987589, + "ave_i_frame_psnr_y": 38.740611, + "ave_i_frame_psnr_u": 44.422089, + "ave_i_frame_psnr_v": 44.547207, + "ave_i_frame_msssim_y": 0.986332, + "ave_i_frame_msssim_u": 0.991067, + "ave_i_frame_msssim_v": 0.991655, + "test_time": 20515.191412, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001831, + "ave_all_frame_psnr": 40.176620, + "ave_all_frame_msssim": 0.987589, + "ave_all_frame_psnr_y": 38.740611, + "ave_all_frame_psnr_u": 44.422089, + "ave_all_frame_psnr_v": 44.547207, + "ave_all_frame_msssim_y": 0.986332, + "ave_all_frame_msssim_u": 0.991067, + "ave_all_frame_msssim_v": 0.991655, + "qp": 34, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "037": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001294, + "ave_i_frame_psnr": 38.909993, + "ave_i_frame_msssim": 0.983651, + "ave_i_frame_psnr_y": 37.385887, + "ave_i_frame_psnr_u": 43.129528, + "ave_i_frame_psnr_v": 43.835095, + "ave_i_frame_msssim_y": 0.982054, + "ave_i_frame_msssim_u": 0.986989, + "ave_i_frame_msssim_v": 0.989891, + "test_time": 16266.093946, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001294, + "ave_all_frame_psnr": 38.909993, + "ave_all_frame_msssim": 0.983651, + "ave_all_frame_psnr_y": 37.385887, + "ave_all_frame_psnr_u": 43.129528, + "ave_all_frame_psnr_v": 43.835095, + "ave_all_frame_msssim_y": 0.982054, + "ave_all_frame_msssim_u": 0.986989, + "ave_all_frame_msssim_v": 0.989891, + "qp": 37, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "040": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000930, + "ave_i_frame_psnr": 37.586121, + "ave_i_frame_msssim": 0.978344, + "ave_i_frame_psnr_y": 35.913034, + "ave_i_frame_psnr_u": 42.351289, + "ave_i_frame_psnr_v": 42.859472, + "ave_i_frame_msssim_y": 0.975832, + "ave_i_frame_msssim_u": 0.984428, + "ave_i_frame_msssim_v": 0.987333, + "test_time": 13562.297078, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000930, + "ave_all_frame_psnr": 37.586121, + "ave_all_frame_msssim": 0.978344, + "ave_all_frame_psnr_y": 35.913034, + "ave_all_frame_psnr_u": 42.351289, + "ave_all_frame_psnr_v": 42.859472, + "ave_all_frame_msssim_y": 0.975832, + "ave_all_frame_msssim_u": 0.984428, + "ave_all_frame_msssim_v": 0.987333, + "qp": 40, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "043": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000673, + "ave_i_frame_psnr": 36.232111, + "ave_i_frame_msssim": 0.970916, + "ave_i_frame_psnr_y": 34.325943, + "ave_i_frame_psnr_u": 41.510205, + "ave_i_frame_psnr_v": 42.391026, + "ave_i_frame_msssim_y": 0.966502, + "ave_i_frame_msssim_u": 0.981897, + "ave_i_frame_msssim_v": 0.986417, + "test_time": 11281.091234, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000673, + "ave_all_frame_psnr": 36.232111, + "ave_all_frame_msssim": 0.970916, + "ave_all_frame_psnr_y": 34.325943, + "ave_all_frame_psnr_u": 41.510205, + "ave_all_frame_psnr_v": 42.391026, + "ave_all_frame_msssim_y": 0.966502, + "ave_all_frame_msssim_u": 0.981897, + "ave_all_frame_msssim_v": 0.986417, + "qp": 43, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "046": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000490, + "ave_i_frame_psnr": 34.687501, + "ave_i_frame_msssim": 0.960966, + "ave_i_frame_psnr_y": 32.740730, + "ave_i_frame_psnr_u": 40.137862, + "ave_i_frame_psnr_v": 40.917769, + "ave_i_frame_msssim_y": 0.955346, + "ave_i_frame_msssim_u": 0.975823, + "ave_i_frame_msssim_v": 0.979832, + "test_time": 9821.317756, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000490, + "ave_all_frame_psnr": 34.687501, + "ave_all_frame_msssim": 0.960966, + "ave_all_frame_psnr_y": 32.740730, + "ave_all_frame_psnr_u": 40.137862, + "ave_all_frame_psnr_v": 40.917769, + "ave_all_frame_msssim_y": 0.955346, + "ave_all_frame_msssim_u": 0.975823, + "ave_all_frame_msssim_v": 0.979832, + "qp": 46, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + }, + "049": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000365, + "ave_i_frame_psnr": 33.095785, + "ave_i_frame_msssim": 0.949109, + "ave_i_frame_psnr_y": 31.188010, + "ave_i_frame_psnr_u": 38.281032, + "ave_i_frame_psnr_v": 39.357191, + "ave_i_frame_msssim_y": 0.942482, + "ave_i_frame_msssim_u": 0.965525, + "ave_i_frame_msssim_v": 0.972451, + "test_time": 8393.244688, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000365, + "ave_all_frame_psnr": 33.095785, + "ave_all_frame_msssim": 0.949109, + "ave_all_frame_psnr_y": 31.188010, + "ave_all_frame_psnr_u": 38.281032, + "ave_all_frame_psnr_v": 39.357191, + "ave_all_frame_msssim_y": 0.942482, + "ave_all_frame_msssim_u": 0.965525, + "ave_all_frame_msssim_v": 0.972451, + "qp": 49, + "ds_name": "HEVC_E", + "seq_name": "Johnny_1280x720_60.yuv" + } + }, + "KristenAndSara_1280x720_60.yuv": { + "022": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.025251, + "ave_i_frame_psnr": 44.435559, + "ave_i_frame_msssim": 0.995011, + "ave_i_frame_psnr_y": 43.354036, + "ave_i_frame_psnr_u": 47.252649, + "ave_i_frame_psnr_v": 48.107609, + "ave_i_frame_msssim_y": 0.994670, + "ave_i_frame_msssim_u": 0.995715, + "ave_i_frame_msssim_v": 0.996353, + "test_time": 89257.424911, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.025251, + "ave_all_frame_psnr": 44.435559, + "ave_all_frame_msssim": 0.995011, + "ave_all_frame_psnr_y": 43.354036, + "ave_all_frame_psnr_u": 47.252649, + "ave_all_frame_psnr_v": 48.107609, + "ave_all_frame_msssim_y": 0.994670, + "ave_all_frame_msssim_u": 0.995715, + "ave_all_frame_msssim_v": 0.996353, + "qp": 22, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "025": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013157, + "ave_i_frame_psnr": 43.404594, + "ave_i_frame_msssim": 0.993797, + "ave_i_frame_psnr_y": 42.269505, + "ave_i_frame_psnr_u": 46.425241, + "ave_i_frame_psnr_v": 47.194481, + "ave_i_frame_msssim_y": 0.993394, + "ave_i_frame_msssim_u": 0.994662, + "ave_i_frame_msssim_v": 0.995348, + "test_time": 64161.221615, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013157, + "ave_all_frame_psnr": 43.404594, + "ave_all_frame_msssim": 0.993797, + "ave_all_frame_psnr_y": 42.269505, + "ave_all_frame_psnr_u": 46.425241, + "ave_all_frame_psnr_v": 47.194481, + "ave_all_frame_msssim_y": 0.993394, + "ave_all_frame_msssim_u": 0.994662, + "ave_all_frame_msssim_v": 0.995348, + "qp": 25, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "028": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007664, + "ave_i_frame_psnr": 42.256037, + "ave_i_frame_msssim": 0.992010, + "ave_i_frame_psnr_y": 41.068209, + "ave_i_frame_psnr_u": 45.453239, + "ave_i_frame_psnr_v": 46.185805, + "ave_i_frame_msssim_y": 0.991511, + "ave_i_frame_msssim_u": 0.993134, + "ave_i_frame_msssim_v": 0.993879, + "test_time": 46012.137995, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007664, + "ave_all_frame_psnr": 42.256037, + "ave_all_frame_msssim": 0.992010, + "ave_all_frame_psnr_y": 41.068209, + "ave_all_frame_psnr_u": 45.453239, + "ave_all_frame_psnr_v": 46.185805, + "ave_all_frame_msssim_y": 0.991511, + "ave_all_frame_msssim_u": 0.993134, + "ave_all_frame_msssim_v": 0.993879, + "qp": 28, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "031": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004715, + "ave_i_frame_psnr": 40.947816, + "ave_i_frame_msssim": 0.989406, + "ave_i_frame_psnr_y": 39.708922, + "ave_i_frame_psnr_u": 44.349591, + "ave_i_frame_psnr_v": 44.979405, + "ave_i_frame_msssim_y": 0.988735, + "ave_i_frame_msssim_u": 0.990994, + "ave_i_frame_msssim_v": 0.991842, + "test_time": 33932.595618, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004715, + "ave_all_frame_psnr": 40.947816, + "ave_all_frame_msssim": 0.989406, + "ave_all_frame_psnr_y": 39.708922, + "ave_all_frame_psnr_u": 44.349591, + "ave_all_frame_psnr_v": 44.979405, + "ave_all_frame_msssim_y": 0.988735, + "ave_all_frame_msssim_u": 0.990994, + "ave_all_frame_msssim_v": 0.991842, + "qp": 31, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "034": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003162, + "ave_i_frame_psnr": 39.610920, + "ave_i_frame_msssim": 0.985908, + "ave_i_frame_psnr_y": 38.291145, + "ave_i_frame_psnr_u": 43.234478, + "ave_i_frame_psnr_v": 43.906017, + "ave_i_frame_msssim_y": 0.984974, + "ave_i_frame_msssim_u": 0.988311, + "ave_i_frame_msssim_v": 0.989112, + "test_time": 26398.188916, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003162, + "ave_all_frame_psnr": 39.610920, + "ave_all_frame_msssim": 0.985908, + "ave_all_frame_psnr_y": 38.291145, + "ave_all_frame_psnr_u": 43.234478, + "ave_all_frame_psnr_v": 43.906017, + "ave_all_frame_msssim_y": 0.984974, + "ave_all_frame_msssim_u": 0.988311, + "ave_all_frame_msssim_v": 0.989112, + "qp": 34, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "037": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002180, + "ave_i_frame_psnr": 38.237991, + "ave_i_frame_msssim": 0.981237, + "ave_i_frame_psnr_y": 36.803592, + "ave_i_frame_psnr_u": 42.162788, + "ave_i_frame_psnr_v": 42.919591, + "ave_i_frame_msssim_y": 0.979811, + "ave_i_frame_msssim_u": 0.984632, + "ave_i_frame_msssim_v": 0.986401, + "test_time": 21319.764812, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002180, + "ave_all_frame_psnr": 38.237991, + "ave_all_frame_msssim": 0.981237, + "ave_all_frame_psnr_y": 36.803592, + "ave_all_frame_psnr_u": 42.162788, + "ave_all_frame_psnr_v": 42.919591, + "ave_all_frame_msssim_y": 0.979811, + "ave_all_frame_msssim_u": 0.984632, + "ave_all_frame_msssim_v": 0.986401, + "qp": 37, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "040": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001524, + "ave_i_frame_psnr": 36.843643, + "ave_i_frame_msssim": 0.975009, + "ave_i_frame_psnr_y": 35.217190, + "ave_i_frame_psnr_u": 41.280883, + "ave_i_frame_psnr_v": 42.165123, + "ave_i_frame_msssim_y": 0.972538, + "ave_i_frame_msssim_u": 0.981305, + "ave_i_frame_msssim_v": 0.983541, + "test_time": 17259.523679, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001524, + "ave_all_frame_psnr": 36.843643, + "ave_all_frame_msssim": 0.975009, + "ave_all_frame_psnr_y": 35.217190, + "ave_all_frame_psnr_u": 41.280883, + "ave_all_frame_psnr_v": 42.165123, + "ave_all_frame_msssim_y": 0.972538, + "ave_all_frame_msssim_u": 0.981305, + "ave_all_frame_msssim_v": 0.983541, + "qp": 40, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "043": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.001089, + "ave_i_frame_psnr": 35.434314, + "ave_i_frame_msssim": 0.966802, + "ave_i_frame_psnr_y": 33.554293, + "ave_i_frame_psnr_u": 40.616158, + "ave_i_frame_psnr_v": 41.532601, + "ave_i_frame_msssim_y": 0.962681, + "ave_i_frame_msssim_u": 0.977798, + "ave_i_frame_msssim_v": 0.980531, + "test_time": 13892.635324, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.001089, + "ave_all_frame_psnr": 35.434314, + "ave_all_frame_msssim": 0.966802, + "ave_all_frame_psnr_y": 33.554293, + "ave_all_frame_psnr_u": 40.616158, + "ave_all_frame_psnr_v": 41.532601, + "ave_all_frame_msssim_y": 0.962681, + "ave_all_frame_msssim_u": 0.977798, + "ave_all_frame_msssim_v": 0.980531, + "qp": 43, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "046": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000769, + "ave_i_frame_psnr": 33.679907, + "ave_i_frame_msssim": 0.953858, + "ave_i_frame_psnr_y": 31.715219, + "ave_i_frame_psnr_u": 39.286126, + "ave_i_frame_psnr_v": 39.861822, + "ave_i_frame_msssim_y": 0.948310, + "ave_i_frame_msssim_u": 0.970877, + "ave_i_frame_msssim_v": 0.970129, + "test_time": 11790.960306, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000769, + "ave_all_frame_psnr": 33.679907, + "ave_all_frame_msssim": 0.953858, + "ave_all_frame_psnr_y": 31.715219, + "ave_all_frame_psnr_u": 39.286126, + "ave_all_frame_psnr_v": 39.861822, + "ave_all_frame_msssim_y": 0.948310, + "ave_all_frame_msssim_u": 0.970877, + "ave_all_frame_msssim_v": 0.970129, + "qp": 46, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + }, + "049": { + "frame_pixel_num": 921600, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.000548, + "ave_i_frame_psnr": 31.974030, + "ave_i_frame_msssim": 0.937187, + "ave_i_frame_psnr_y": 29.929390, + "ave_i_frame_psnr_u": 37.791848, + "ave_i_frame_psnr_v": 38.424047, + "ave_i_frame_msssim_y": 0.929392, + "ave_i_frame_msssim_u": 0.960934, + "ave_i_frame_msssim_v": 0.960213, + "test_time": 9818.390726, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.000548, + "ave_all_frame_psnr": 31.974030, + "ave_all_frame_msssim": 0.937187, + "ave_all_frame_psnr_y": 29.929390, + "ave_all_frame_psnr_u": 37.791848, + "ave_all_frame_psnr_v": 38.424047, + "ave_all_frame_msssim_y": 0.929392, + "ave_all_frame_msssim_u": 0.960934, + "ave_all_frame_msssim_v": 0.960213, + "qp": 49, + "ds_name": "HEVC_E", + "seq_name": "KristenAndSara_1280x720_60.yuv" + } + } + }, + "HEVC_C": { + "BQMall_832x480_60.yuv": { + "022": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.126541, + "ave_i_frame_psnr": 41.023486, + "ave_i_frame_msssim": 0.994769, + "ave_i_frame_psnr_y": 40.124732, + "ave_i_frame_psnr_u": 43.040379, + "ave_i_frame_psnr_v": 44.399119, + "ave_i_frame_msssim_y": 0.995338, + "ave_i_frame_msssim_u": 0.992126, + "ave_i_frame_msssim_v": 0.993996, + "test_time": 71952.667172, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.126541, + "ave_all_frame_psnr": 41.023486, + "ave_all_frame_msssim": 0.994769, + "ave_all_frame_psnr_y": 40.124732, + "ave_all_frame_psnr_u": 43.040379, + "ave_all_frame_psnr_v": 44.399119, + "ave_all_frame_msssim_y": 0.995338, + "ave_all_frame_msssim_u": 0.992126, + "ave_all_frame_msssim_v": 0.993996, + "qp": 22, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "025": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.075489, + "ave_i_frame_psnr": 39.440472, + "ave_i_frame_msssim": 0.992355, + "ave_i_frame_psnr_y": 38.440976, + "ave_i_frame_psnr_u": 41.872616, + "ave_i_frame_psnr_v": 43.005304, + "ave_i_frame_msssim_y": 0.993187, + "ave_i_frame_msssim_u": 0.988653, + "ave_i_frame_msssim_v": 0.991064, + "test_time": 62047.926787, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.075489, + "ave_all_frame_psnr": 39.440472, + "ave_all_frame_msssim": 0.992355, + "ave_all_frame_psnr_y": 38.440976, + "ave_all_frame_psnr_u": 41.872616, + "ave_all_frame_psnr_v": 43.005304, + "ave_all_frame_msssim_y": 0.993187, + "ave_all_frame_msssim_u": 0.988653, + "ave_all_frame_msssim_v": 0.991064, + "qp": 25, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "028": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.046603, + "ave_i_frame_psnr": 37.810373, + "ave_i_frame_msssim": 0.988662, + "ave_i_frame_psnr_y": 36.683040, + "ave_i_frame_psnr_u": 40.710128, + "ave_i_frame_psnr_v": 41.674615, + "ave_i_frame_msssim_y": 0.989766, + "ave_i_frame_msssim_u": 0.983784, + "ave_i_frame_msssim_v": 0.986912, + "test_time": 52247.550670, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.046603, + "ave_all_frame_psnr": 37.810373, + "ave_all_frame_msssim": 0.988662, + "ave_all_frame_psnr_y": 36.683040, + "ave_all_frame_psnr_u": 40.710128, + "ave_all_frame_psnr_v": 41.674615, + "ave_all_frame_msssim_y": 0.989766, + "ave_all_frame_msssim_u": 0.983784, + "ave_all_frame_msssim_v": 0.986912, + "qp": 28, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "031": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.029450, + "ave_i_frame_psnr": 36.166446, + "ave_i_frame_msssim": 0.983170, + "ave_i_frame_psnr_y": 34.887117, + "ave_i_frame_psnr_u": 39.583243, + "ave_i_frame_psnr_v": 40.425619, + "ave_i_frame_msssim_y": 0.984460, + "ave_i_frame_msssim_u": 0.977181, + "ave_i_frame_msssim_v": 0.981419, + "test_time": 41084.516518, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.029450, + "ave_all_frame_psnr": 36.166446, + "ave_all_frame_msssim": 0.983170, + "ave_all_frame_psnr_y": 34.887117, + "ave_all_frame_psnr_u": 39.583243, + "ave_all_frame_psnr_v": 40.425619, + "ave_all_frame_msssim_y": 0.984460, + "ave_all_frame_msssim_u": 0.977181, + "ave_all_frame_msssim_v": 0.981419, + "qp": 31, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "034": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.019713, + "ave_i_frame_psnr": 34.644474, + "ave_i_frame_msssim": 0.975537, + "ave_i_frame_psnr_y": 33.266521, + "ave_i_frame_psnr_u": 38.393543, + "ave_i_frame_psnr_v": 39.163120, + "ave_i_frame_msssim_y": 0.977248, + "ave_i_frame_msssim_u": 0.967518, + "ave_i_frame_msssim_v": 0.973289, + "test_time": 31972.734406, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.019713, + "ave_all_frame_psnr": 34.644474, + "ave_all_frame_msssim": 0.975537, + "ave_all_frame_psnr_y": 33.266521, + "ave_all_frame_psnr_u": 38.393543, + "ave_all_frame_psnr_v": 39.163120, + "ave_all_frame_msssim_y": 0.977248, + "ave_all_frame_msssim_u": 0.967518, + "ave_all_frame_msssim_v": 0.973289, + "qp": 34, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "037": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013282, + "ave_i_frame_psnr": 33.272379, + "ave_i_frame_msssim": 0.966388, + "ave_i_frame_psnr_y": 31.643728, + "ave_i_frame_psnr_u": 37.753190, + "ave_i_frame_psnr_v": 38.563471, + "ave_i_frame_msssim_y": 0.966806, + "ave_i_frame_msssim_u": 0.961412, + "ave_i_frame_msssim_v": 0.968860, + "test_time": 25523.309527, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013282, + "ave_all_frame_psnr": 33.272379, + "ave_all_frame_msssim": 0.966388, + "ave_all_frame_psnr_y": 31.643728, + "ave_all_frame_psnr_u": 37.753190, + "ave_all_frame_psnr_v": 38.563471, + "ave_all_frame_msssim_y": 0.966806, + "ave_all_frame_msssim_u": 0.961412, + "ave_all_frame_msssim_v": 0.968860, + "qp": 37, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "040": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008893, + "ave_i_frame_psnr": 31.821674, + "ave_i_frame_msssim": 0.952953, + "ave_i_frame_psnr_y": 30.013207, + "ave_i_frame_psnr_u": 36.894179, + "ave_i_frame_psnr_v": 37.599973, + "ave_i_frame_msssim_y": 0.951888, + "ave_i_frame_msssim_u": 0.951976, + "ave_i_frame_msssim_v": 0.960321, + "test_time": 19971.034952, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008893, + "ave_all_frame_psnr": 31.821674, + "ave_all_frame_msssim": 0.952953, + "ave_all_frame_psnr_y": 30.013207, + "ave_all_frame_psnr_u": 36.894179, + "ave_all_frame_psnr_v": 37.599973, + "ave_all_frame_msssim_y": 0.951888, + "ave_all_frame_msssim_u": 0.951976, + "ave_all_frame_msssim_v": 0.960321, + "qp": 40, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "043": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005958, + "ave_i_frame_psnr": 30.412596, + "ave_i_frame_msssim": 0.934627, + "ave_i_frame_psnr_y": 28.401799, + "ave_i_frame_psnr_u": 36.203799, + "ave_i_frame_psnr_v": 36.686177, + "ave_i_frame_msssim_y": 0.930716, + "ave_i_frame_msssim_u": 0.942353, + "ave_i_frame_msssim_v": 0.950365, + "test_time": 15750.423399, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005958, + "ave_all_frame_psnr": 30.412596, + "ave_all_frame_msssim": 0.934627, + "ave_all_frame_psnr_y": 28.401799, + "ave_all_frame_psnr_u": 36.203799, + "ave_all_frame_psnr_v": 36.686177, + "ave_all_frame_msssim_y": 0.930716, + "ave_all_frame_msssim_u": 0.942353, + "ave_all_frame_msssim_v": 0.950365, + "qp": 43, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "046": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003951, + "ave_i_frame_psnr": 28.921564, + "ave_i_frame_msssim": 0.907586, + "ave_i_frame_psnr_y": 26.826158, + "ave_i_frame_psnr_u": 34.988516, + "ave_i_frame_psnr_v": 35.427043, + "ave_i_frame_msssim_y": 0.901130, + "ave_i_frame_msssim_u": 0.922364, + "ave_i_frame_msssim_v": 0.931549, + "test_time": 12271.947601, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003951, + "ave_all_frame_psnr": 28.921564, + "ave_all_frame_msssim": 0.907586, + "ave_all_frame_psnr_y": 26.826158, + "ave_all_frame_psnr_u": 34.988516, + "ave_all_frame_psnr_v": 35.427043, + "ave_all_frame_msssim_y": 0.901130, + "ave_all_frame_msssim_u": 0.922364, + "ave_all_frame_msssim_v": 0.931549, + "qp": 46, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + }, + "049": { + "frame_pixel_num": 399360, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002643, + "ave_i_frame_psnr": 27.474866, + "ave_i_frame_msssim": 0.871223, + "ave_i_frame_psnr_y": 25.305482, + "ave_i_frame_psnr_u": 33.870254, + "ave_i_frame_psnr_v": 34.095785, + "ave_i_frame_msssim_y": 0.860526, + "ave_i_frame_msssim_u": 0.899957, + "ave_i_frame_msssim_v": 0.906671, + "test_time": 9653.699746, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002643, + "ave_all_frame_psnr": 27.474866, + "ave_all_frame_msssim": 0.871223, + "ave_all_frame_psnr_y": 25.305482, + "ave_all_frame_psnr_u": 33.870254, + "ave_all_frame_psnr_v": 34.095785, + "ave_all_frame_msssim_y": 0.860526, + "ave_all_frame_msssim_u": 0.899957, + "ave_all_frame_msssim_v": 0.906671, + "qp": 49, + "ds_name": "HEVC_C", + "seq_name": "BQMall_832x480_60.yuv" + } + }, + "BasketballDrill_832x480_50.yuv": { + "022": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.133811, + "ave_i_frame_psnr": 41.578748, + "ave_i_frame_msssim": 0.994377, + "ave_i_frame_psnr_y": 40.935934, + "ave_i_frame_psnr_u": 43.124842, + "ave_i_frame_psnr_v": 43.889539, + "ave_i_frame_msssim_y": 0.994337, + "ave_i_frame_msssim_u": 0.993619, + "ave_i_frame_msssim_v": 0.995375, + "test_time": 74189.247890, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.133811, + "ave_all_frame_psnr": 41.578748, + "ave_all_frame_msssim": 0.994377, + "ave_all_frame_psnr_y": 40.935934, + "ave_all_frame_psnr_u": 43.124842, + "ave_all_frame_psnr_v": 43.889539, + "ave_all_frame_msssim_y": 0.994337, + "ave_all_frame_msssim_u": 0.993619, + "ave_all_frame_msssim_v": 0.995375, + "qp": 22, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "025": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.082829, + "ave_i_frame_psnr": 39.835001, + "ave_i_frame_msssim": 0.991158, + "ave_i_frame_psnr_y": 39.099572, + "ave_i_frame_psnr_u": 41.767660, + "ave_i_frame_psnr_v": 42.314920, + "ave_i_frame_msssim_y": 0.990850, + "ave_i_frame_msssim_u": 0.990919, + "ave_i_frame_msssim_v": 0.993245, + "test_time": 65114.597185, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.082829, + "ave_all_frame_psnr": 39.835001, + "ave_all_frame_msssim": 0.991158, + "ave_all_frame_psnr_y": 39.099572, + "ave_all_frame_psnr_u": 41.767660, + "ave_all_frame_psnr_v": 42.314920, + "ave_all_frame_msssim_y": 0.990850, + "ave_all_frame_msssim_u": 0.990919, + "ave_all_frame_msssim_v": 0.993245, + "qp": 25, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "028": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.051562, + "ave_i_frame_psnr": 38.066515, + "ave_i_frame_msssim": 0.985989, + "ave_i_frame_psnr_y": 37.224015, + "ave_i_frame_psnr_u": 40.421729, + "ave_i_frame_psnr_v": 40.766305, + "ave_i_frame_msssim_y": 0.985095, + "ave_i_frame_msssim_u": 0.987071, + "ave_i_frame_msssim_v": 0.990271, + "test_time": 55261.233874, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.051562, + "ave_all_frame_psnr": 38.066515, + "ave_all_frame_msssim": 0.985989, + "ave_all_frame_psnr_y": 37.224015, + "ave_all_frame_psnr_u": 40.421729, + "ave_all_frame_psnr_v": 40.766305, + "ave_all_frame_msssim_y": 0.985095, + "ave_all_frame_msssim_u": 0.987071, + "ave_all_frame_msssim_v": 0.990271, + "qp": 28, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "031": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.032381, + "ave_i_frame_psnr": 36.430075, + "ave_i_frame_msssim": 0.978486, + "ave_i_frame_psnr_y": 35.428719, + "ave_i_frame_psnr_u": 39.313758, + "ave_i_frame_psnr_v": 39.554531, + "ave_i_frame_msssim_y": 0.976288, + "ave_i_frame_msssim_u": 0.983121, + "ave_i_frame_msssim_v": 0.987039, + "test_time": 43028.909328, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.032381, + "ave_all_frame_psnr": 36.430075, + "ave_all_frame_msssim": 0.978486, + "ave_all_frame_psnr_y": 35.428719, + "ave_all_frame_psnr_u": 39.313758, + "ave_all_frame_psnr_v": 39.554531, + "ave_all_frame_msssim_y": 0.976288, + "ave_all_frame_msssim_u": 0.983121, + "ave_all_frame_msssim_v": 0.987039, + "qp": 31, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "034": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.021852, + "ave_i_frame_psnr": 34.967784, + "ave_i_frame_msssim": 0.968398, + "ave_i_frame_psnr_y": 33.896585, + "ave_i_frame_psnr_u": 38.150927, + "ave_i_frame_psnr_v": 38.211836, + "ave_i_frame_msssim_y": 0.964551, + "ave_i_frame_msssim_u": 0.977785, + "ave_i_frame_msssim_v": 0.982097, + "test_time": 33288.694383, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.021852, + "ave_all_frame_psnr": 34.967784, + "ave_all_frame_msssim": 0.968398, + "ave_all_frame_psnr_y": 33.896585, + "ave_all_frame_psnr_u": 38.150927, + "ave_all_frame_psnr_v": 38.211836, + "ave_all_frame_msssim_y": 0.964551, + "ave_all_frame_msssim_u": 0.977785, + "ave_all_frame_msssim_v": 0.982097, + "qp": 34, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "037": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014833, + "ave_i_frame_psnr": 33.574579, + "ave_i_frame_msssim": 0.955176, + "ave_i_frame_psnr_y": 32.418671, + "ave_i_frame_psnr_u": 37.099544, + "ave_i_frame_psnr_v": 36.985059, + "ave_i_frame_msssim_y": 0.948826, + "ave_i_frame_msssim_u": 0.972410, + "ave_i_frame_msssim_v": 0.976042, + "test_time": 25706.730178, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014833, + "ave_all_frame_psnr": 33.574579, + "ave_all_frame_msssim": 0.955176, + "ave_all_frame_psnr_y": 32.418671, + "ave_all_frame_psnr_u": 37.099544, + "ave_all_frame_psnr_v": 36.985059, + "ave_all_frame_msssim_y": 0.948826, + "ave_all_frame_msssim_u": 0.972410, + "ave_all_frame_msssim_v": 0.976042, + "qp": 37, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "040": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009943, + "ave_i_frame_psnr": 32.208366, + "ave_i_frame_msssim": 0.938081, + "ave_i_frame_psnr_y": 30.974027, + "ave_i_frame_psnr_u": 36.051360, + "ave_i_frame_psnr_v": 35.771410, + "ave_i_frame_msssim_y": 0.928642, + "ave_i_frame_msssim_u": 0.964014, + "ave_i_frame_msssim_v": 0.968776, + "test_time": 18659.356661, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009943, + "ave_all_frame_psnr": 32.208366, + "ave_all_frame_msssim": 0.938081, + "ave_all_frame_psnr_y": 30.974027, + "ave_all_frame_psnr_u": 36.051360, + "ave_all_frame_psnr_v": 35.771410, + "ave_all_frame_msssim_y": 0.928642, + "ave_all_frame_msssim_u": 0.964014, + "ave_all_frame_msssim_v": 0.968776, + "qp": 40, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "043": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006666, + "ave_i_frame_psnr": 30.827807, + "ave_i_frame_msssim": 0.914872, + "ave_i_frame_psnr_y": 29.491597, + "ave_i_frame_psnr_u": 35.111118, + "ave_i_frame_psnr_v": 34.561757, + "ave_i_frame_msssim_y": 0.901627, + "ave_i_frame_msssim_u": 0.952424, + "ave_i_frame_msssim_v": 0.956793, + "test_time": 13824.327190, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006666, + "ave_all_frame_psnr": 30.827807, + "ave_all_frame_msssim": 0.914872, + "ave_all_frame_psnr_y": 29.491597, + "ave_all_frame_psnr_u": 35.111118, + "ave_all_frame_psnr_v": 34.561757, + "ave_all_frame_msssim_y": 0.901627, + "ave_all_frame_msssim_u": 0.952424, + "ave_all_frame_msssim_v": 0.956793, + "qp": 43, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "046": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004420, + "ave_i_frame_psnr": 29.371154, + "ave_i_frame_msssim": 0.888954, + "ave_i_frame_psnr_y": 28.000699, + "ave_i_frame_psnr_u": 33.758487, + "ave_i_frame_psnr_v": 33.206552, + "ave_i_frame_msssim_y": 0.872658, + "ave_i_frame_msssim_u": 0.934724, + "ave_i_frame_msssim_v": 0.940960, + "test_time": 10423.929155, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004420, + "ave_all_frame_psnr": 29.371154, + "ave_all_frame_msssim": 0.888954, + "ave_all_frame_psnr_y": 28.000699, + "ave_all_frame_psnr_u": 33.758487, + "ave_all_frame_psnr_v": 33.206552, + "ave_all_frame_msssim_y": 0.872658, + "ave_all_frame_msssim_u": 0.934724, + "ave_all_frame_msssim_v": 0.940960, + "qp": 46, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + }, + "049": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002896, + "ave_i_frame_psnr": 27.704969, + "ave_i_frame_msssim": 0.845684, + "ave_i_frame_psnr_y": 26.331521, + "ave_i_frame_psnr_u": 32.171439, + "ave_i_frame_psnr_v": 31.479190, + "ave_i_frame_msssim_y": 0.826744, + "ave_i_frame_msssim_u": 0.904273, + "ave_i_frame_msssim_v": 0.900734, + "test_time": 7853.680946, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002896, + "ave_all_frame_psnr": 27.704969, + "ave_all_frame_msssim": 0.845684, + "ave_all_frame_psnr_y": 26.331521, + "ave_all_frame_psnr_u": 32.171439, + "ave_all_frame_psnr_v": 31.479190, + "ave_all_frame_msssim_y": 0.826744, + "ave_all_frame_msssim_u": 0.904273, + "ave_all_frame_msssim_v": 0.900734, + "qp": 49, + "ds_name": "HEVC_C", + "seq_name": "BasketballDrill_832x480_50.yuv" + } + }, + "PartyScene_832x480_50.yuv": { + "022": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.306261, + "ave_i_frame_psnr": 39.076659, + "ave_i_frame_msssim": 0.995079, + "ave_i_frame_psnr_y": 38.330680, + "ave_i_frame_psnr_u": 40.857064, + "ave_i_frame_psnr_v": 41.772129, + "ave_i_frame_msssim_y": 0.996073, + "ave_i_frame_msssim_u": 0.991220, + "ave_i_frame_msssim_v": 0.992970, + "test_time": 80271.259661, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.306261, + "ave_all_frame_psnr": 39.076659, + "ave_all_frame_msssim": 0.995079, + "ave_all_frame_psnr_y": 38.330680, + "ave_all_frame_psnr_u": 40.857064, + "ave_all_frame_psnr_v": 41.772129, + "ave_all_frame_msssim_y": 0.996073, + "ave_all_frame_msssim_u": 0.991220, + "ave_all_frame_msssim_v": 0.992970, + "qp": 22, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "025": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.177340, + "ave_i_frame_psnr": 36.929583, + "ave_i_frame_msssim": 0.991916, + "ave_i_frame_psnr_y": 36.011119, + "ave_i_frame_psnr_u": 39.283230, + "ave_i_frame_psnr_v": 40.086716, + "ave_i_frame_msssim_y": 0.993323, + "ave_i_frame_msssim_u": 0.986551, + "ave_i_frame_msssim_v": 0.988842, + "test_time": 68442.547448, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.177340, + "ave_all_frame_psnr": 36.929583, + "ave_all_frame_msssim": 0.991916, + "ave_all_frame_psnr_y": 36.011119, + "ave_all_frame_psnr_u": 39.283230, + "ave_all_frame_psnr_v": 40.086716, + "ave_all_frame_msssim_y": 0.993323, + "ave_all_frame_msssim_u": 0.986551, + "ave_all_frame_msssim_v": 0.988842, + "qp": 25, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "028": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.102868, + "ave_i_frame_psnr": 34.911566, + "ave_i_frame_msssim": 0.986919, + "ave_i_frame_psnr_y": 33.811958, + "ave_i_frame_psnr_u": 37.862320, + "ave_i_frame_psnr_v": 38.558455, + "ave_i_frame_msssim_y": 0.988692, + "ave_i_frame_msssim_u": 0.980244, + "ave_i_frame_msssim_v": 0.982954, + "test_time": 59265.913416, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.102868, + "ave_all_frame_psnr": 34.911566, + "ave_all_frame_msssim": 0.986919, + "ave_all_frame_psnr_y": 33.811958, + "ave_all_frame_psnr_u": 37.862320, + "ave_all_frame_psnr_v": 38.558455, + "ave_all_frame_msssim_y": 0.988692, + "ave_all_frame_msssim_u": 0.980244, + "ave_all_frame_msssim_v": 0.982954, + "qp": 28, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "031": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.060123, + "ave_i_frame_psnr": 33.050516, + "ave_i_frame_msssim": 0.979461, + "ave_i_frame_psnr_y": 31.738877, + "ave_i_frame_psnr_u": 36.669623, + "ave_i_frame_psnr_v": 37.301244, + "ave_i_frame_msssim_y": 0.981228, + "ave_i_frame_msssim_u": 0.972649, + "ave_i_frame_msssim_v": 0.975674, + "test_time": 49668.707927, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.060123, + "ave_all_frame_psnr": 33.050516, + "ave_all_frame_msssim": 0.979461, + "ave_all_frame_psnr_y": 31.738877, + "ave_all_frame_psnr_u": 36.669623, + "ave_all_frame_psnr_v": 37.301244, + "ave_all_frame_msssim_y": 0.981228, + "ave_all_frame_msssim_u": 0.972649, + "ave_all_frame_msssim_v": 0.975674, + "qp": 31, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "034": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.037446, + "ave_i_frame_psnr": 31.375619, + "ave_i_frame_msssim": 0.968765, + "ave_i_frame_psnr_y": 29.915214, + "ave_i_frame_psnr_u": 35.471416, + "ave_i_frame_psnr_v": 36.042252, + "ave_i_frame_msssim_y": 0.970450, + "ave_i_frame_msssim_u": 0.961863, + "ave_i_frame_msssim_v": 0.965552, + "test_time": 37665.554852, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.037446, + "ave_all_frame_psnr": 31.375619, + "ave_all_frame_msssim": 0.968765, + "ave_all_frame_psnr_y": 29.915214, + "ave_all_frame_psnr_u": 35.471416, + "ave_all_frame_psnr_v": 36.042252, + "ave_all_frame_msssim_y": 0.970450, + "ave_all_frame_msssim_u": 0.961863, + "ave_all_frame_msssim_v": 0.965552, + "qp": 34, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "037": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022547, + "ave_i_frame_psnr": 29.875820, + "ave_i_frame_msssim": 0.954037, + "ave_i_frame_psnr_y": 28.147590, + "ave_i_frame_psnr_u": 34.690088, + "ave_i_frame_psnr_v": 35.430931, + "ave_i_frame_msssim_y": 0.953289, + "ave_i_frame_msssim_u": 0.953595, + "ave_i_frame_msssim_v": 0.958962, + "test_time": 29918.279619, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022547, + "ave_all_frame_psnr": 29.875820, + "ave_all_frame_msssim": 0.954037, + "ave_all_frame_psnr_y": 28.147590, + "ave_all_frame_psnr_u": 34.690088, + "ave_all_frame_psnr_v": 35.430931, + "ave_all_frame_msssim_y": 0.953289, + "ave_all_frame_msssim_u": 0.953595, + "ave_all_frame_msssim_v": 0.958962, + "qp": 37, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "040": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013123, + "ave_i_frame_psnr": 28.425603, + "ave_i_frame_msssim": 0.931214, + "ave_i_frame_psnr_y": 26.494610, + "ave_i_frame_psnr_u": 33.873593, + "ave_i_frame_psnr_v": 34.563566, + "ave_i_frame_msssim_y": 0.926840, + "ave_i_frame_msssim_u": 0.941376, + "ave_i_frame_msssim_v": 0.947293, + "test_time": 22883.046766, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013123, + "ave_all_frame_psnr": 28.425603, + "ave_all_frame_msssim": 0.931214, + "ave_all_frame_psnr_y": 26.494610, + "ave_all_frame_psnr_u": 33.873593, + "ave_all_frame_psnr_v": 34.563566, + "ave_all_frame_msssim_y": 0.926840, + "ave_all_frame_msssim_u": 0.941376, + "ave_all_frame_msssim_v": 0.947293, + "qp": 40, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "043": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.007468, + "ave_i_frame_psnr": 27.117576, + "ave_i_frame_msssim": 0.901506, + "ave_i_frame_psnr_y": 24.991237, + "ave_i_frame_psnr_u": 33.157604, + "ave_i_frame_psnr_v": 33.835580, + "ave_i_frame_msssim_y": 0.891524, + "ave_i_frame_msssim_u": 0.928012, + "ave_i_frame_msssim_v": 0.934895, + "test_time": 17261.382119, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.007468, + "ave_all_frame_psnr": 27.117576, + "ave_all_frame_msssim": 0.901506, + "ave_all_frame_psnr_y": 24.991237, + "ave_all_frame_psnr_u": 33.157604, + "ave_all_frame_psnr_v": 33.835580, + "ave_all_frame_msssim_y": 0.891524, + "ave_all_frame_msssim_u": 0.928012, + "ave_all_frame_msssim_v": 0.934895, + "qp": 43, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "046": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004154, + "ave_i_frame_psnr": 25.853632, + "ave_i_frame_msssim": 0.858082, + "ave_i_frame_psnr_y": 23.658186, + "ave_i_frame_psnr_u": 32.132005, + "ave_i_frame_psnr_v": 32.747938, + "ave_i_frame_msssim_y": 0.841288, + "ave_i_frame_msssim_u": 0.904621, + "ave_i_frame_msssim_v": 0.912302, + "test_time": 12879.771523, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004154, + "ave_all_frame_psnr": 25.853632, + "ave_all_frame_msssim": 0.858082, + "ave_all_frame_psnr_y": 23.658186, + "ave_all_frame_psnr_u": 32.132005, + "ave_all_frame_psnr_v": 32.747938, + "ave_all_frame_msssim_y": 0.841288, + "ave_all_frame_msssim_u": 0.904621, + "ave_all_frame_msssim_v": 0.912302, + "qp": 46, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + }, + "049": { + "frame_pixel_num": 399360, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.002365, + "ave_i_frame_psnr": 24.715175, + "ave_i_frame_msssim": 0.802524, + "ave_i_frame_psnr_y": 22.490245, + "ave_i_frame_psnr_u": 31.092699, + "ave_i_frame_psnr_v": 31.687227, + "ave_i_frame_msssim_y": 0.776906, + "ave_i_frame_msssim_u": 0.874953, + "ave_i_frame_msssim_v": 0.883809, + "test_time": 9708.933739, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.002365, + "ave_all_frame_psnr": 24.715175, + "ave_all_frame_msssim": 0.802524, + "ave_all_frame_psnr_y": 22.490245, + "ave_all_frame_psnr_u": 31.092699, + "ave_all_frame_psnr_v": 31.687227, + "ave_all_frame_msssim_y": 0.776906, + "ave_all_frame_msssim_u": 0.874953, + "ave_all_frame_msssim_v": 0.883809, + "qp": 49, + "ds_name": "HEVC_C", + "seq_name": "PartyScene_832x480_50.yuv" + } + }, + "RaceHorses_832x480_30.yuv": { + "022": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.376380, + "ave_i_frame_psnr": 40.329098, + "ave_i_frame_msssim": 0.992562, + "ave_i_frame_psnr_y": 39.876809, + "ave_i_frame_psnr_u": 40.953543, + "ave_i_frame_psnr_v": 42.418387, + "ave_i_frame_msssim_y": 0.993317, + "ave_i_frame_msssim_u": 0.990014, + "ave_i_frame_msssim_v": 0.990574, + "test_time": 62159.254373, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.376380, + "ave_all_frame_psnr": 40.329098, + "ave_all_frame_msssim": 0.992562, + "ave_all_frame_psnr_y": 39.876809, + "ave_all_frame_psnr_u": 40.953543, + "ave_all_frame_psnr_v": 42.418387, + "ave_all_frame_msssim_y": 0.993317, + "ave_all_frame_msssim_u": 0.990014, + "ave_all_frame_msssim_v": 0.990574, + "qp": 22, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "025": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.202789, + "ave_i_frame_psnr": 38.202706, + "ave_i_frame_msssim": 0.988157, + "ave_i_frame_psnr_y": 37.559658, + "ave_i_frame_psnr_u": 39.318593, + "ave_i_frame_psnr_v": 40.945110, + "ave_i_frame_msssim_y": 0.989143, + "ave_i_frame_msssim_u": 0.984430, + "ave_i_frame_msssim_v": 0.985971, + "test_time": 52683.813170, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.202789, + "ave_all_frame_psnr": 38.202706, + "ave_all_frame_msssim": 0.988157, + "ave_all_frame_psnr_y": 37.559658, + "ave_all_frame_psnr_u": 39.318593, + "ave_all_frame_psnr_v": 40.945110, + "ave_all_frame_msssim_y": 0.989143, + "ave_all_frame_msssim_u": 0.984430, + "ave_all_frame_msssim_v": 0.985971, + "qp": 25, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "028": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.114657, + "ave_i_frame_psnr": 36.308714, + "ave_i_frame_msssim": 0.981668, + "ave_i_frame_psnr_y": 35.494045, + "ave_i_frame_psnr_u": 37.863906, + "ave_i_frame_psnr_v": 39.641540, + "ave_i_frame_msssim_y": 0.982771, + "ave_i_frame_msssim_u": 0.976389, + "ave_i_frame_msssim_v": 0.980331, + "test_time": 45565.157812, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.114657, + "ave_all_frame_psnr": 36.308714, + "ave_all_frame_msssim": 0.981668, + "ave_all_frame_psnr_y": 35.494045, + "ave_all_frame_psnr_u": 37.863906, + "ave_all_frame_psnr_v": 39.641540, + "ave_all_frame_msssim_y": 0.982771, + "ave_all_frame_msssim_u": 0.976389, + "ave_all_frame_msssim_v": 0.980331, + "qp": 28, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "031": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.068348, + "ave_i_frame_psnr": 34.565298, + "ave_i_frame_msssim": 0.971811, + "ave_i_frame_psnr_y": 33.525073, + "ave_i_frame_psnr_u": 36.738930, + "ave_i_frame_psnr_v": 38.633019, + "ave_i_frame_msssim_y": 0.972237, + "ave_i_frame_msssim_u": 0.966470, + "ave_i_frame_msssim_v": 0.974598, + "test_time": 36744.717673, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.068348, + "ave_all_frame_psnr": 34.565298, + "ave_all_frame_msssim": 0.971811, + "ave_all_frame_psnr_y": 33.525073, + "ave_all_frame_psnr_u": 36.738930, + "ave_all_frame_psnr_v": 38.633019, + "ave_all_frame_msssim_y": 0.972237, + "ave_all_frame_msssim_u": 0.966470, + "ave_all_frame_msssim_v": 0.974598, + "qp": 31, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "034": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.043653, + "ave_i_frame_psnr": 33.092429, + "ave_i_frame_msssim": 0.958954, + "ave_i_frame_psnr_y": 31.900932, + "ave_i_frame_psnr_u": 35.751630, + "ave_i_frame_psnr_v": 37.582208, + "ave_i_frame_msssim_y": 0.958002, + "ave_i_frame_msssim_u": 0.956139, + "ave_i_frame_msssim_v": 0.967483, + "test_time": 26955.753032, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.043653, + "ave_all_frame_psnr": 33.092429, + "ave_all_frame_msssim": 0.958954, + "ave_all_frame_psnr_y": 31.900932, + "ave_all_frame_psnr_u": 35.751630, + "ave_all_frame_psnr_v": 37.582208, + "ave_all_frame_msssim_y": 0.958002, + "ave_all_frame_msssim_u": 0.956139, + "ave_all_frame_msssim_v": 0.967483, + "qp": 34, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "037": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.027644, + "ave_i_frame_psnr": 31.749426, + "ave_i_frame_msssim": 0.941144, + "ave_i_frame_psnr_y": 30.321433, + "ave_i_frame_psnr_u": 35.174338, + "ave_i_frame_psnr_v": 36.892474, + "ave_i_frame_msssim_y": 0.936223, + "ave_i_frame_msssim_u": 0.950118, + "ave_i_frame_msssim_v": 0.961691, + "test_time": 21428.306087, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.027644, + "ave_all_frame_psnr": 31.749426, + "ave_all_frame_msssim": 0.941144, + "ave_all_frame_psnr_y": 30.321433, + "ave_all_frame_psnr_u": 35.174338, + "ave_all_frame_psnr_v": 36.892474, + "ave_all_frame_msssim_y": 0.936223, + "ave_all_frame_msssim_u": 0.950118, + "ave_all_frame_msssim_v": 0.961691, + "qp": 37, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "040": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.016993, + "ave_i_frame_psnr": 30.374441, + "ave_i_frame_msssim": 0.913865, + "ave_i_frame_psnr_y": 28.791012, + "ave_i_frame_psnr_u": 34.324951, + "ave_i_frame_psnr_v": 35.924507, + "ave_i_frame_msssim_y": 0.903000, + "ave_i_frame_msssim_u": 0.939886, + "ave_i_frame_msssim_v": 0.953034, + "test_time": 16398.528281, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.016993, + "ave_all_frame_psnr": 30.374441, + "ave_all_frame_msssim": 0.913865, + "ave_all_frame_psnr_y": 28.791012, + "ave_all_frame_psnr_u": 34.324951, + "ave_all_frame_psnr_v": 35.924507, + "ave_all_frame_msssim_y": 0.903000, + "ave_all_frame_msssim_u": 0.939886, + "ave_all_frame_msssim_v": 0.953034, + "qp": 40, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "043": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.010421, + "ave_i_frame_psnr": 29.129369, + "ave_i_frame_msssim": 0.878012, + "ave_i_frame_psnr_y": 27.427152, + "ave_i_frame_psnr_u": 33.495478, + "ave_i_frame_psnr_v": 34.976561, + "ave_i_frame_msssim_y": 0.858935, + "ave_i_frame_msssim_u": 0.927915, + "ave_i_frame_msssim_v": 0.942575, + "test_time": 12056.714354, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.010421, + "ave_all_frame_psnr": 29.129369, + "ave_all_frame_msssim": 0.878012, + "ave_all_frame_psnr_y": 27.427152, + "ave_all_frame_psnr_u": 33.495478, + "ave_all_frame_psnr_v": 34.976561, + "ave_all_frame_msssim_y": 0.858935, + "ave_all_frame_msssim_u": 0.927915, + "ave_all_frame_msssim_v": 0.942575, + "qp": 43, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "046": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006579, + "ave_i_frame_psnr": 27.962048, + "ave_i_frame_msssim": 0.843127, + "ave_i_frame_psnr_y": 26.278109, + "ave_i_frame_psnr_u": 32.376944, + "ave_i_frame_psnr_v": 33.650788, + "ave_i_frame_msssim_y": 0.818929, + "ave_i_frame_msssim_u": 0.907531, + "ave_i_frame_msssim_v": 0.923908, + "test_time": 8595.894438, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006579, + "ave_all_frame_psnr": 27.962048, + "ave_all_frame_msssim": 0.843127, + "ave_all_frame_psnr_y": 26.278109, + "ave_all_frame_psnr_u": 32.376944, + "ave_all_frame_psnr_v": 33.650788, + "ave_all_frame_msssim_y": 0.818929, + "ave_all_frame_msssim_u": 0.907531, + "ave_all_frame_msssim_v": 0.923908, + "qp": 46, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + }, + "049": { + "frame_pixel_num": 399360, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004187, + "ave_i_frame_psnr": 26.774718, + "ave_i_frame_msssim": 0.805625, + "ave_i_frame_psnr_y": 25.142004, + "ave_i_frame_psnr_u": 31.150913, + "ave_i_frame_psnr_v": 32.194806, + "ave_i_frame_msssim_y": 0.778607, + "ave_i_frame_msssim_u": 0.877978, + "ave_i_frame_msssim_v": 0.895381, + "test_time": 6306.863294, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004187, + "ave_all_frame_psnr": 26.774718, + "ave_all_frame_msssim": 0.805625, + "ave_all_frame_psnr_y": 25.142004, + "ave_all_frame_psnr_u": 31.150913, + "ave_all_frame_psnr_v": 32.194806, + "ave_all_frame_msssim_y": 0.778607, + "ave_all_frame_msssim_u": 0.877978, + "ave_all_frame_msssim_v": 0.895381, + "qp": 49, + "ds_name": "HEVC_C", + "seq_name": "RaceHorses_832x480_30.yuv" + } + } + }, + "HEVC_D": { + "BasketballPass_416x240_50.yuv": { + "022": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.271084, + "ave_i_frame_psnr": 41.579519, + "ave_i_frame_msssim": 0.994900, + "ave_i_frame_psnr_y": 41.075044, + "ave_i_frame_psnr_u": 43.463829, + "ave_i_frame_psnr_v": 42.722061, + "ave_i_frame_msssim_y": 0.995395, + "ave_i_frame_msssim_u": 0.992365, + "ave_i_frame_msssim_v": 0.994468, + "test_time": 21510.494120, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.271084, + "ave_all_frame_psnr": 41.579519, + "ave_all_frame_msssim": 0.994900, + "ave_all_frame_psnr_y": 41.075044, + "ave_all_frame_psnr_u": 43.463829, + "ave_all_frame_psnr_v": 42.722061, + "ave_all_frame_msssim_y": 0.995395, + "ave_all_frame_msssim_u": 0.992365, + "ave_all_frame_msssim_v": 0.994468, + "qp": 22, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "025": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.172652, + "ave_i_frame_psnr": 39.273492, + "ave_i_frame_msssim": 0.991287, + "ave_i_frame_psnr_y": 38.632077, + "ave_i_frame_psnr_u": 41.762868, + "ave_i_frame_psnr_v": 40.632609, + "ave_i_frame_msssim_y": 0.991897, + "ave_i_frame_msssim_u": 0.987825, + "ave_i_frame_msssim_v": 0.991092, + "test_time": 18632.701389, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.172652, + "ave_all_frame_psnr": 39.273492, + "ave_all_frame_msssim": 0.991287, + "ave_all_frame_psnr_y": 38.632077, + "ave_all_frame_psnr_u": 41.762868, + "ave_all_frame_psnr_v": 40.632609, + "ave_all_frame_msssim_y": 0.991897, + "ave_all_frame_msssim_u": 0.987825, + "ave_all_frame_msssim_v": 0.991092, + "qp": 25, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "028": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.107367, + "ave_i_frame_psnr": 37.072875, + "ave_i_frame_msssim": 0.985266, + "ave_i_frame_psnr_y": 36.263579, + "ave_i_frame_psnr_u": 40.205297, + "ave_i_frame_psnr_v": 38.796232, + "ave_i_frame_msssim_y": 0.985825, + "ave_i_frame_msssim_u": 0.981251, + "ave_i_frame_msssim_v": 0.985930, + "test_time": 15873.329253, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.107367, + "ave_all_frame_psnr": 37.072875, + "ave_all_frame_msssim": 0.985266, + "ave_all_frame_psnr_y": 36.263579, + "ave_all_frame_psnr_u": 40.205297, + "ave_all_frame_psnr_v": 38.796232, + "ave_all_frame_msssim_y": 0.985825, + "ave_all_frame_msssim_u": 0.981251, + "ave_all_frame_msssim_v": 0.985930, + "qp": 28, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "031": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.067000, + "ave_i_frame_psnr": 35.098993, + "ave_i_frame_msssim": 0.976298, + "ave_i_frame_psnr_y": 34.050196, + "ave_i_frame_psnr_u": 38.991049, + "ave_i_frame_psnr_v": 37.499724, + "ave_i_frame_msssim_y": 0.975918, + "ave_i_frame_msssim_u": 0.973953, + "ave_i_frame_msssim_v": 0.980918, + "test_time": 13879.858457, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.067000, + "ave_all_frame_psnr": 35.098993, + "ave_all_frame_msssim": 0.976298, + "ave_all_frame_psnr_y": 34.050196, + "ave_all_frame_psnr_u": 38.991049, + "ave_all_frame_psnr_v": 37.499724, + "ave_all_frame_msssim_y": 0.975918, + "ave_all_frame_msssim_u": 0.973953, + "ave_all_frame_msssim_v": 0.980918, + "qp": 31, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "034": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.044834, + "ave_i_frame_psnr": 33.471395, + "ave_i_frame_msssim": 0.964034, + "ave_i_frame_psnr_y": 32.313780, + "ave_i_frame_psnr_u": 37.734764, + "ave_i_frame_psnr_v": 36.153718, + "ave_i_frame_msssim_y": 0.962806, + "ave_i_frame_msssim_u": 0.962774, + "ave_i_frame_msssim_v": 0.972660, + "test_time": 10957.925470, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.044834, + "ave_all_frame_psnr": 33.471395, + "ave_all_frame_msssim": 0.964034, + "ave_all_frame_psnr_y": 32.313780, + "ave_all_frame_psnr_u": 37.734764, + "ave_all_frame_psnr_v": 36.153718, + "ave_all_frame_msssim_y": 0.962806, + "ave_all_frame_msssim_u": 0.962774, + "ave_all_frame_msssim_v": 0.972660, + "qp": 34, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "037": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.030195, + "ave_i_frame_psnr": 32.043418, + "ave_i_frame_msssim": 0.948610, + "ave_i_frame_psnr_y": 30.659665, + "ave_i_frame_psnr_u": 37.054674, + "ave_i_frame_psnr_v": 35.334679, + "ave_i_frame_msssim_y": 0.944217, + "ave_i_frame_msssim_u": 0.955984, + "ave_i_frame_msssim_v": 0.967590, + "test_time": 8362.739881, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.030195, + "ave_all_frame_psnr": 32.043418, + "ave_all_frame_msssim": 0.948610, + "ave_all_frame_psnr_y": 30.659665, + "ave_all_frame_psnr_u": 37.054674, + "ave_all_frame_psnr_v": 35.334679, + "ave_all_frame_msssim_y": 0.944217, + "ave_all_frame_msssim_u": 0.955984, + "ave_all_frame_msssim_v": 0.967590, + "qp": 37, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "040": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.019905, + "ave_i_frame_psnr": 30.574298, + "ave_i_frame_msssim": 0.926764, + "ave_i_frame_psnr_y": 29.082687, + "ave_i_frame_psnr_u": 36.029007, + "ave_i_frame_psnr_v": 34.069253, + "ave_i_frame_msssim_y": 0.919676, + "ave_i_frame_msssim_u": 0.940894, + "ave_i_frame_msssim_v": 0.955159, + "test_time": 6381.956493, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.019905, + "ave_all_frame_psnr": 30.574298, + "ave_all_frame_msssim": 0.926764, + "ave_all_frame_psnr_y": 29.082687, + "ave_all_frame_psnr_u": 36.029007, + "ave_all_frame_psnr_v": 34.069253, + "ave_all_frame_msssim_y": 0.919676, + "ave_all_frame_msssim_u": 0.940894, + "ave_all_frame_msssim_v": 0.955159, + "qp": 40, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "043": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013151, + "ave_i_frame_psnr": 29.155706, + "ave_i_frame_msssim": 0.899647, + "ave_i_frame_psnr_y": 27.549804, + "ave_i_frame_psnr_u": 35.103920, + "ave_i_frame_psnr_v": 32.842903, + "ave_i_frame_msssim_y": 0.888637, + "ave_i_frame_msssim_u": 0.925522, + "ave_i_frame_msssim_v": 0.939834, + "test_time": 4554.094124, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013151, + "ave_all_frame_psnr": 29.155706, + "ave_all_frame_msssim": 0.899647, + "ave_all_frame_psnr_y": 27.549804, + "ave_all_frame_psnr_u": 35.103920, + "ave_all_frame_psnr_v": 32.842903, + "ave_all_frame_msssim_y": 0.888637, + "ave_all_frame_msssim_u": 0.925522, + "ave_all_frame_msssim_v": 0.939834, + "qp": 43, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "046": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008566, + "ave_i_frame_psnr": 27.738428, + "ave_i_frame_msssim": 0.864237, + "ave_i_frame_psnr_y": 26.114329, + "ave_i_frame_psnr_u": 33.862739, + "ave_i_frame_psnr_v": 31.358708, + "ave_i_frame_msssim_y": 0.851012, + "ave_i_frame_msssim_u": 0.894958, + "ave_i_frame_msssim_v": 0.912866, + "test_time": 3301.087064, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008566, + "ave_all_frame_psnr": 27.738428, + "ave_all_frame_msssim": 0.864237, + "ave_all_frame_psnr_y": 26.114329, + "ave_all_frame_psnr_u": 33.862739, + "ave_all_frame_psnr_v": 31.358708, + "ave_all_frame_msssim_y": 0.851012, + "ave_all_frame_msssim_u": 0.894958, + "ave_all_frame_msssim_v": 0.912866, + "qp": 46, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + }, + "049": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005642, + "ave_i_frame_psnr": 26.317852, + "ave_i_frame_msssim": 0.815109, + "ave_i_frame_psnr_y": 24.683295, + "ave_i_frame_psnr_u": 32.597762, + "ave_i_frame_psnr_v": 29.845285, + "ave_i_frame_msssim_y": 0.798618, + "ave_i_frame_msssim_u": 0.854634, + "ave_i_frame_msssim_v": 0.874531, + "test_time": 2478.748799, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005642, + "ave_all_frame_psnr": 26.317852, + "ave_all_frame_msssim": 0.815109, + "ave_all_frame_psnr_y": 24.683295, + "ave_all_frame_psnr_u": 32.597762, + "ave_all_frame_psnr_v": 29.845285, + "ave_all_frame_msssim_y": 0.798618, + "ave_all_frame_msssim_u": 0.854634, + "ave_all_frame_msssim_v": 0.874531, + "qp": 49, + "ds_name": "HEVC_D", + "seq_name": "BasketballPass_416x240_50.yuv" + } + }, + "BlowingBubbles_416x240_50.yuv": { + "022": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.300652, + "ave_i_frame_psnr": 38.715173, + "ave_i_frame_msssim": 0.994484, + "ave_i_frame_psnr_y": 38.030147, + "ave_i_frame_psnr_u": 40.395990, + "ave_i_frame_psnr_v": 41.144507, + "ave_i_frame_msssim_y": 0.995876, + "ave_i_frame_msssim_u": 0.989503, + "ave_i_frame_msssim_v": 0.991108, + "test_time": 22553.737204, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.300652, + "ave_all_frame_psnr": 38.715173, + "ave_all_frame_msssim": 0.994484, + "ave_all_frame_psnr_y": 38.030147, + "ave_all_frame_psnr_u": 40.395990, + "ave_all_frame_psnr_v": 41.144507, + "ave_all_frame_msssim_y": 0.995876, + "ave_all_frame_msssim_u": 0.989503, + "ave_all_frame_msssim_v": 0.991108, + "qp": 22, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "025": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.172161, + "ave_i_frame_psnr": 36.552301, + "ave_i_frame_msssim": 0.990951, + "ave_i_frame_psnr_y": 35.693133, + "ave_i_frame_psnr_u": 38.845471, + "ave_i_frame_psnr_v": 39.414141, + "ave_i_frame_msssim_y": 0.993003, + "ave_i_frame_msssim_u": 0.983942, + "ave_i_frame_msssim_v": 0.985649, + "test_time": 18766.184671, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.172161, + "ave_all_frame_psnr": 36.552301, + "ave_all_frame_msssim": 0.990951, + "ave_all_frame_psnr_y": 35.693133, + "ave_all_frame_psnr_u": 38.845471, + "ave_all_frame_psnr_v": 39.414141, + "ave_all_frame_msssim_y": 0.993003, + "ave_all_frame_msssim_u": 0.983942, + "ave_all_frame_msssim_v": 0.985649, + "qp": 25, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "028": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.101663, + "ave_i_frame_psnr": 34.565379, + "ave_i_frame_msssim": 0.985435, + "ave_i_frame_psnr_y": 33.555892, + "ave_i_frame_psnr_u": 37.325307, + "ave_i_frame_psnr_v": 37.862372, + "ave_i_frame_msssim_y": 0.988337, + "ave_i_frame_msssim_u": 0.975405, + "ave_i_frame_msssim_v": 0.978049, + "test_time": 15370.598379, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.101663, + "ave_all_frame_psnr": 34.565379, + "ave_all_frame_msssim": 0.985435, + "ave_all_frame_psnr_y": 33.555892, + "ave_all_frame_psnr_u": 37.325307, + "ave_all_frame_psnr_v": 37.862372, + "ave_all_frame_msssim_y": 0.988337, + "ave_all_frame_msssim_u": 0.975405, + "ave_all_frame_msssim_v": 0.978049, + "qp": 28, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "031": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.059994, + "ave_i_frame_psnr": 32.715989, + "ave_i_frame_msssim": 0.976992, + "ave_i_frame_psnr_y": 31.534152, + "ave_i_frame_psnr_u": 36.017922, + "ave_i_frame_psnr_v": 36.505080, + "ave_i_frame_msssim_y": 0.980743, + "ave_i_frame_msssim_u": 0.964287, + "ave_i_frame_msssim_v": 0.967194, + "test_time": 11268.845172, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.059994, + "ave_all_frame_psnr": 32.715989, + "ave_all_frame_msssim": 0.976992, + "ave_all_frame_psnr_y": 31.534152, + "ave_all_frame_psnr_u": 36.017922, + "ave_all_frame_psnr_v": 36.505080, + "ave_all_frame_msssim_y": 0.980743, + "ave_all_frame_msssim_u": 0.964287, + "ave_all_frame_msssim_v": 0.967194, + "qp": 31, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "034": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.036680, + "ave_i_frame_psnr": 31.036347, + "ave_i_frame_msssim": 0.964258, + "ave_i_frame_psnr_y": 29.732744, + "ave_i_frame_psnr_u": 34.679106, + "ave_i_frame_psnr_v": 35.215207, + "ave_i_frame_msssim_y": 0.968890, + "ave_i_frame_msssim_u": 0.948367, + "ave_i_frame_msssim_v": 0.952359, + "test_time": 8258.474975, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.036680, + "ave_all_frame_psnr": 31.036347, + "ave_all_frame_msssim": 0.964258, + "ave_all_frame_psnr_y": 29.732744, + "ave_all_frame_psnr_u": 34.679106, + "ave_all_frame_psnr_v": 35.215207, + "ave_all_frame_msssim_y": 0.968890, + "ave_all_frame_msssim_u": 0.948367, + "ave_all_frame_msssim_v": 0.952359, + "qp": 34, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "037": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022449, + "ave_i_frame_psnr": 29.654347, + "ave_i_frame_msssim": 0.948928, + "ave_i_frame_psnr_y": 28.059642, + "ave_i_frame_psnr_u": 34.141733, + "ave_i_frame_psnr_v": 34.735194, + "ave_i_frame_msssim_y": 0.951247, + "ave_i_frame_msssim_u": 0.938845, + "ave_i_frame_msssim_v": 0.945096, + "test_time": 6636.657837, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022449, + "ave_all_frame_psnr": 29.654347, + "ave_all_frame_msssim": 0.948928, + "ave_all_frame_psnr_y": 28.059642, + "ave_all_frame_psnr_u": 34.141733, + "ave_all_frame_psnr_v": 34.735194, + "ave_all_frame_msssim_y": 0.951247, + "ave_all_frame_msssim_u": 0.938845, + "ave_all_frame_msssim_v": 0.945096, + "qp": 37, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "040": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013452, + "ave_i_frame_psnr": 28.301279, + "ave_i_frame_msssim": 0.925887, + "ave_i_frame_psnr_y": 26.535592, + "ave_i_frame_psnr_u": 33.295227, + "ave_i_frame_psnr_v": 33.901456, + "ave_i_frame_msssim_y": 0.925632, + "ave_i_frame_msssim_u": 0.922222, + "ave_i_frame_msssim_v": 0.931086, + "test_time": 5171.652444, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013452, + "ave_all_frame_psnr": 28.301279, + "ave_all_frame_msssim": 0.925887, + "ave_all_frame_psnr_y": 26.535592, + "ave_all_frame_psnr_u": 33.295227, + "ave_all_frame_psnr_v": 33.901456, + "ave_all_frame_msssim_y": 0.925632, + "ave_all_frame_msssim_u": 0.922222, + "ave_all_frame_msssim_v": 0.931086, + "qp": 40, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "043": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008181, + "ave_i_frame_psnr": 27.038274, + "ave_i_frame_msssim": 0.894051, + "ave_i_frame_psnr_y": 25.124031, + "ave_i_frame_psnr_u": 32.485848, + "ave_i_frame_psnr_v": 33.076159, + "ave_i_frame_msssim_y": 0.889449, + "ave_i_frame_msssim_u": 0.902272, + "ave_i_frame_msssim_v": 0.913438, + "test_time": 3775.786883, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008181, + "ave_all_frame_psnr": 27.038274, + "ave_all_frame_msssim": 0.894051, + "ave_all_frame_psnr_y": 25.124031, + "ave_all_frame_psnr_u": 32.485848, + "ave_all_frame_psnr_v": 33.076159, + "ave_all_frame_msssim_y": 0.889449, + "ave_all_frame_msssim_u": 0.902272, + "ave_all_frame_msssim_v": 0.913438, + "qp": 43, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "046": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005092, + "ave_i_frame_psnr": 25.793211, + "ave_i_frame_msssim": 0.847103, + "ave_i_frame_psnr_y": 23.835005, + "ave_i_frame_psnr_u": 31.304257, + "ave_i_frame_psnr_v": 32.031402, + "ave_i_frame_msssim_y": 0.835927, + "ave_i_frame_msssim_u": 0.869506, + "ave_i_frame_msssim_v": 0.891755, + "test_time": 2746.872026, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005092, + "ave_all_frame_psnr": 25.793211, + "ave_all_frame_msssim": 0.847103, + "ave_all_frame_psnr_y": 23.835005, + "ave_all_frame_psnr_u": 31.304257, + "ave_all_frame_psnr_v": 32.031402, + "ave_all_frame_msssim_y": 0.835927, + "ave_all_frame_msssim_u": 0.869506, + "ave_all_frame_msssim_v": 0.891755, + "qp": 46, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + }, + "049": { + "frame_pixel_num": 99840, + "i_frame_num": 500, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003371, + "ave_i_frame_psnr": 24.649341, + "ave_i_frame_msssim": 0.789922, + "ave_i_frame_psnr_y": 22.729576, + "ave_i_frame_psnr_u": 30.047653, + "ave_i_frame_psnr_v": 30.769614, + "ave_i_frame_msssim_y": 0.774213, + "ave_i_frame_msssim_u": 0.824815, + "ave_i_frame_msssim_v": 0.849285, + "test_time": 2054.751692, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003371, + "ave_all_frame_psnr": 24.649341, + "ave_all_frame_msssim": 0.789922, + "ave_all_frame_psnr_y": 22.729576, + "ave_all_frame_psnr_u": 30.047653, + "ave_all_frame_psnr_v": 30.769614, + "ave_all_frame_msssim_y": 0.774213, + "ave_all_frame_msssim_u": 0.824815, + "ave_all_frame_msssim_v": 0.849285, + "qp": 49, + "ds_name": "HEVC_D", + "seq_name": "BlowingBubbles_416x240_50.yuv" + } + }, + "BQSquare_416x240_60.yuv": { + "022": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.258646, + "ave_i_frame_psnr": 39.404213, + "ave_i_frame_msssim": 0.994177, + "ave_i_frame_psnr_y": 38.166038, + "ave_i_frame_psnr_u": 42.545982, + "ave_i_frame_psnr_v": 43.691495, + "ave_i_frame_msssim_y": 0.994997, + "ave_i_frame_msssim_u": 0.990345, + "ave_i_frame_msssim_v": 0.993092, + "test_time": 24299.148543, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.258646, + "ave_all_frame_psnr": 39.404213, + "ave_all_frame_msssim": 0.994177, + "ave_all_frame_psnr_y": 38.166038, + "ave_all_frame_psnr_u": 42.545982, + "ave_all_frame_psnr_v": 43.691495, + "ave_all_frame_msssim_y": 0.994997, + "ave_all_frame_msssim_u": 0.990345, + "ave_all_frame_msssim_v": 0.993092, + "qp": 22, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "025": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.125329, + "ave_i_frame_psnr": 37.376329, + "ave_i_frame_msssim": 0.990873, + "ave_i_frame_psnr_y": 35.806134, + "ave_i_frame_psnr_u": 41.517837, + "ave_i_frame_psnr_v": 42.655988, + "ave_i_frame_msssim_y": 0.991566, + "ave_i_frame_msssim_u": 0.986671, + "ave_i_frame_msssim_v": 0.990918, + "test_time": 19960.646071, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.125329, + "ave_all_frame_psnr": 37.376329, + "ave_all_frame_msssim": 0.990873, + "ave_all_frame_psnr_y": 35.806134, + "ave_all_frame_psnr_u": 41.517837, + "ave_all_frame_psnr_v": 42.655988, + "ave_all_frame_msssim_y": 0.991566, + "ave_all_frame_msssim_u": 0.986671, + "ave_all_frame_msssim_v": 0.990918, + "qp": 25, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "028": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.065971, + "ave_i_frame_psnr": 35.603039, + "ave_i_frame_msssim": 0.986460, + "ave_i_frame_psnr_y": 33.789602, + "ave_i_frame_psnr_u": 40.515028, + "ave_i_frame_psnr_v": 41.571670, + "ave_i_frame_msssim_y": 0.986969, + "ave_i_frame_msssim_u": 0.981918, + "ave_i_frame_msssim_v": 0.987943, + "test_time": 16045.796822, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.065971, + "ave_all_frame_psnr": 35.603039, + "ave_all_frame_msssim": 0.986460, + "ave_all_frame_psnr_y": 33.789602, + "ave_all_frame_psnr_u": 40.515028, + "ave_all_frame_psnr_v": 41.571670, + "ave_all_frame_msssim_y": 0.986969, + "ave_all_frame_msssim_u": 0.981918, + "ave_all_frame_msssim_v": 0.987943, + "qp": 28, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "031": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.036227, + "ave_i_frame_psnr": 33.920543, + "ave_i_frame_msssim": 0.980254, + "ave_i_frame_psnr_y": 31.907851, + "ave_i_frame_psnr_u": 39.491668, + "ave_i_frame_psnr_v": 40.425565, + "ave_i_frame_msssim_y": 0.980673, + "ave_i_frame_msssim_u": 0.974771, + "ave_i_frame_msssim_v": 0.983223, + "test_time": 11851.325558, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.036227, + "ave_all_frame_psnr": 33.920543, + "ave_all_frame_msssim": 0.980254, + "ave_all_frame_psnr_y": 31.907851, + "ave_all_frame_psnr_u": 39.491668, + "ave_all_frame_psnr_v": 40.425565, + "ave_all_frame_msssim_y": 0.980673, + "ave_all_frame_msssim_u": 0.974771, + "ave_all_frame_msssim_v": 0.983223, + "qp": 31, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "034": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.022249, + "ave_i_frame_psnr": 32.407897, + "ave_i_frame_msssim": 0.973123, + "ave_i_frame_psnr_y": 30.248662, + "ave_i_frame_psnr_u": 38.548843, + "ave_i_frame_psnr_v": 39.222365, + "ave_i_frame_msssim_y": 0.973553, + "ave_i_frame_msssim_u": 0.966178, + "ave_i_frame_msssim_v": 0.977491, + "test_time": 8684.784597, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.022249, + "ave_all_frame_psnr": 32.407897, + "ave_all_frame_msssim": 0.973123, + "ave_all_frame_psnr_y": 30.248662, + "ave_all_frame_psnr_u": 38.548843, + "ave_all_frame_psnr_v": 39.222365, + "ave_all_frame_msssim_y": 0.973553, + "ave_all_frame_msssim_u": 0.966178, + "ave_all_frame_msssim_v": 0.977491, + "qp": 34, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "037": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.014030, + "ave_i_frame_psnr": 31.051991, + "ave_i_frame_msssim": 0.966279, + "ave_i_frame_psnr_y": 28.614762, + "ave_i_frame_psnr_u": 37.964828, + "ave_i_frame_psnr_v": 38.762526, + "ave_i_frame_msssim_y": 0.966145, + "ave_i_frame_msssim_u": 0.959850, + "ave_i_frame_msssim_v": 0.973516, + "test_time": 6267.457376, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.014030, + "ave_all_frame_psnr": 31.051991, + "ave_all_frame_msssim": 0.966279, + "ave_all_frame_psnr_y": 28.614762, + "ave_all_frame_psnr_u": 37.964828, + "ave_all_frame_psnr_v": 38.762526, + "ave_all_frame_msssim_y": 0.966145, + "ave_all_frame_msssim_u": 0.959850, + "ave_all_frame_msssim_v": 0.973516, + "qp": 37, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "040": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.008966, + "ave_i_frame_psnr": 29.644962, + "ave_i_frame_msssim": 0.957017, + "ave_i_frame_psnr_y": 26.948158, + "ave_i_frame_psnr_u": 37.343105, + "ave_i_frame_psnr_v": 38.127648, + "ave_i_frame_msssim_y": 0.955968, + "ave_i_frame_msssim_u": 0.950987, + "ave_i_frame_msssim_v": 0.969339, + "test_time": 4472.454009, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.008966, + "ave_all_frame_psnr": 29.644962, + "ave_all_frame_msssim": 0.957017, + "ave_all_frame_psnr_y": 26.948158, + "ave_all_frame_psnr_u": 37.343105, + "ave_all_frame_psnr_v": 38.127648, + "ave_all_frame_msssim_y": 0.955968, + "ave_all_frame_msssim_u": 0.950987, + "ave_all_frame_msssim_v": 0.969339, + "qp": 40, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "043": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.005986, + "ave_i_frame_psnr": 28.281653, + "ave_i_frame_msssim": 0.945875, + "ave_i_frame_psnr_y": 25.268982, + "ave_i_frame_psnr_u": 37.070810, + "ave_i_frame_psnr_v": 37.568518, + "ave_i_frame_msssim_y": 0.942857, + "ave_i_frame_msssim_u": 0.945278, + "ave_i_frame_msssim_v": 0.964581, + "test_time": 3617.084887, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.005986, + "ave_all_frame_psnr": 28.281653, + "ave_all_frame_msssim": 0.945875, + "ave_all_frame_psnr_y": 25.268982, + "ave_all_frame_psnr_u": 37.070810, + "ave_all_frame_psnr_v": 37.568518, + "ave_all_frame_msssim_y": 0.942857, + "ave_all_frame_msssim_u": 0.945278, + "ave_all_frame_msssim_v": 0.964581, + "qp": 43, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "046": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.004127, + "ave_i_frame_psnr": 26.854486, + "ave_i_frame_msssim": 0.930159, + "ave_i_frame_psnr_y": 23.688602, + "ave_i_frame_psnr_u": 36.318881, + "ave_i_frame_psnr_v": 36.385393, + "ave_i_frame_msssim_y": 0.924732, + "ave_i_frame_msssim_u": 0.938170, + "ave_i_frame_msssim_v": 0.954708, + "test_time": 2812.480960, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.004127, + "ave_all_frame_psnr": 26.854486, + "ave_all_frame_msssim": 0.930159, + "ave_all_frame_psnr_y": 23.688602, + "ave_all_frame_psnr_u": 36.318881, + "ave_all_frame_psnr_v": 36.385393, + "ave_all_frame_msssim_y": 0.924732, + "ave_all_frame_msssim_u": 0.938170, + "ave_all_frame_msssim_v": 0.954708, + "qp": 46, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + }, + "049": { + "frame_pixel_num": 99840, + "i_frame_num": 600, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.003083, + "ave_i_frame_psnr": 25.441266, + "ave_i_frame_msssim": 0.906606, + "ave_i_frame_psnr_y": 22.179904, + "ave_i_frame_psnr_u": 35.352128, + "ave_i_frame_psnr_v": 35.098571, + "ave_i_frame_msssim_y": 0.898620, + "ave_i_frame_msssim_u": 0.921254, + "ave_i_frame_msssim_v": 0.939872, + "test_time": 2246.141007, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.003083, + "ave_all_frame_psnr": 25.441266, + "ave_all_frame_msssim": 0.906606, + "ave_all_frame_psnr_y": 22.179904, + "ave_all_frame_psnr_u": 35.352128, + "ave_all_frame_psnr_v": 35.098571, + "ave_all_frame_msssim_y": 0.898620, + "ave_all_frame_msssim_u": 0.921254, + "ave_all_frame_msssim_v": 0.939872, + "qp": 49, + "ds_name": "HEVC_D", + "seq_name": "BQSquare_416x240_60.yuv" + } + }, + "RaceHorses_416x240_30.yuv": { + "022": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.332116, + "ave_i_frame_psnr": 39.999494, + "ave_i_frame_msssim": 0.993028, + "ave_i_frame_psnr_y": 39.613411, + "ave_i_frame_psnr_u": 40.539559, + "ave_i_frame_psnr_v": 41.775930, + "ave_i_frame_msssim_y": 0.994238, + "ave_i_frame_msssim_u": 0.989166, + "ave_i_frame_msssim_v": 0.989632, + "test_time": 16118.046571, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.332116, + "ave_all_frame_psnr": 39.999494, + "ave_all_frame_msssim": 0.993028, + "ave_all_frame_psnr_y": 39.613411, + "ave_all_frame_psnr_u": 40.539559, + "ave_all_frame_psnr_v": 41.775930, + "ave_all_frame_msssim_y": 0.994238, + "ave_all_frame_msssim_u": 0.989166, + "ave_all_frame_msssim_v": 0.989632, + "qp": 22, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "025": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.206544, + "ave_i_frame_psnr": 37.663589, + "ave_i_frame_msssim": 0.988012, + "ave_i_frame_psnr_y": 37.081908, + "ave_i_frame_psnr_u": 38.775218, + "ave_i_frame_psnr_v": 40.042041, + "ave_i_frame_msssim_y": 0.989631, + "ave_i_frame_msssim_u": 0.982407, + "ave_i_frame_msssim_v": 0.983900, + "test_time": 13256.550250, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.206544, + "ave_all_frame_psnr": 37.663589, + "ave_all_frame_msssim": 0.988012, + "ave_all_frame_psnr_y": 37.081908, + "ave_all_frame_psnr_u": 38.775218, + "ave_all_frame_psnr_v": 40.042041, + "ave_all_frame_msssim_y": 0.989631, + "ave_all_frame_msssim_u": 0.982407, + "ave_all_frame_msssim_v": 0.983900, + "qp": 25, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "028": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.126641, + "ave_i_frame_psnr": 35.457111, + "ave_i_frame_msssim": 0.979483, + "ave_i_frame_psnr_y": 34.648451, + "ave_i_frame_psnr_u": 37.263380, + "ave_i_frame_psnr_v": 38.502804, + "ave_i_frame_msssim_y": 0.981034, + "ave_i_frame_msssim_u": 0.973393, + "ave_i_frame_msssim_v": 0.976268, + "test_time": 11022.721568, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.126641, + "ave_all_frame_psnr": 35.457111, + "ave_all_frame_msssim": 0.979483, + "ave_all_frame_psnr_y": 34.648451, + "ave_all_frame_psnr_u": 37.263380, + "ave_all_frame_psnr_v": 38.502804, + "ave_all_frame_msssim_y": 0.981034, + "ave_all_frame_msssim_u": 0.973393, + "ave_all_frame_msssim_v": 0.976268, + "qp": 28, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "031": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.077769, + "ave_i_frame_psnr": 33.510136, + "ave_i_frame_msssim": 0.966359, + "ave_i_frame_psnr_y": 32.438328, + "ave_i_frame_psnr_u": 36.152093, + "ave_i_frame_psnr_v": 37.299023, + "ave_i_frame_msssim_y": 0.966411, + "ave_i_frame_msssim_u": 0.964273, + "ave_i_frame_msssim_v": 0.968139, + "test_time": 9577.669104, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.077769, + "ave_all_frame_psnr": 33.510136, + "ave_all_frame_msssim": 0.966359, + "ave_all_frame_psnr_y": 32.438328, + "ave_all_frame_psnr_u": 36.152093, + "ave_all_frame_psnr_v": 37.299023, + "ave_all_frame_msssim_y": 0.966411, + "ave_all_frame_msssim_u": 0.964273, + "ave_all_frame_msssim_v": 0.968139, + "qp": 31, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "034": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.050119, + "ave_i_frame_psnr": 31.899884, + "ave_i_frame_msssim": 0.947777, + "ave_i_frame_psnr_y": 30.695261, + "ave_i_frame_psnr_u": 34.927638, + "ave_i_frame_psnr_v": 36.099874, + "ave_i_frame_msssim_y": 0.945826, + "ave_i_frame_msssim_u": 0.950593, + "ave_i_frame_msssim_v": 0.956666, + "test_time": 7209.029020, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.050119, + "ave_all_frame_psnr": 31.899884, + "ave_all_frame_msssim": 0.947777, + "ave_all_frame_psnr_y": 30.695261, + "ave_all_frame_psnr_u": 34.927638, + "ave_all_frame_psnr_v": 36.099874, + "ave_all_frame_msssim_y": 0.945826, + "ave_all_frame_msssim_u": 0.950593, + "ave_all_frame_msssim_v": 0.956666, + "qp": 34, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "037": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.032717, + "ave_i_frame_psnr": 30.568044, + "ave_i_frame_msssim": 0.924612, + "ave_i_frame_psnr_y": 29.139569, + "ave_i_frame_psnr_u": 34.284017, + "ave_i_frame_psnr_v": 35.422925, + "ave_i_frame_msssim_y": 0.917341, + "ave_i_frame_msssim_u": 0.943302, + "ave_i_frame_msssim_v": 0.949546, + "test_time": 5366.588482, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.032717, + "ave_all_frame_psnr": 30.568044, + "ave_all_frame_msssim": 0.924612, + "ave_all_frame_psnr_y": 29.139569, + "ave_all_frame_psnr_u": 34.284017, + "ave_all_frame_psnr_v": 35.422925, + "ave_all_frame_msssim_y": 0.917341, + "ave_all_frame_msssim_u": 0.943302, + "ave_all_frame_msssim_v": 0.949546, + "qp": 37, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "040": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.021267, + "ave_i_frame_psnr": 29.274540, + "ave_i_frame_msssim": 0.897362, + "ave_i_frame_psnr_y": 27.770388, + "ave_i_frame_psnr_u": 33.271388, + "ave_i_frame_psnr_v": 34.302604, + "ave_i_frame_msssim_y": 0.886216, + "ave_i_frame_msssim_u": 0.927885, + "ave_i_frame_msssim_v": 0.933708, + "test_time": 4071.237993, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.021267, + "ave_all_frame_psnr": 29.274540, + "ave_all_frame_msssim": 0.897362, + "ave_all_frame_psnr_y": 27.770388, + "ave_all_frame_psnr_u": 33.271388, + "ave_all_frame_psnr_v": 34.302604, + "ave_all_frame_msssim_y": 0.886216, + "ave_all_frame_msssim_u": 0.927885, + "ave_all_frame_msssim_v": 0.933708, + "qp": 40, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "043": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.013878, + "ave_i_frame_psnr": 28.018806, + "ave_i_frame_msssim": 0.865901, + "ave_i_frame_psnr_y": 26.437483, + "ave_i_frame_psnr_u": 32.252560, + "ave_i_frame_psnr_v": 33.272991, + "ave_i_frame_msssim_y": 0.850919, + "ave_i_frame_msssim_u": 0.906896, + "ave_i_frame_msssim_v": 0.914792, + "test_time": 3070.635436, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.013878, + "ave_all_frame_psnr": 28.018806, + "ave_all_frame_msssim": 0.865901, + "ave_all_frame_psnr_y": 26.437483, + "ave_all_frame_psnr_u": 32.252560, + "ave_all_frame_psnr_v": 33.272991, + "ave_all_frame_msssim_y": 0.850919, + "ave_all_frame_msssim_u": 0.906896, + "ave_all_frame_msssim_v": 0.914792, + "qp": 43, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "046": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.009067, + "ave_i_frame_psnr": 26.710246, + "ave_i_frame_msssim": 0.826273, + "ave_i_frame_psnr_y": 25.137961, + "ave_i_frame_psnr_u": 31.011019, + "ave_i_frame_psnr_v": 31.843184, + "ave_i_frame_msssim_y": 0.809875, + "ave_i_frame_msssim_u": 0.872501, + "ave_i_frame_msssim_v": 0.878439, + "test_time": 2229.453698, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.009067, + "ave_all_frame_psnr": 26.710246, + "ave_all_frame_msssim": 0.826273, + "ave_all_frame_psnr_y": 25.137961, + "ave_all_frame_psnr_u": 31.011019, + "ave_all_frame_psnr_v": 31.843184, + "ave_all_frame_msssim_y": 0.809875, + "ave_all_frame_msssim_u": 0.872501, + "ave_all_frame_msssim_v": 0.878439, + "qp": 46, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + }, + "049": { + "frame_pixel_num": 99840, + "i_frame_num": 300, + "p_frame_num": 0, + "ave_i_frame_bpp": 0.006039, + "ave_i_frame_psnr": 25.422969, + "ave_i_frame_msssim": 0.779890, + "ave_i_frame_psnr_y": 23.873765, + "ave_i_frame_psnr_u": 29.639492, + "ave_i_frame_psnr_v": 30.501676, + "ave_i_frame_msssim_y": 0.760906, + "ave_i_frame_msssim_u": 0.835136, + "ave_i_frame_msssim_v": 0.838550, + "test_time": 1612.489115, + "ave_p_frame_bpp": 0, + "ave_p_frame_psnr": 0, + "ave_p_frame_msssim": 0, + "ave_p_frame_psnr_y": 0, + "ave_p_frame_psnr_u": 0, + "ave_p_frame_psnr_v": 0, + "ave_p_frame_msssim_y": 0, + "ave_p_frame_msssim_u": 0, + "ave_p_frame_msssim_v": 0, + "ave_all_frame_bpp": 0.006039, + "ave_all_frame_psnr": 25.422969, + "ave_all_frame_msssim": 0.779890, + "ave_all_frame_psnr_y": 23.873765, + "ave_all_frame_psnr_u": 29.639492, + "ave_all_frame_psnr_v": 30.501676, + "ave_all_frame_msssim_y": 0.760906, + "ave_all_frame_msssim_u": 0.835136, + "ave_all_frame_msssim_v": 0.838550, + "qp": 49, + "ds_name": "HEVC_D", + "seq_name": "RaceHorses_416x240_30.yuv" + } + } + } +} \ No newline at end of file diff --git a/assets/bd_rate_speed.png b/assets/bd_rate_speed.png index 3773a1dabc771e53456cf0131e64c371665da9c8..b829b4c2f8e2879fd6b8043ab66d99bd1076e13d 100644 GIT binary patch literal 241364 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 W?hI&GOFOe8+Kq3`jEf9i@Bb4&)7+;3 literal 142109 zcmeFZcTiPn_ce%in**2;1wqMKf(QsGB1jfQG9r?ZphU?kh@g^_NK#3Xkto@SB*~y; zC1;eJnRT>({rZ02R839Q{4rBCx2mgAx%Zy)JkQ>Ht+m%aUYFz~c5SEFPC`PmOY)+a zA_>XPtt2FW32)tqzj;w~;S|XR5)w(Vb4s@(#yahs_Fw2&_?fRn?Y@8Gb6RrhnTwOf zcCm+Oc!s4cm=7u`d2Zd#7|Gc1$dhN!hT#TB26w6e63L4vR$W}jrpGLz3;QhdHLLok z*WA8LbX1RZbj|y8blDjyndGSB+y3*)V6zRO`p+MUpL$Q6#C84Wm2r-CGp_7EuT!2M zsQ>dP5|THY{mK9S^Dn+q?{)k0&m>30u9N-w7uVb_?j-K|-`TsBCpQH1?AFKacvBF7{qaNw+uQRM* zRNyc>638H*=`gdlx-4irc6(*v75@XhRW2^BCX<{v37ux^PX|ceto-@;Gr<7?mVM>^ zzQRi{^{YaHSyXK8?CfsdWK?+Zq1~div%qGQ>2my7NB(qkvPvcW-Me>FHS%(s?gTfP z%q~t3iY)d8K0LtE@=~Fr= z_U+UB{K0G*x%SfoSq7g4?5Fe`911j3b>4d%b6t70>63Bf%wrakI~QJ-8*lnIwlWVK zJUF*H-<^K7Sb&{f&Q3O1YId&O!fvFgqPBMO$M^T`xn{{K>0PZ^hM&3R%ub#>>AJQ! zD6+mXT`RIKCN5stAI@hn(Op_<>uh0Rk+1Hxmo7@g)ja;Lx~Qn=J6!me6tx%`62+;h zsgdqd*WNO3`H0i6Oj|SGym@0Y+7f2(*TR%=YZFPv)-BSc|6UbIhRM&LKXKVVlddEO z1O~YY+-cX{`TACjy@#PeVq&5<1#iL4@At^w)zp}O@}cZ3 zwEOZh(BJ3W=WD8(t$(^dmA(~m!|gs`d|*Wa{_MtE&OcRYof#yv8!bErOMv^n`pob(}M$sEJl zs4$x#`@2!U_VthYbw}o?kOL1V=cStM%vXyRzQ2Evtel!8ui@&tj^H|F+#puDD|1Zo zx>Q(eSK zDvhL^9Q6!oBqRrQ3{ji@eJKxOVX?1x8_y*7|ck^Q+c z>$+7TY=_u2{p_r=vRl5s(iJ*$#+_G|;%^!;;>e~dC(B2jNt93a+Q+cn00qB~=}#oF zu5Ds6k`V2Z#Cn+X+MV$5aGm1(*RTKHym>p#-o1MtbDk#m^7Zw#v@3gj7_rcri$Dnt z4BST?-~Z(@EU+l^lieyIkB{1_z#rZp~4rq@r5u z`S|GZ{zK~f2Db6L4ILj;p^A;UstRjf{jOw0UdwY*gI)oK}U;pC5gWZ%4lU+iqf|7D_YrVcAOEbg0!^2@w zQE9qgkDM|cYRgFu4OP+8i|w%e{_Z}J$8X*GIXlay^zstUZ`#%3q`~LiMfO=n^)KjU zpPm*J3}wDjSyffl+M18s)^=I!_ddcm?!;ysVb#v^Z5CBasjvKVnY4e}C)= z1y)|(S>%|p)~p0B`ynK|6B0f%Q&Y?cM4ZXU$ViP`(|ngz2cdmY=G`SiSV5^^W`04z zWgM&9w_g_&V564t0Zj?{3JzrA50U2=6J`9b?f5qi`V@qPg)4JjwB=c>&v(0qPuw)g zarpS~K$c;x&*R5Psy%hj&*OHMkO+1hV*h)~76}Q79WQ^3%05H$%okc)?B2KB{q zP7$ki%DhAMh1j;nS?UUX%?%{1lDqz0__K)J<}YbljSIZvf%3v9JHH161oUZ!l{hb# z*iVZu8X?ni^~a%Vb6hQ|t8Wk0c42Bhiaa5%^8ER8*{3}9w@pxEm0QA2nW-l##$~(8 zV*xKK7ut@iqmr;7yc83In%}*DkF~t|?Cb^xhJ;gQZ8PKTeALuu)jqYhE)F*)2$Ypt z4a#lVvV}$rRV29A*UPJ(s)&`7le2v~BGKL59ZPBr7&+kC4*dIpBk)>?oHF4+{s z#KhNEF)JOs^o#+2|NVE7(;`=+IqKKy>gxE|m_bcMSWpmcXm_DqI=0x76wAAH#|~}< z(g4je#Bk=HKz`vEDb<-eMwIrG^{<*tY`ROF`7F9v-O0K1%CQaG_cK0A`8G0Ap!;bz zKi?3NAl6?}My5JD59y>fN=RdCeWBgtm1JdO>no_*00Rq4OC#j+IFTrwwnKF^ozwle zMt2X7t`cX*wUx!nsSA$|&W?UbN70jy78bhw;~PqSx>jMX-DKDC3lA?I0J?CycQ12f z4twdgd6yK%KQ>zmIlSIo`L5q7t3-SU@yddf^-()I8eepz5IluNA?)sx;+xOk_P zpP!nOuCy0B<_WK68`WROnO~ltB;C68Qb_6YM4^Pw(ZhV^9RMc#_U^q}>_EV+;e==b z0f9=JH0{#0wdKhh^M@%ZJF)D3etyr07qz_uEsZ{0_R}%ftu#rf=*4@($gU67Juh9I3(wXn zc9>;RNz+?8YBe%9-VWHiW81chnR@)Zj;fB`Y)(kV7U5{9cClSaYQkLu(k3d5m;0Xp zHjzQ$mImgG&NXXi9<`qAaz-%WUB#CD4|yI1c<@^dIN_fgasfk7&UtnREmOI_>fKIq zZO@;aamBa1{G#_>An?ma837!xJ~uA+qY)UOv$V4doq9lvGqMhB5Oe_O8?d*rp~0PO zvUvWga_bRMPo#oj?%b*Vs?p1-fS+4_2kj+gDfrC7D9ig{iprsWP6EpgP)mlJ} zi5o{f(sy|M{QQH;c3{%a%)tx^%qnS4b7N}u=lFJQ*?sh-TGl`Wzg28wa(LOJ*9M;{ z#+8oHh!H4&RrMLGTBe?t<$QG*H^O|c=uS!jp2i3&8ZqS0zHwAt@5CpT-EN%ch+K2; z4+-I$E8WXH4~F$8xg$|m8d5{hx+!4I?Xn#R7%W`wOXw%*%)htjXzIC z*+MO>wl%H1P-vZzm1SjV8DN(sHH0u#kUJe)tQt<%^X;u0GG;@rWgJ@^B9)nevA}B3 zN7$|D!Gi~%;$_2aCpyB6#g%|U2BTfOUf=3P(HNPK&<#u7O(~#v#R}Q`0E=>v-TXx7 z5lTw7Nte~xFAd_44zgvAJO|*8ii(<=cLwOwCtdVoQMZ>4P=jP^4h(BJy`HkzGnVA9Z!P_La`agNHfC_T4 zKO7kt@uVEdn3aj@vN%+KLPSI)W`_Et!~eczx9#nXgNhtxD~BZVf#bPE=-WR~(})3< z^nG}SPe1=)_bhPO);-6Lxy}qJBzC-ie_rra1qGu@R)FDVMa7ycfmg2kk-Y$_zaWuO;Ds6TY)Gf|KQ5=R`fRijrRE zP#UBWZrg(s`CAD}5!4d6OeIF;1vnx6Utmn))%A}&QZoMJ)<1hL^rwY~YvjrT3Z!)u z<6YUedOmn%XY&}hfBEv|;$J*@d0h_DT|gO5vm;lqKQ=1doq@A+b4Z7?AWVp#xv^I6 z{_`N0LJl*p5!VkMNU-}VmN?l93JUVej(mJ{sG$tE(y!BJl+VL|nR#Als|ImV)PE>j zepix|BxCxJ-o-_v0M;z|goR5k`X4U{S4vd8kbh*)9vU;vVuvg2tXGnP{5Kn!1F!^T z=^@9X#O#W;0PQTFpfHPpz0MDS8HTvs5K0aMt zT~qgr(zQ!NPW7pr0&$Lhe9|m`^4wP`Y_B`ne+hxt*i4Yl{H1TLEZmAYM#s!7mCwR( zf9MiQb-z2imzP(A$C<{*WXA;r+K9zMmYE-EmhRHZH4Q7{x*BlfOPb`7-cP=EmX=(z zFV6@GA%+BR|G4Hom2>0Ei0Y(_Yh~E&zG}|JO|mjFO$?mb{Uuv;SU|nV{$vPTf`WxW zb}Z6h=Tv+5Uhjx8swSO5SV!c7ioMQ$t~osRv-eXOd89saPb{EU!yF13N+S=mCh7xz zQ`A#E$HaN6f+3$@*}=gf-bQUa3njmUxkF^zc^32MxHqZo$LB)-YwGS)m!(7YL>caMJrcSR7}}INQm{m zw`oV^{qNtuGchrhkw4oM#Hi4N+&r~W2Li`apgm2^h-}BHz6vTKhnLMGX^N5U*H+TQqY#ol2vkQFV z&YyX7eaFt7K?xTAtm@f}Cr-TgeDG2+?xCehG;8384`Tff<%q*`>fu2)=0i!%CNZqH z^qBy!6XYV*v1@K_ZtAH~f_CP(2NQsU7h+yWktq2S;N93gigce1E32!nOT!7Vv9v;? zh57lYfAVTCUXe%W1abc?pH^bhu7i>@)U6>V=KjioEcbv4iC^uX((sDwrX2^5@|j0u z_Mu)vk>c#38EHxcZ(*8*93#?B54;qZ2NpTflFDLsqmP`D-}1xh^Vwv4{TNy;GQDp$6BvecC zj_#~>Va>n`TuL`x9e-@Fc|Lx6Pl-X%+ZEST=GqAhG4{A1cUS3{K z&L7}MNZ76@&r9=@BFHxK!i#zxuW#+5;PH#LoLF35-a#`^9X37HFD(@QwY{Cijz#IE zU)4$Cc%>>!x5r5MhE(M@@_{Td8YWNjfP^CrHqa!n;oGqErbCt9WLrnNQ7d%WgEZ|~*w zt3vkkfHRh#WtgHxO-xL3ZK~<{`SU?}1??s}UgLn@7qvrMLdG*}ms(8W zEdo1?ax<)n;KyoLO7J!WBW_M%fn=7UUraV8)Z*&E!x%Zl4TAm$C;XY^!WI^KeNoZ- zzkQ<)Md-dn<@P-$(vq+UwzYBN#(~=CZhRp^i*eZ>?Ef{wv%&WI^&W^xnIlB3Li;!* z%46Pf8y7+0yPKTzZ2phNV#j#_yNQ*V;mh78D5pb^JGnRv-+SzW?$P$Zadj!jl8?|b z6zFJa83#Qom?e=jP5_UzN)^_C^+E$Z;r<%I1X$p*@cjWmMzny<2!tto+HHUh@H?*Y z4o-x}rtSOvav5ZwW;@K9bk0J5lOA5#L9_h;bF6=Fa4>?+VD{3bOMcc=NPiH_XuTy+ zvo(NW^ea--vXB9?AUSLyrHYM{OFRJ z9{t(>p%En1@~3ZpJA3Wgw?~IK`t|}l0FU_|;Y$Pdt?Yk83pEGX>kDzs$AmS(6KjQ+ zO+oun48v^Kkd>h$cI8`1v_*=zuFVWL@{U9Z*d!r3EV_z}zh-=o5^_Ykd}=HLL32AP zX{hv>GiStoj<#Yu002?K!^t$2KxyJUUM z(VjS_fMSipLr7Rhcui<0H*eX(GI%zCQpBYQ{AX$cu$d@aBS%pU0G`^+g2%?jG&MDG z7_T6m;2wOTNT5y>gb!VUoQUPGEYvM~9L8r61p!GsCp$Yk+GWWYx2M<^7!%Wr3@2ba z_QW_EXA?K`ylC{>w;zr2BHmO&>T!xp$@mNt1cymZf$ex3R=?>9`$bC#HwZrf&KSkj zXzkmel8axoT`TP6#K+E&3ld7@xj$NY&!jaqJ5cWqvZ|6DJC@EmKQjYmQ3t^SluU8x z(EQ5cG|~lda;Ee;d0s1O=h4v}Q@PjYEW$IOeQWXlsVL2ZbXAAPY$z zLNXR&6)XziFzAX14Gm4CfX#Lgu_RF}_- zi^QGs8(#v|B=QjOHKXH>9XpP2UV8)7&>sLD1?pQ4{;M>>+KwPpLD~C3x8_0NvQ3($ z)Yy>kusgVi&r4^Fp$axN#7P4jq`B^k1MHq`%aK-t+~tpB2O*=YySwz#b5UF;*t04& z4QH?KggMq8z+Y`P(Vx5te9&zR>1Ie0>ubySXLjY3uLw4zVBDtbb{ZV1Jx7m57%Thr z0mB3CUNLAl8U<9pc{3w9IoazUoov&eWmS)Zi^~$w!f|el-+9Rz-2vrh)WT()Odyny2`CntwKXiW_f>CwD5Lb!TqS#anVCkiJ+*tL@UcPPHT`TeAB znG+H*!u!YUtn=E6J&FlP;8!3@LWZzG6`sZ$JUl#1QcloM|NJ>zAM+`IP8y5{i@ksE z-hg4rA9Hh2;1!62p5ERY%}F-U8f093kjEB~LUGAVp|o^#pTqekQ4?ydQ(wtIA&eGs z%mq1jXi7nq&tmc#q@O+x`l(JEBVKNubhk%il^2Cb~DL`SmxM?mHu z|6J9+H&vk=q?7_PeHDQ}e*8e~PKb*OUeeyMVFLyCXx~L8B{Yf>&|1M^?Z>OPw=q^S zFk(PePfrh7WCX`!&z?OO9_~lKOa|GYFVW+aMOR1C6&CcI+_o4CAWv37{)TYm^Y!aj z1fV+@gt&MaWb3jrs9C^Sc+t|*o^f5%thr>|mYrzXa(opVqK!>JMm`pFA7UG5k;BTu zPiRdsFJ1s?O9wMIBcq@Q85A^xZ1(;@J#6-H1mnhdeuqs~-EQSoK;(-@|0vERtW0cdX7Aj$K^(z*TtW0RQ`Z-M z_C^ZY)jZ{8VPj)sXRkrM-RV}X98bJaH6$`_3z4ri{Gy_2f_Fcisl^y!nMy*-o#yzM#~R|NYn=)#=s@J^uUjI6u}9St(>N5 zJbafVgBSPQovHtbtmi$cNVUTG;q6y|8)UgyNk~lHD6o0z>{pAvLT*APNLETpS@W^9 zv`kWnDTA0DeuV)wn}A-BkGaeyPzzDbk(ZI$p%La8)xZ1vnJrm2zn}m(yA*&Pzut6m z3}rDFX|?g_eh!XwWLq>Fhm4~9{5XNgAa4y%8|s1KbfGJUA}$v#tfemK1SxiN^v%G6 z+dr=ZB>uH=BiAa;b5vRd1%>=!5%9R=DtSotH(E3MA(Uo~_u)1XL$_>fKF?L-!cogy z5s#3;M%(k!$zEV*6d4esM$JjV6E}1wCMKYWhn>_FH;>BP5HA3xP=$dnY;DzQcB5#Mk&&Tfk&F+Z&Y}%;4s_opq8WuK&$w{_ zN8e;slwAV3g_X3-;VQN6{Rm-XB?#flpmyNI{X_3Z07n{&g5)wELp04|0 z&#m);5~l|~=Ww*SfR`gzIM`-l$NDvQqb{M_VRQZZ3-O$xp&_E7qH6)*nSywiyuBLK*0vkME%gWut*oG!L#;GybUe~8$lt?46+D1 zWz&F*DBW`5r&49YxY|BJGk%)+{_*3-Xy}-%i+%6u$uwzZu3DoFdHQszilfwMT?uD| zps0H79YcdsX7%%tlJ`A43m&Vz>-tnH|$&_9?o&Zej6c(KY&ADb8-n-EZY0EWR1|LJV zaY6cox|O6|TJq@8Bk>&6coeR2V5QB+I>ok1@A6oc)lV$v8CJ^?-A6CuC%)Wj82x+y zu{?dX@6it*>HdMe0I$ID=j{Ay`4IZVodZ20wD5G9b`(3R^s;wB?HbGu1c<1d=Ubnu z;!wLHEiaEt$|>XR2bLt~96RT>S@JVNI#uvcA5;dQIz_5ifQz`pmU==v0J&))A4DH@ z7kNS$B4%-6!RT=Zx?W6772kw!G`)PjT6ixiy$u;0d6qHH^5)Ga!p;s(PEN|Rfq{Xc ztZF^qzdt{t3@n;+gIzuQqVC0G&NKdRYwL+J5qC0|AT8~c)`OMDCk44Z(RWf!eP3J4 z!OMH4cA!nont;m++Jb!`TrstGYtZEZTTYY&NVDA}U3@lv2mdNcglubgVWDIEum|eG zQ9;`j@yY>g6JAzU*1cSYzjx)v5lM40Z;B~R9$}}2OTGInP+i-a;n9K2K=3Xojm#{9 zr%&&s;2A>KG5@ezJ)+Tai7)u$iAHO~=A;iFKUUmTM=?QXN7X@$#Pkz7vi-hw=zI*X zEipl>3xlll_THw_g`OSUk1x3*W)#$sOPx7@qa&Qiu%*DbDnO|?PiaWKuTw}^(xrT^{acw8KaJzt@;OLrO-R^ua zh9UcuuU}QQwY6zJpeL9)(oxOfmv~-I9-*ruJc^1v^wMdfgTH^wTGSJPGB_|KZkT(A zmZJYT#Yu`(6WV+U9_Id!Mkz{(0aIS17YjopPTzWgPJJak3Vs(th5dn!rhA;C&suz@ z$FB&W0+k7z;#Xe}dPOqjheiww$4MyrITqb6=mn$L*n?p!G0@TVqgY^F7XaIUmPY!B zm)=)ifxxybL*J>!fSf}cNLr|?4y2$vM&0;26#cjto2?a#9c*aC@-6#`{$k8i^wprm z1k-_f_;`DNCK{2ms9)}6IAvxy#LCSO>|2rZAx=sb0=?jZqEG62oXPh$M|IQ4xOTTF z{K=CiG3V5!;yJp}OHWr$-Zdm!zz^lRlA{0W)vE z^cj1_wZkVGxzks9c)2#SUhLgP=l)}6rb(f@X;A9PytAPkMS}XgeM@HxRQ`DeH{0^z zMakptH*IVpg`Eq?jza-!+-~41IiGy z!5h#VM=kx5c-aut6@(-a00g^^+({{~pedQc&8@Z-cclH7Sr=&g6gj90!sdv*J6 zR8ev9eHTdrzA1K1KlStb0gqh&kSZ9r{nAV#*>%LSS~G;HV<_O@UVQ=Z)fu6(@C(#| zEO?L}V>c_cpQe{EW4qwM3*;WhS_GC1=5E>63^WHVip~8AB#E-~1#W%7m=Iz9^aK@Y z^J@TIpw)_Uol)Myw-cr!@4e`luP*a3jcZTxD34y|dY>QgWYF2rAb)YJ(pY2MugV{~ z#`eh42VvuzxHQU#PqarD@HVAt*x~-C($sI%&{X{@8C<#-VrCzIQ1uj70|4~e;M)9B zDG4oKfHu`dl~3UP!VBNrG4@r&66V{fda{4}eZ(yi@#`i;Ii4)6e^4$4{I%zs4{2iRAI#GV$l@7ptw(Xb0@O z!_>^LT6^cV+6GsVOarN3PVn*B)?7WkF^s!!M(2&%ID*p>ds~dUI#hkoPb@}pBBtI! z{JNM}46DV3nCfr)1a;oIgCa0W14|jM<@}HNr!PzU>kv3Xc*^Xa2L1Jl6AUZlc zYo_h_RtZsC9Hs}nv!A{JP031{Mt{tEv<6?+nB{8L@OVGuTE5p?td?dP0DkPqU%fW1le(u^Oej}mq^ z`Ks`k9Ubgi3%UV*6|T#rlhyM4_K(SWpm8;qj)Ox5nK?T-S%2X>Umo^-6PH!F{tdwU z%AZXsYTUnC4UMOz1%!R7t4)7_VSR##KK3*U>dQ9@>YwtRX4fiU3>W0*hs}Y3ulMBk zcZx68yOop=gte^Xg-f0EZZHa=b|OfqxBUz=a&=MQ(g1w48reeK#avg0%~Z!@S;!WL_T z6T9uo=`NR^&HXtSbnv{w!$*&}2T7*9R`z+faPQTlTNjJj!=_zQgf`=pIS_NuTTECd%s`u2;t6Vz zc!^+#&c>Yz17SYuzJ3MnaBOVndR4~RyBp!nGHpo-dn=^sE)~~sx&no;z;QlJ*bF|a zSe9>4F#*2o*9rGivFmzCrXC!~OMG8i3hgZX?OJYC?RgZz(pWs{M-X~I@yoT9^v-up zd&eP2vGu2cmxhLh@^A4=*yG)DCSb+Gh==LevFI>vLuP4soWSqRq`eu^Gomu~pV}YB zFOVD(5EMjc)ifWV9#OlKLviJK8_)-#)7#7IRnu2JupVek+}CK^TCd?G5~jceGbrwW z*ui-neM;zJKyT45c8Eh2oe;bJ<1iNItjk$K8od(?svTL@`~x+_pdF1Y4T%3_qK~PB z1d;_14CqxWhd{1uuG3lbMYKwXdQFGWocFlx=vY;V!~>F7m++lv3!b_CZD{Cak+$+N zyzTNtL4H0EJ+*|8kx@%ZD~bUDnZo5#0x#4A4|my>SE8cuC?2rk9NwXK#G)2U#bQS| z0l$5_Ro4w8~Bp7lfRK38(%2S@*b%=jGM)YB@n*83Y4>`U0lC zUvxjK>W||2uE1lm7ccrXcyI+rM4UN&Bid=o%k~$S`cj>=4x=t)rF`&JsEKF>pbG*g zDgn^1o>FgzXh+zS;XHyl3Y|+7V@n&G*{La$x@T{(oH-g7#KmDY3E;uX|)-<;OFW` z3|(9+2G36FfaHE7K9oKfS(J%@Bjd1hE8D<{o8Dn#W3y}P*7A>>)13IsZTsjMrCZXp z&~f)Sdk+)0!q)my*L47c!68qIQXL**hi;n72$@iJ ztxAP`jm2kA{g@-%KT#>B=Kz)&dN{@?F2bW{R+sFW{Ge6wkaP7 zd8d55@lKY>9s*91^}y5~DnEr}9mHM3u9iuQ_Ecjov|1=w*4EaV>#mdn)-NF#R{njW z726HVQ{Js!@k9gIc;fkVp&RZ#aw-M7KIA!T+%2?Uw1+4uDSLZ+?Z&>M0{G%QLd3bj zSA_b5B+jh#vJSphz{q0w`k1u~tc{VZ`i_o5Wp#lktI`9JiTH$wS&d&uw~25}odHaO zH~`q=usEfE^X5&|npw5bAAnY{(mgq2ZwVj0UAJ={zzhHbjE7UDfKV_Pqn`y8od+WZ zglRE+J=i$J_pKrJjb!on2vEx?C{<@cH`*G{!Rq%6av@lLIKZv7^$Y|_ z?2|JfJR$%fr{XGa<<}!N6uv{lvdfncm^<)KdF276RI{^4hmH9B!;a>%H@p8lK`T$0SQcd7jDw z#sw2u6_xf?)3ua{EBE6vg3EcvQl3WhXw_j`U^WQqr!eLbS^42M;euYPcE+`H_Ix}% zN_MMYpId2!m&drrSzkeq0{ed8?*8{C;)U!}MG9&J@4=VPpJm&Mu}$b<(Ta==4$edE zJSyz;8lAh!-PnV*wsjEMQI}inS$9_g?5%85<{i=igY%Ivpk@KZI19e;rL`|mdw#=Bp|4E)zA^b`g z2f|_YFy^DDr$2rAHatyX%2!`qzfbl8x(1^BbJBalQW$`kr!da2Z-(pKWo^;Wer_2z zh+WmQ2{>{5IF10V`x97qVxon{{Y-ET8q%9dsaW|AgDT<#6U|+k4~Mj!>Vb(N zPN5>+M0HZU5BD+bG>i`hM@Ev)yhNa1EiMSsyp7NW*fC;NW?UqEb{dy}qf-1M(8WNg z1M$b%XStI>xWm2c#1DS@#*K};)Lj%|g&r&;@H%zR{jLj^&=6Y{^_%S%C|(yo|GHh3SJG&egUQ8INBkI$6N*#>v|0bBPupH9oET43#P|w6KV4H} z5rsp^pw@`686w={mQTWVffD|t`PeD^os^th6pwL$r5t4ikQ-XkbnfH=)<*H&U);%1 zUIH7hLle7q?_R8ipx)ZrT4g837A~rt3xGik!k4DncVt9#jHk@uK7!My>|F3MIAb*H z<#s;&)7~mDMc7-t&LJ=F+P1BpJc+a6H+Vb$3%uoo!!-v%9^Vz)36+m%58_uTntve( zMpR4W44aubxOBYt+CRPJj9DIlW%5XV#Yy4`bgyTW`W{!yj#zXn->O9)~#Bl{0z zBa6ROP7c=Y<_TeN#Gpmih?F9H@JNo5`!*Ki(|}MK(_&=o8cU8yP=SK#uBUA0ro4hpGQV&AuGV@ zi-yt-CC-*VV(2Utr_G2`|Hm1$1EOFigP3nwf!rH+qcW`PN@8sBO;t>X>BPWb8a8Ds zPUFtIzA-ZOFt-8YJ~vQqYxvZDx#m}3ixTw&xYKuJJAD}nB?TRb7}vAtl{XYM!F!On z-c?m4Bd<9qE0^TR#zL+I+@wU@=zR8G-l%rI{BYUZx6hGDpio4?5k@rI;b%&OiHAVH zXklcu#mS^FQ+oj}cqQ)fR(my0UgyG;%6!r@qv`FbhNl6UYFv8NqV{81M9J`3c7L&$cQX< zzDM~HrU$@rNQD>PWSlpOjxJg_;$g4)KA)=xSokoPo~Mqn?YplWe!T9Q>}VCP00a_> z=0PwJF}VZx%>Rcvem*Z477t_c!NZbK*M8$*D=TH$aR_wS>g>F{FOdaG;E#YB6@}O< z^*r;)iKyTmfw<6>+~V!JF}Z_jBiVJ9D{`MLGtCLyc}zJ~!ReD)PBnuvknmK*Kt*)7<>Sp>iov_IbeQ za8Lv$X<4EtAu@CAHkwj=O1JmJ#2%9hmRRkt5`Sgjd#B@iy!Xm_&T)~kZ` z1rfw`=67(0mx31zK+mT>GedSjQB)L$PBH-;y7R~>)<)xpm>!Pxh8UC=L1f9#t#!7D zPaKQI#l=W|DTUJf{!h&t@ea%bnbHO#Xa81wdfpG&P|l181<3& z+x)ds$IN?Sqnc#-;rnHulrSm-@9l zel{`WurzzaElSfIW>ipTdcbJ!hYtn7WFhmm=iErBO^^VC3zoJZ5L09NcNiuDPr(tI z9!aUc>-VYK^Xt^Lq7$t$0f)|!If1qS&T&2SK% zV9-MGZHn4274YN+Cf+Bq6AgbLzf-#8Vk<1cN-?w7&JPssbjGaTZ-1pMRw<^a`y`<@*A!l@S6 zpuVD8kA8pxf@m~ROPF#| zc;A57S7|I)8N${MVPJ<3g9ztDw^A-eSPL~=)-Yp;dV*doEiZ?DaVt~21^dYt=Rrv@ z9ds{fC)3n(q}mq7^ST=v8*Tn}<8t49^z^l_`*^B>x8V%Q10tvSzyY@xAoh_uNfdTC z7g;&TPGR*hDOwSF2))kM7zxZ}ccM}utoE~Osuph95%r5!8~?&Pdh)#<7v8(*I8XI? zk-Y%o+)Vnux%o=(@nHZ#qP^w*63#=^nwhZ#AWv+dQV3eY?=p=2Onot1T_$-I^%^ak z>$Y?`SD`w<9o{#c7OuB!w12U9RK&}mI@NEn`^%5d24Naj~5bLc)N zkHNr2JZNDy-Qu70mwhO!u6*CUD3}W287cH_w$L^XR+$pUSic{4>vu&-||4g&r-@a@|(~aOqe@EVk3A^nF zSx=jHoYt>^6ly#6)qgokwhvfwAAJoo?1bgn9S*-vXSuSvdK>&8&?KW{l*=6MrZDtb zGGSgpY9J65PaOj7p?V{;6BV_d;xXYc-h*lMcjDlobMxk2Z^a|lBO&j^Pc&v^nOK8) z?iYnUJ`Oc{Deoy-*p~Bn7DV8{y-FzvOc;KR8^_}ZK$y_codSABr_RRKwkGKc?6iI3 zzlI`gWusrg*3*n02}((HW!MrnvQO8zLsysN|8fe$QSH2R)6A_;avI;@sxl}J&>UWp-c~c+c8z>U~fO$ETD$S zM+)eV1oMK&hc=)8U4*zxk6wu1(@tTETo3mozV5RE%RdRi8tqE&09ODsu-9^(-lD~T|p0a@;RX-okp%Zrb)WNWKby+5wg!>-*t)dcU@w+^z4o$ zl?^&JK+Q*IIg!k1K42Zk$H%SspCAZ~g9r@*41#~$5S5^^eHUiL|N85%>G$`p<8nnk zF_}+k1H){Z0+-9mZOXi~cm$!w@#!BwRDtEDo=)QIfEAm53X8W2{xy5-P80!5 z9?e3X=6oFpI&O*z1pWyws@7cpx*%0A$|{ajw|KHz=EP1*>n_W-Q}Z%LR>AloFK<qX_uv8 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 diff --git a/assets/complexity.png b/assets/complexity.png index 8bee3258cbeffdd2d15f2466abe63efa59e768ef..6673db504da61118821357870a839c8c392b2058 100644 GIT binary patch literal 332440 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

    y{< z9aOg!8VMY?=*@I_GMFjv0V+AM}(&okPuIO*Yz^}}r zE=-X|Ja(gF8yiQ;i76dWk9?cX*J{({Cn=DedD7nQxMv+kT{K7#oj5Qb+++LVP3S*K z(h{$4n?~A1VZ!m5t@?(VTI8H0Kzi?}<)yTjf<#N8QA039jb9C#`|!f(t@(o7ls}=I zHu#9E>M!Y$N_ugv(0YrjIzyoXbj4Hbf5*Hi?jkw~5+ zE|M(oJvBI#&yl~lDi56**{#@7E2jcroX`uIte*yAVvKcG+{x{y<8wSAJX4>@+-JvHGaSzoXqehT4q0@#!cMC37a$aZ~K;pJ~sxbZdjehvZY4tKtDhK4L%Uh{D}B4X&k%48!oBZ!Fr? zyfi%3CB8xIhyYp9SN6oXE_e25m6ADjT<_fL`ROR_BcUKMMTJ;=q*R~3zx)0eObhU~ z4ZZ*7nV;gnhswq z(SN4agpV4@q(NeQar$sl(m(w{9br_#yplu5Z{GRa20%}qF8jXwrZ9(s^lID?<;i6k zoLTVnQBHK_BTvfctid(C=9r6prm*@MQ(*#-C&!=G9N9E&7p`^Vek(tc6q`y-WF3(> zK`ndX=|m9VXHEgUNDgWWw^YQ~%iwboz>z0in1tB2at^ zx!7>Is`mz*WQrcZCx}%Fy@v1MOV{Dapw(HVe%IhRDL%6kD8Au zpR-QLp!4XmbR3_f$L9AJq;X(VB5~WYcdXV0o$C8`YNYO$_SWdGF;4)Gj*`{^HF9tu z@eFQblC$PL#zK{$Dk^lM9$y$!Z!HU7Y<32SR;pZaidxv$guE$@GQJ)f7G}(i$b&Oy z?gJO+&S)yEBLaMWEQTp_lakVUnd0l;o@fSB%h~DtcDk*wM|)rrVR3j(W#&`Xs}1a2 z-0qQBw<%4(1QJ46Ikg5+V1%!?aQjb)R`-FInAlcmtgPr_$`G{L(?ADWk#p61Rv##_cvhoj%Q8T|@@Tc_?CmL&3fBuTw{#K9AvpU_nyKKM${E*kw zY?`w}+-|#bV1C57$Rp%QH(&KC*_b`=_pSBSg zk(70P>^C4?sW-doc(JYGGSMTd3a*by9BTLbTjuM3Fsfn0Cek9c0Yqv=LiC4>Xsj$!HhcH5y=Seiv@H^l(&e-R{+<9f# zm{yIR^mh&6hIa;!9KVd|@;kmI(vz#95f1w-BighRW~s$`JI&|URt^#ro^*6MJ2;rv zEFundZ;80uau<<`G5wzY&g^d85;nH%aFi)E_u-q;?{(aUw%37lO0pzj*zffdb%&~* z6-K`0Nh^mO^tUxQ<#G48;S%9$70c-ABZ&>u;mNL3pogeofJ&*xT&iM&X?JR8b!&`n^5n2ozm{W_@SIc{6S&fY0t_%ppn!)wgzHuU#~Bmp{lxfC4)k^&H^U^ zyal8#|XiLj?S!4i5BPGV+o!rJlgld6|XpWZi&iX8@!1J1mEPj$a8Rz6Kn1);9Zeq+0n z43WspTD`1BG;nsRMi!xr!u6&FH|Sqh)a9U>+c0>WEzrclDY{5ivYv6W;r)E`eP~U1 z4K?TXhS>AI(2z_A4KgUU?KR0jE;;ks4alOk867T2S0bvt(OEW6e5;;a znQaYu^Ut*6On)b!fFw?Enfv0m_yv%c_{s~_APAm0I((^KCi26vjMra5{s)s;apQet z``hS++5Mef+-9NuacVzK{RX;qdp?+(WW>9tnK?=Bgv{)DLW>mzI`50E|NE{eUP#9G z(3WOOkNLO!Ht@B)KWg}+6%a%B+_9emA>R?JHGg@I$NFl-`qExi`_HGsEMK_O38GcG zngD4ybNZE(8xF?=QFi0xdLkhM)BJhjWi>&@Wcde2YQVnHNoLF-+Of)Ulik(L^QNbs zie-Ne*U~3L(~--|uy>6VQQhVteJtR5bkZJ9pTEc*WT4xjTpY@9Q{GXJ0-quH3xilV zOqoU|$@TXJwU2zATBeg%*p91>sSIWHPt-U?Q__D=jx&0 zrn?Pai68EX24XOfC&tHYIh3?7ea2nKq0^H!lB3`;B!E()$D0OZcjYFf-_3clvke8U zw(Ad#erc$eVMeLOJ9_D6p1Ae8U{7ytjBg*`BR0_%`akXF#W~8Zu(uKuWE@9FNZ)Vi zrGU*vBc)kkmNOQ84=Fk70@fO8Zk;}6=%Sgeknp{?GyP^vP#IAv`@F@k>eggaQmu9) z@CyvA;1+v8rQ|dN4dv7^0~j6>nf=LQecJ;$lql9RXm&psMCZlpY3cQ2{z5l^lW*!(Vl z`mH>6VeJX$XWP?nsXI3s_?BkzZ7ozSp8gZ}4O_VhZ>00rE0tK<6=Q~9r+tQWr_x}m z(%{T{GwSH%`UJ=e@SpE^3jin5!b1}Cp*P*h6i=|#TO+!@;pU~cr)zu?&FfS#b7?{F z1?+GkGO23%#q@~kxFqwtu;(Pjs+Be8wm;{X4r?YNk+^`1-r-TGQ+(O+5dHp>-+Q#5 z(Rl4$F)Vj~wNo@ON0spyE~?(zsU`oIYnz8 zh*jkBK1=L{UZtXvd^F{|_w8=sL;xPdSw=_r#cmo-W4(|LJ3YF_(f^Xd(~cTK<76DD zsT7ME9PjGLA15%+&thFX)xS55aee5mkdFxUT|Bl3j%m_x)mc_gzSOUBaOT&Hv+J&q zeG#HmU&XH`!Ruq=uux9z6g^t0}JHX)Qql><#)~KpB9%;x)v)4Xyh`0&>{)HnRGq+JE~(ZWng#C^@!Xa#@K{G7l)5^^gth|NDC9zwfY@- zs?2BTX5w|TmU$c?ub9H9S+{u2eF2$pe^XgIp95P5aEa%EQzJFsb|i$ITL#_-uz0dG zvc(F4NH^{0r_*=q7Za5kbOLhS1;XO>JkS)7LG}3OGM6t*i4^mu47Y*dI&Qzz=<5BZ z>;s8SJBm$EJI`b5kZ_qMq3zBWA2*UDSwechtr?n)%T0L&Q`8k95N!g!WsHwGuA45N(jX)1IP$};l>XyUa(NRiYG1Y*keV8P#Ag3b=v$k;I|v7>snYo{JHOV%~AH-{d7fP@pV0$ zD`);?Kh?B3A^2tP4EoOC5-&hqyQ*&smnY*R{utr%`}deohxVXO zveK5;2^X*kgt9Ic`A2nMP#}5u0m>bq7iziwM%5EaY|53md8@@an`2h=o$CM)vhtMH_KtL%X9YyI? zdansRC{m^O5+EWyBy>UzIXmd@J@0qU_s#w1&fGulo0*LRlWew|wO4u8TF=8ug?rW{ z%O+6eF7ARa&)zy+raJuZaU>{jCF-WTTT>c@GBdKxndtNaWhKMJ|UQ3%UQ#fdY;(Vl@a14#=|GA4fI}1 zA4kH;Dlk~!_U^{l8+7&z5cXZR3glawP*dY6xB8VH+}&?3Q7_{WPY9T>YJ;xcnWvTE z(eXKN)Dky7wd{o}tJ+(KaZTOm73*f@^>?-A^%L0stOY464gN?U|4w}5Os zT*Tk&i{4_{oD3tAWU^POmDZ5Prc z?s%JeoN%xwt5r?!o)46;qvPx+8WEyk@m{hr3ZKU+D!Une-S%M&KTl}Br?&&@khI_IX+ z3Lw=*N0U|F936`12>IvN zLOR^LwtVLXbRgkGWw=1e)A^hOzu}%H(K3p3<-Vxl3|LlP_2&{PAk9?^)`8x_L>c!J zdLJ4rCa9ct<`biWo5^P?0)U=gYLefnY5ngytE^a| z1J?`=)A55fqC0lQFW`3tcT;s9haXK3epxkTi^Em2rX_T1H95T@5*9Y!6YqTxZ%&5k z!qXi6Q)YI@qb;Tf&;xL<3rcDI^hZL`&3$gEY_R@V# z6^5*?JLstHl5vUlZMvy;Q}Wm(gYm;wX#&=^hYk0nAD0zo^DpV zauris91HC4^u5#rR=wCveY&4-B8uijLp-rWMLw~UQ4~2`6-#S@RP#x>KYSSDoyi1Y zYryQKU{cc7ay)A7alA2qY<&9oM9ysm{sHqk!DEJghwpw@HQMU6e!n!c%FFlj$>y*4 zYz7PY5vSizm`~PN*S{M9nisom7$&Cgk?&x`x-a_Ety$d$|2a_bh4de?5&stHcYBQI zv7Wp&;McphhTD~gX6=A{h14LrWpM&c58{Z2K0XfhLo_KseaKM-A?VPSrJHe=Mh3U| zBQ0>;@qQ;EB%YI~p_gL*_%%+RsYE5|K9JRkG2;s?XiURjP1c%QwDldOY>oBofXcCu z>s~B~qrTEvCq31d2Wqk2j&#)2wALG(?B;Gp^2E^*l~@wSO)+|*HqY>l69`f zWcY_*Hi z6h&)EoT<^hRvS)NY{}k_ z#Yt&5F%`yBxVWExlOv zb@Kbz1k8>i(lVWRhW7g|<9DnlsmW2~gc1{e;1VMkhUbs94{+O*y!tWj(wqk36cnP>U-TkgBEMfjbDi39n3j6-jn zGx0sG0)+qgue1Zn!Kilyw|Q2Vs|pW0{V+^YML%u9*e&rhQp9r^NrYM7FW=7Us27T7 zbyT<3hX&KNz&ua!2jK~TcqG<;G-Uba3zv4eNJ)p(Q9-~y6x{6|_FrGx4)QkRPkKKx z;G;Nhv~J?k^Q@UrOgSarP)WEfz{YQ9Jo*$PXnGp*3T2esrihdc3b-EB1CGUi!J9VG4bi{}G9n;YUEm!+JHDN$B!I(U6_daS>{MkaO`?z?9bU2?C)cqnl$kCH#tiUTn+vd59y zWy36b0L&U#_-ncwK8~Fu6lG>`bKd<$V#air=M&8?@`0+*$v)LRJ4b){W)a(xzz4!W zK0({g-HL~;`2DcNFH8}{qZEY$0og`{f}@6P=!PKwc1n`l9s@XfbtUMq<%gVHEa@EB zK}^E^>2P>=BBr;bh?0I{9KHE8HU86cnhn(8;M~6Zc2!mVO08K)U{T&keAcXMeCxi4 zM-h)i@ka`_-NWe`xd&~u-*-0hb$8x*3NDW@6}uKo-QWO6bC{)4&-RNv*L;ruCEJ|1 z1Pq;-zEF*!04T~PUya=Xa{VWwET)gA)p_|{7<5koH7S^Noe2qgNLK{dl~mtE6|`^D zG0uSR{37*itc*tfWknw)qzCzz-;dE`iBToLE7u36ozTpkj)2an>eT{kQ%wn(EI?_r zDUiPR`3Ip($o>a6i+i(^$@j=1*>2+-22%42rQCAqQ50Tdo*V=c$S2===;(Ruu&U~E zB$xPNZ^=g5Njg85R6q`H#o|lcXv3dphw(N${i|r8K4b++y7p zyt;A3?y3b464U8xc8GnAwt{n%!;3ccymeYmbFcsJazT-0ko8mGG19{(OS`@QbhX3Z z##y(-Zrw*)vqlmReqC6<;fxaQf$dT5k*5y4L>blmtGdza4}YSe=AveU|7G25J3TUe z%mXr=_ZWqqXa&xjia+=Y&>OvSd(IjxoSy^82-P)N?WWc-18gr@>U)e%K0bBKh6xVA zSyMz}9zys>?^b)X)uqQP`ey7Hk_yUw(mCfn2{H3+;TfM;1Yt+QylQWhkT2$3y)sK^ z%7L^shY8DD_hL)b{jP3aV5dGx?)`q&x2if@S)`Rv>tbUGtLR$b!f-nYeNKym#Tgb2jJ*BS7W(#XO$MaSrvw4#0 zY^*#di7+PffbllrV$^`MGbjg9) z?O8@93WwR&`zbw9IVw{QdH_LBo8V zfe|4fZ~!eLT+z;vH7Of2uit^ZscAC^Z~d(a%Iv=Wqg*T*X89mk9N+>qNYfD!%gPz` z!Io&hhgx!_9exp8lU+SF!Ba9OAC*3(oFH7&xjI6hfSRq&cQLB6@27*&VU>yFWT{&B zjZ_0OsSmw@7nRTDJoVSy8>69;9LYaxTO(n39>Pb@eTy?IHW@q_Nx0{As4bS-^wiV0V8ngB~J^Z~nW& zU;5Lkop^dtjLrFX$_VAwKd&cSgaowES$DiytjxcZI624RWHS;D2gum_CjfR0sMnG% zs+eNZ${!aRr3~p%I(P0w)?ZU_oy#wS4b#!ZnK>gSupO);qVvxgfq%6m2r0tE?rA~j z{pbQ-i}b@$9aIvuEK623vd4A?PI}H6`0pMSgBDxz=+`l7ZpP0A!Ca`7V`%%b-z%$s zm((b{NJy0Jy=$NX`<}f$J++VgO>6J61`(^>I%4>@U-?#pz&!GQy#Alb?*Dw?KMEUv zZ`^-$O8(x6|46C)y%GN|rDFd^P*CvSM1%ea`aI3lGIIGbllS)n=O$XwMCkwST~Ght zeitX&^#7IuqEgJE`sY$$^!-`$*ze%~Dr9u_-J_g;-c&y7#l%=cQL6c0rHlyQX*~Q# z73pnB`_4)&#QDF~9(wrCsq6(Kq6q20zrX&!c%;730)MEA3va#71w6GsKl)COxR9vg ziapaazW;q?rZF$i+23J$`|7&k6Yw3Kcc>@DfZ*82tN(h(H`)i3=NLX*x^t_QMvd`< zc81vXB0z8M0nwB5wbw8F44feP_XC)VA@92QjpXzP#@ap z=#EM3o`S}~b3LTj_NBA1BZt{0y_gw#ul+NoyZO58ZxF+a&Hjx=;>haucH}gcM=3|38mLoRF{1RqPLMg-rU|HO zFF3OYl&#g};nZBpFx;%}sQ~(I^d$!n(wN#xd7o!I8$wxRNK%1PUgwoszG-Ja`mWD$ zFE|8zvao!{rTu0Md92+$|8oPAc^wF~|7{$5$M3lMyA@;ymCU|I*kW|#rI7DwjSS&q z7JNs z0tVk2Z_w3LQEP_njl0fdXFsedsX#>@BCKc{LSF(NpU9M2!-quYvweA$%sv*hNm#b| z1&hS{JpOv2svvAN#) z{EJ+__K)d^fcs|9a{zWGwEY=1Tq+}5xDjE4Ju(KwdTs%gb0hwB@X)DWgTaxioy+KA z8&yU9;`Jh8K6A@$d;izW?cb#yO+Q=NDzr|K(sOHCG>0Ip%!&XD&F~r>ixx+F`6{I3%$nyrz_a zA7AQx0A^gZtB^>*#!N2)Lq3rSUGK}9Goo0P`0kRc$~_E6k_-v5R2k`M#HdY)q+dhY!gcjRjMWXHI4 z&WHJzlYr&S;a6f3sZ7qWvFR7$a_fkr>2i-`Jgv7LgxRlvL8Yr4tKT|og;(JNsOps< z6YXuwPo_u6#E)NRpd)8dWC_lXBxQ2;OR#yGD~TH1t7( z>JD4*G0f@l4MQ1y!Y=G+JIb@>h}F37UJ5|ZL~~k<^w@Zzq_LM`0g$pD)^SYGzYaUUiKbJ^-oM&cM<oZ<|f z%Z$4(2K`(%bL88M@-#YZlB5cLPV)AG^WBS|FI8On_aj3hse|ibAF{yjaV$ z=m=Y`(r(44bc&QLG5I?nHC5~+UM)a|3k+AS^oEHbqvm~5&7vGqqot=Lj;y$IsRof z!cFT(^8sE$BIwbjwLk~qE@L@GrRTc`*BPJ4e1fQrKIR5}_0)|^?D@2gI@(n`()hLC z1o){wii${3-bk_@^e%zCq>njVavJI7l4EkLu*A+ z9T=Svmin!Gf;1oqO2qWxd#fR)sj{`H1GmCR2M+(I2lDChCH{NXNHfwoABF0ewP;C} zpk#hNg;D)<9{qwNEkg;dpiv%y>9Ks={pIRg7}qzwzf=)IZAU>@L{j`)at^!_8v!;jAy^fZZr zsKVdTo||;QkYxf<@~A;7ENFBXs*0EP+22RBLza(C{m(hM7myK=Ts&X@`1-8?9{XFD zhJqt6k`!mWyDP$bvCihsrG|GYT%5vk3l}4&yek?v`B3K`H`{+%7_oJ@2s$Z!*7Mjk}L2pIEyUUbS@JeOiwIaeE~7q*^x|F zwFXrgh*RYIKQ3+cVYai)iNNfkuI1#aa!4JdqOtyv248_wrBtOEc5_3Um#;q$)orD( zJaaT1`Wgj64!$~B_U1YKV)^s)%@aS?<2KAW13&-r;*nOesquO_@gux4ZE1sFSiSWL z_hkc*>Mwe9Y&(8#mG3GfU!Z0N;{^tW3v}iS2BRP-MiIK-*o!KiCfCQp-929PtRq{=Zo}0=n zPLoJ`SuE=2WYP3g3tbc6L>W=4136ula8|Qa=Irc!`rAzEX1^i5#_;(pq+`3==-c>U zF>{)rj=lIcQbwWhs0baq2Z{~o=Q7F|9-E{0ye(>V!kKoF0nQn-iHHoF$5%?DZ5zyQ zEXxxIe|1EZhosx0w@N0*-9hf~kx%&2f_HlbRl-qMYYKCWWbDJS5q=u(RM3;lbJ)cM zp36&BC4el2bYz~^u0W?>Z{rB03;MYozv>?P8?h3q!z2`FX?z=_-u->}=;R#~->}e2 zrH178y`1%;mq^o<355JSHj_vTZ9^|}^@FBN#;;FU2U1U7F*$1g90d~qje|B&x(cwx z8f4;5M21kGRQSul9`%^+r!Oo<%RbNqT}mvw6CeDk(~jkYD#%CD^vZ#+;EEA(lf*@{ z9hNtHAc%lByXPn9Y{W-pns8|uwVtMCcK9$K#!ASy18KNva!2nPC|=+YX99+mQY1SG z^^0pnM=&gwU4`hXZmh9$hIvlMoZD>aRFgHpHE=&TRTnQFj+ihgUOP^DKEqwns{#VA zLfU+o)HUs+qoPvB&8&_xwYhkJjAKwTtj%Ms(-2>hT+|kyz3Y%O3wd#DSW^hvsw2WRV^&B4Ht`!0?mStsAMhEAM)P|I}~sASou~FPYuX=ic?Z1byl0Q z&w}c_hN^V~LrpF5PERT4Nh2GNT8@asv6$V+hu0R!r;?yPyRpA%r`Gg-Se1nhb-zfR zYW9mUIl7fynL^d+pb9JUT-Z-)cI=7SR^u4g6vKBfk5Yp)igyy)mqE3X?>H)H&s9BV zTUsPtca<0@8KG+$s{!Hkn$h9jGM4Q5i{HY~Z+>}Q`#yi@$FjlV1CB%!vqN;lHz20s z#iHSorE{iuQb*Ju!j-lq?i+jCF=~pV%(zl7{ zx<=8@ee0wew4*=4tg7neFAQch1tsfg#EH1XHS3_2TD{ph!GpOtb=3g0yq z9Bay15#nqTDGgk53DtC2A>mMDAz$#T;gaS5=}&K1u^JUG=r)W&Z4wzLdRgIa=N-~1 z8%^qoF`=zFzH7dd#f9rIwZL-4Y5j^Nxk3c7buPFb9~m!a$Z_eCJX0^uXBD)h;r;sM zOdTAq0Hh)sub|zgCf~F zbqE=(!U0FGRLA@)yR4~j#2g_{n~{qTM8T$6qzRJzd>U zv&tjoAj?s#i5sHimPgJ$Mx}}PNXk_|ZBw?(pGZ7cQOay%H&|fv-S7H}>k#Y+x^z>u zsJA{9?rHJ^(GwCP@v=&zgPzZ4^fNq@Y-@d*$UG-X=27npm81H;^y$2Wt@^=es2SdW zW_)ObY%N%}!m*8K+8ML+4#G+$hkaCIl5K9mmH$vE(rm<*g`|OO|A(c?2-%r84DL)* zz=AF>rfkIHOe)7Ocba?~lNwxc?0#~s^o{=Tc22?G1-l)ngDQth#j_jxxe~h9JoNK* z#{xF1nR=QtCC5%tZ>C1j?&XOs*UZiIkM}M`1FkOYudC~PUSh~)+~oRsuY&4@4(e5pfYa^AX(cuoe3;YdO|_2Xs~jrsf8YhmSbGv@x#lphxl zCtu0IE?|FAMy}hc@63@J^NN*22IP=?Vjg~fEhvB%upsuo7DUWLaA-#1N^5?6r3$Va z5BVNjyjm`jS$?##c$YnyzYEK#nTr|PS}kgGIw$&q$L_atLy`x$u&S-HQ5ih=-J5R> ztbkJeei@dG59MWYjR-&h;QPAQ@A!9;Bf{OVV>g zBfLr8R`NN^2q1G@ti)zjD(Z-LYXes}fqb_Zj{TR5Rb8w&i!^^!)u8c=oz@0OxKyFn zkRQ=E3+c<8u0vMq4X%h)?U|J0FDgv9()S%!&;|F3W*Gq!Y@w~PaDQ{5q(jLRYVp>C zw<*Qlj;ax0nq-ohN_Z}IKFQVF_*FV-PE3>H%;?EV&GzxzIP;`Ji?H4hQk$**$vr(U1QwAT^h->-z$(>HWYndr-Gp@5rSbCC4vLpyGZBXy{ub|C!P(O@EFVp2}eQUIkXL;Eow!Dm=oOV>!BU zyIZ@p@=^P1Ppmyis`NszdrYIwW*SxTj`ivMQ`x$3jqRqO_vwJJa-!dCZr|+2>PYs- z(KbG^mPm;_cgGVpG2Ve92qTxB9cJX+>3mo;PNu++fvJxDnT&{<+mcW|cTV$wm#T*% zdTB!}1qm3S(eCXZUw@s>ymuItgh+Wz@HKq=5s^@2ib9jl->sv;h#aN&5zlKM+RI&3 zzn+#z>aG(T`g(6eT6E8%&9hTf6rgd2OEYV0P}b$K{sZc57d z3F&<-xswCtIlPbI6uDGareq$%$v@CAZO)aPesB1W8`VPPFJk>YjxfN6mpD2tzmruO zkTQ?|9vT;L`^te&%dkq|_J-5Dmj;+H1yqX0rp)j{C19#Py{{LOleSgwd&i9lyX94P zC$w0d;8&>2gx`Ro0-W#IMO+p9+|%2ZD#lmw3l8}i+3Mg3+PAgn^NTSzQG0ya-1>Zc zl{k{wNV>~~``lw#s>0Z~F6tty=fM1~mht2ChgFc7WVN4Q5~^dFR~1CbA@%&YMuQ0z zrvc~5qOZHX(x}!xr-!F~s_yv|q8gAo zseOM*A&)5R=#YwCwf&X@On=RV zv4OW!cNC3HhK7c84HAx1{e;Tdk~0-XDAR{nK<9sxfDBZciYSi}4&4S?sFO1HO6w4h z+izq#nB3CguqQ__jSYAHClMaX-^eIq;77J?@~-_=?I8} zSZdt}4_N(SP%XSwP%^>QVBB|t*Q7UmoXh9oW=dwRYH8YFD9dk(I7PaujczyQZcuR) zb*Ddem~JQ8N*t;e-}&Ux&eMsT!3KW2$>uQ5I*LC?piw+oh|I01)RkN1Nb)Y#^!d%a z61CXg)9#xP&>8yOV1aQM`%!e+Hu|M!uAoidX60*vtqdv3#ydV=I%!q~mI2*M_ndHR-*m+SXy z2O80!lAG=r4GA;bTEtr#U^T{n^s2X!uPf9cp~x_u7n?yb)inL<51P~}KxFUEycLkksGy#^Re41E zW(OQ54Eqm{sCQTRgwiE9ZK?k?Dv7&*QI-E=R8Ms{<}e0E-ix{L6nvJS=!pfEKDok) zYfsHdR57KDB(*3bKIEHy--Bf0xvl0E6~||cS#2YJC&kNo1%EUdC)pL-3E^z5nqQFhG`#@2(5KH{;-s?&S+5F8)@U?p%0WWk0h>^n|wy( z-j6kPXgqNIDM>tD3b1qr<7qps6+xD({sPTf_E%^D4;C5=+vVc&t7)WH@m z!b@K=4a0EKgDEaVNF^DsJEFYP!zVVLLPT=hzmkXiNA+sn40pusd^duIh$vDyI zLvI(OOKz$@;wc}F7xUN!^RE&^Z;RaXVbXSmn|Aqhnatetk>O~*Gi@RP%tqJ0_+w2e zvN8wnZ)}GfQ>dBjuwxoin-b!%HLr>9S}C0NGXkjBagb0 zeKxU;UA1U!sC05_f52v=wsGq1&JEh8+X{|P_mV^2W|!G6wK72&6P>*VhRtQXG9cpO zfuMC{s@1K^iW2ED=>iZpUU%}Wbo>c1rWeoFL&vmpPww9zlktmKQWG!{VwTI5Sz-r* z8)YR*_aa$KV2^H0cL19O^d=VMl4DrB!@N6nP%ULrzwC}N$y&f=@%wufy;HdmyRUa{f1tlF8#$lG?Z5ev8$m&HTffE{t3Dl} zUTr!O=L(Yn(!&XI+HE7rI37QSjcwc!cS|?zOdP;5C zuhyYubI-C{b@9;j45j||kC1L8a`qup&2Ue!=Sa7Yfw2@zYdx6+5JZK_$)_-}6Q2;|mZQZ{tAO)7P3I!y+C@?2Ks zi6}t$LWXI;(YVpMmIEswpLW&H_g5jF(>Q9^XLO2Q!y;2IED3hjo zcv)ECmavJg>uz^7Q}#_%AGIq&fu}jE?qkO|8I@=1(6q2zoc88sS$ExB;2W0unz&l# zS3T`J#!BZQHS)`hOk+H?gROhFGH7}n)S9{+vdkq9K_Cyo+J|ZILxt3d*Qx6F5D|3L zOK=ZU(`!wUE*ftu9>p`Xe_8HKx=`sm z2rM~WlSYsKHh?<4(%bSf+M1Ku+s78}4@iL*N(<q*jt^qp57Ek2nSpKQyUIDdS z3Gv+6Q}|2JSl@x^g0p^&n$@F;xD(Q(vgAezXytB&pD@k%E4=2^`0J}~NC01Iq8Hhs zj7(Qr9edCAW#(4*k=h1}id{yYX36B@?MPMjI`_PYfXz$wU&QjZJ}&R=!lQbKv3ebT zl8}?nv&w!sUv4so0GZV-`S-tCyoPiIv?NI zUS%ImM8Kyp)X)aF({thRQL59bJz zRO)7q5-Z(X=|-DN(uv2a=w@^y#0Rl4!TmmdO8UTy}U5BH!}?>#ui zQq>-57F#i^x0yVfkKJpX9R8c0|9X#pv#{nXUG!=HQ&YVhHbBQw=0MosHXdd<(tYR1 zzNGIg%B8!>)Pe=l_m(8Cn4W?4O`$-Nxn;r7C;1gCnI9k@n z@0a|ja`m>5E*q)KT&#VwpT87tbg{zk()gw4faA97n^qZ#M?cY0b_gCHLl=5$PS?&t zblCQtG!2oed#25}kKR+96gTL&un8(DxS=pqWzF4Pa9$LE_=E!X{ z;Nx`F&a`Mzf*Yow;4hk&oCZ=$^%60?CZ;RHL-B4hWGMK-mU~8iH^|NPh82-8sxKp7Ytxnle;C zIqKpUsE-*O6sd!dqthRt?6W>@68+hCZs&{g$L`(#6G)d5rlM6)iXV@ivF6N92;F0t zUEX^ubo6Sm?cwia6bPhah)k}pwZCn7Yy4aPquJQz**M#%z^q$^dy__L*VEMf-&}s~ z{bCrorf~+&Sp5XTp5PJoXJb2{pzaD)P(X_1jqFk9MDD~bvgGtNXL*^%*OR*!-LFZJ z3}f5S)6od-e}A=-`t2@K0PNn71jDIS?N7Vfm@M}>^_vr-^oC3eges9FDeF!=05}wy zVgok$`YkczP2K;p&o!usCOqyTKCNWR|51VE{*22FlYji58sPsh#B<&m9F+Zfxqj1s ziYs0#kL*tYwhn0V1~Xblo#v5A%IJqn^ss83GI&|+Qhs#>MC{FJ{f}VkACkuO{_+mW zK>GiCpS*1fRPQ#|F=bx&ZR1wVrF7eqO%K8SlVqtbqlF4R2=Ke2{}y@a>(awcrPzJuqu{7#51rL4vG5 z*Dne{T?M6MDFNrV8Vd_i!j~ZXPxNW~a8En9E(Jy%hmy!(PZU9m{(hxtXV@TyJyQ!v zHbg6CMvy=yy7#v4m&SFb6>9*j>5oQtJ_PXe`d_bg5czq%{WibDy8V6@xrYBq^DCM! ziW1DQZy)n7GlVhdMZMv@@`xMch+;z_UrUKtULD#j)xfU3@*6=J33gg$p0A}1TE4>H zGd-a&*DYnSB2m%+RF??le1;@CzOsi6DHM(|W4OuKsU$<}c@~ZK1lcjmx|05%QyZz3 zW`}qp(q1ku+b&Q8ym8A%?K=5LN}WRi1BC{?_=MxbR_sCPpY zDhTpfL*f_dy$IoytiwmC%r|rOKr`+}SmZlRA$X}+ddcN0E&M2Mig$pfBLE?JqVsf2 z$XbeqYlgf1M@K-&LGrag?>HL7R)k6VX;EofP0!`pMY-N-C{u>^a@9L~;@3?Bh&S?I zFEI3}K1w_sQvGNfBYMSEe>0%?$g&|#XT7c%SMNF5p>6>kj2Tt*YNE0JGKTt%KvhL8 zY8U9+LCTX|DXjaIUEKLlgWdCy0=L!R|pt$kP~?%7De zams}${&jC2wvq|{vOd!=Sz^ST8SQ#;qm=rR7F8M}*U1TW{Jz#P|Kudag>F$>L-j{4 z-#WzBC?&O|Zh31hV2LOqkLwMjna0CI>DwaJa-z%&UMv`OJ zI;A;BJ)U%!;yr;b*5&;4vCTiWL&(hfQa?!#sqoXvBX-^|@mEPEE^9Xk3hY2}kqrG= zMov$uv63Ahp^Q|s)m_};xZrjlSe#zEc4&YzDDLN^a6=}+i@6~*XoqS9JW+3x8dOlz zf;@<5pCo2XpHqmWW5<ZJL8b$W& z02n?U_zNL>PaAZ@h^Lh4(ry}DH|d2p6)twW9sMX%1qm?eO86;;ZoR<0UaySfC;C1! zgf4%BUfeuqr!8%0e&6s*ebM2d)8es}e#xgq9vtAW63_fq50ZW{%uL2B=J1ax>9hd8 zN*thl_XaT~Xz0&d#)JP2u|lg|cMP(2v`A;Uh;X;q<_NjrMu08WBip92si{hAJ*uAb zuMNg`wUwEXUyO5qkeYa_Q-&Z?@nvuKEXGcoxY{-w6a+W0@7DY6yowHSuzVkM8F_Og zmlk*P`L{z6SHJg3=-Cc`ulOt^5vQ@oFb}Hd#RW{c9g|i$=pq@ISEk<6(c5h$7Nak{ zTTH2@Myd+jtX!5ode7a;tlNMXNfzX~EF5kT$)MMcZyPzCrZWZ~=+R--*?P?5Go&dM z@A)k9?Y}?{tuzj6_QEJnu<-(Jc`MF`ZR(#5Y6zJ54o=ZPbh*o-%#p77Mu0`byU|8f zqOx1TR4z?o0vYgGS+Rjht1h#bCB`^;j8iT<{ub~Xj%Jr4h9DgvI+j#H4LGUAj6e2r z6S5Ds+)jXjn~JNHOqh~+B}P(Lmq*PUJr(<6tjnA7e)(m9b1P=()42G|j9|C!>}MEv z?<8^8&R*ZO=6Dyd8FADlt9E6>^T27$`~&^ILwL(O<`fc7vW==y@hYBgdFZC3B?yr> z%TBp$C>F)bSWe!vxcd#t_CLetjX(pYYEM7QL9$@-SY`Y;<+IPf8-(6vnT|?HqJ-&m?oXJ zD>#72)%8iQva%gr!oV{2;bS+hg4TB@*Dlns$^Z2tfUqzrFSL$2RcEK&3qbWKk-EA& z=3-lG`+J7Ry9s|HpFyR6shwZ$wZE2uP!*u5)GZa9soONiOnSVG)iqMNU}tKpM5JIM-Y7C5Mb&dbR|nQ{^?iU2gL03_<6!WWMSkC6UQN-q70OMw|s* z+id-c4-gL1Sfe2zop9t}(cNQZjvDOGw^;qW1&(Ej#4{L50CA18qcIy=@2l_De4I$K zPZ!8xVak9gx$lIlah&R3lqlLdgF=be)vr6&aob}l<`1@u@WQ2mydi5yQS2Ipqj07p z$ivI?6pT<1SY9NF0OPHrerpcwBSxj)w4HJ%^Id64CTIU>@bCohs{SWFg~GIr#XU8Q zG5t0tpN?ZxRfd!(QT$~P2LdXTS~KxxANm-ph4rkW-~$^E2QsGBybk8)_5`}qn^l*N zClxd9NMuQEU(dFq3L39VqI!hVi_>V7~c;$=p^At4MHbkl5dKVj8 z`lQ~P6Z+VdTbXO0P5_sZ47ilwAs_`(=e$fIWGcf=mh<;)3$hoOg`)3G=|yI z)j(+8RFUJwBP>5eH{SYGyJ?JVlrg-eXgBdT5QmzWI_bhNZ1iN49Q{Y`l?{8-Bh>qT z28DMTABonL<*e#fHw&f@>M2A=U287%IG8lr9je8~X7mw7u7+JC@H0T7-eHGcOe zZIalQo}Wc`uFzg1Z=R)eDr{-F5V(_jWm+<|koPQE=X}b%DKHwE-Mq?^W&X>A{MvX~ zs8sNFg$3qeBv-A(bNi1bw=`=GncNoAL((5r)UY(9B*3D3sMFt6Y3U4^+BA0DKCvjO zr`%y8QywzF@fAoLSN0Cc{^_f**N;{EZYl3!(7L~WW48Bu39SWz8n>MF8}!Bd7pnN5 zF6h-Hn!sLu|A4_?kuhsqAop z_+i^vrIR)AP#nOHdO~`VDL`nqc-Ocje^~ny*rQh_$+KA5-q{^^yb=#RMV33bv4*5#kLVEC3rwQGVQqrkO z{9674Q5GN<{6c9?wMnsO@;jTvTa3Sht%5NA;`Jhnav8ij7T6LVj^VLo6{b{zN>NV7 zG`RxA+s=7OW;68OYm6Zb`c^)MSw#5mO4D+wUA5fGzX|l2p~de&g#R(L>g_8n*H*=u z+2I|&j|bQTAV&Ay;>;*iTSWeVR!mn~$mCN6l7|Jaa{%4E{k7>}V#YRkMq&Lt@C>0i z>BhQ%kWLz!`w28*-1*OBY5{l`8Ecw0eD1Ldp;f+d8z};oJVU_`BXiNcdsrr5Hdx!N zp_UthF^6mhgS$_j=(47D^=+3cE3h^{f~Po14Rw~Hab4Hiz+(=@@eJrO+}q(FQZjz9 zn*gHl!Go#As!8~_d(SKFA8?1qQR3vu`{`ot7G~e)rs@mY(@SJxxSD&ClC3cGhtH7{ z_=W^Ru~xka2Mx-o-#+BzyC$GOa7HoO&G!thGugm_UW($~qA#0%T%|GKYP3E7B~xeZ z)qlDsElV#eK{8%TkHB-!y(`$hJf}+)5)ZaILqd5RMbPLJZZWFH_O)xb;={*@gMa6E z^vGSoai-g@Z5H2#>+An@N$=4D55!Fev<4Z_?^^=tIvg5}2OkEEyPF>oL#?sI$gzX3 zJ1pUZwt`-G3mN&NfYX<46BHMeFbu_EXg2z*lRJ;ZXH3zgZT-F(7JRF-xxc64F@}aD z?YlDTc&U+-Pc9MK-6?wdWXxz{ir0|bb~$XL5;9?Ekfy5a%lH*04=#mCxq?5vxyUW? z??gPy$BzFhq84d`5XWy0hZWv~OX-0}4Bto>^BK~dus(xW$ibi&!!a-Zc(^*fQ{Geu#@zcC%3yKE;$z!J^bmHGMhc|-G!?j zYt7~d%s}-LW}sYvk%4@miIPm1f%*-M4E(I6vEF-S66)yozHtwp%IEH3I{RyWp|Nu|duG6TM(>JUgid8`hupuc;~J39bRWW# z|5YfZ2RI`HIkUcqY;=?DoE1f1>Lb%867d9TN zX_y^JU`EP+b?ZWd43%O!pich>f>5;mw59&cb8-74s2Ds9e%)}Pe%wNu!R4~ROX zbT6byF^e~zmcOh3TDCt#DI}?=B@47*`=CH?(82hnM5<(N4~&rqw3KUzyte(f z+SamjW3981sr^BDvlr*RmiijQ=}~TroD?;2?=%VOhv&X|r8v30ey>>kwbGm?U^8(~ zT@(OsQk;%(dmZ{(xrm%C{ZI56nfTfCJq>Ja5V(|I08~+?W_Y-ebm7dTgHHD^_c@s` z@Ufn&j}>E1ugBoy&VH@WxI5)3v9Nmp93zWuyi$3mF;0}1Ywfp=%fVXv5`TP7!~)*No$D*T>{QGQ9<9_n^)>8{v`IzPioY`eoZzWxI~)2PYR=IuKK zoE1Dr9vhACYv{(K#RVk*?c8RXF>^p`JLz!hG~nqfkHD-sqjA16gfd)iJEk{Mp9=oN z(gHWyoh0UHG(J%ZZ|yLcE&qn@JXs?o3c*&*scCd(U zaT;DKwW&kkb~MK+Dkg2_f3f$TVNI=D+o+1zSb~KjAZ3YyAVr#yE-Ik(-kbDZq?ZH* zltmK}0qG*r38D9ZNbk}TLW@WzKxhe&5I8g7+TYsyeZTAcIoEamZ2kaoGMU8jjB<~A z+yfme<`YG(kyJA#^oPg*3|6LSv&R%xO0m(?>-6z!;^K~c3{I971|5TU$*HhT)gFHC zopCoAzfaYY?2;bj1)f0RJ!5AXFb@!8jfc~WK9NdH~#VBe0E_geDJQEt63=MsVEZbis8&vYQG; zi!A}PYW__QA5D|h&DIYl?+!_7$~y`YhOc+Na1x3ZKeVkpWpl9R&JT}Mqo)r^ zT&jPa@w+b@0c1RhJQt8;&R)9^<-Gqr@$Br}l!mH&KBIKxPTI96G*cO)8;Df`8{2U9 zWDg$)@`0!$vQvSOvyny*)M774EDc?-M5s*1CMsMJ0A|+S`r0z~fVGQ0RD5!y!UY-7?p51*zRUG!oLs7G$()Ade7Spp z=CP$MOp&+EX&qdsD<)WE@3+o1o&kS0IJxaXika;zG=y-zml8l62gk&Tj;P49VSTgU z**|}rRx#y6WU%aUD_-U$6Ma>IGCjS2*F^j8{u@A8l{u-B8#{*WCQ{~%MSoalnr7?K zd+|f=`>=>3a1<(h(_Yx>1;N>3tz=?5PA3The~6<{((v})Cz=lK%-`w(^|xqZS6UBO z-R&ph#P|FCviSw=2ePg+2u;*!}Gz_x~a)f-{K!6AA=XP90JZ1)x#kQ%U zC3h>{aY8bY=_T|~X20bhhqeH{*~K8^i~jJ|LCrhw3I@tir)MGLoVS3qOy zwNrl-{;zk+fio}Hso3w@$YAI1a#`LdEG-pDfZkM5N7D_U0QC`j50p5{3v{m8D2b+IGgu)`wE4sWy+FybSaG zOF9!kOQT*etK!*3km6109^9(3 zM}XbPdZw=Q(HlZCA9jsU`oS9V?t~N-RYWjPooFJOR5Hx*=HOpf<7BE8^`h)?b^KBK z10m5>I>gzakq@LyX9cUutFbyw>zMIZ=I!mR%QBoK3_FvX#_o)Xuo<+ z>*88pLzPJwmAv6Ge``x(3;;j3(kDJd&=IV2(?E&CfzMn6HF&bWB4Z1J_hS1oTgqv7a$%Y#7EIR)%cr<|S;STHzS=orn>$c#O<>MILShTFWrE(e1rfyqo zK0ZD^g4!;ExY@`uyOuK1ur(H8qXZuA<{B}4ys?UW-EYA`S((56sHsuLuj|FWK_Td) z_%7C;)LOnGm^eC~PeB@Rv^q%DGo2Ea%h*4tvoq>rEf9`v5S>&E+Z zsZAIY5y$pXna{rVnY($;1q?vzJMUi!Yq=Y0e8eBJnSp`N>AehmyQiyZnQ*lgbU>e^ z(S8*3fs%6RRItSY9}_Q)NBoqb*AM3j4ox(})wmgN`!6D~4=?*O&T0bMAp@T)8Hn|ped_d(FjSXq|)Wr#XG zQj4p-|6##)se%E|KG2us!y*n8ju@ujG3)QWltC900OyOGXEbwupvfWY4_aKr< zk<<^3CGHoCr6Sau1;0G$Nu8Bo3yU3Xw>eCk>GL;@S$aQwSZU{|(b1SYBD41-I{gr8 zBQVA5eyF>)J^I;$ZfEOf$Aa?K6ys%QZc&vLsqAZN{=7B(i=5a9daiR@YV!2VUdBEm zprJMKNid;1lzK7!lY<_5Z;}7cM%bIu+?N@BrcpZjUtOYpY_Y%vF>aX>zmbtOqSw}e zSH~l*E7WIOI@MSiqPKHsi(+qm*l!vo%ON-}(=gZg^x3)N5IFCB><#o}S z!AH8U38fd~QV}8hpo)&MA0I!R5e9o{DhN>`vlRxF1XS_{{5kA_e)!Zn2NaTD&c)h8 zpHi>lTAnkncBmrN*Cr2Z$W@vhn2YF1v4|0y{M4;#Tc0Jii+Z3sU>RlT+53RyS)@31 zpx$PyfXDEqn-V2Y1ZTJ3_4U*Sc8foDNdncKrnPIO$ea|pos`=aFlzJ#Ds#~`L+a1+ z+e(9rsw`>7lfEs|Ai6nvFZf<#vGdqDTc{~wWYZ}Y2hi2#Yxqw)Rr)%}c&mAw~k-r-m8cYB`Ee(4PQaq-$xOUx=C_HYdm@D8V z>x7}r^ga7q)1jKC=Na>U!mVJCSokX__{-qbKE_nVNX-G?sAOvlhraPRDwyuoUPU20 z@U_%|=3^g^>BFa9EeY<s;BTrxXU1D;=ClFAWPpGR95eai||R+Q!&c zaxmActK*|&3UbIKq3ma3dn-tS-Ol^uKIZ31i2PYBAJFujr~qj75I^O#q+44GBOY5U zCi*p*@fCt{Bi4N?(RtO*h2k-XY<*L_RqIWd@66~fhBu%}NAyoj@+WE7+^T^}6sw-v zkt4ynp<@e$$lV`1T5Vbm7PGcKfteFqDsI*y@E?B-o7Dv6?p*FmpG*lNRk7JEyfe~~ zd}YD3_UNup$W-GL_o(4J`)+qy(Coq_2o!&OS;&MTp3xf?H zwpI%Xf3gw^T+o`@+A-Dok#P|ip}M*}QTNGLJfHzxkY1`CepBq(k&2drGZ9tAA)aRF z%?IfLnj@3>6#GeW7GS3OIRNr4Kl!hh!%IFx4<6labe2G)v#vK8dCGtuWMl7o5!iSa zG4o^wrf?aFNn6OzbT|%cw~AvJMO&v`s|LouekChU zc~7yqEO?BXCsLkzRPl*ud}{7=9(@@l*&fKp6lWQC+fN0M&U4sUCasLAZ`{;!T$H{1 zN1E;s@4Noz7}=FYanG%W)OLLnqlZ~~=bEy>EbVr2_<1I%91GE3bRz_9*W9=i1rR0( z`opsv;?qHo(xB~2Pn}mJf52urW|I$n^LJE!MFBJ+LP-0skd?LG>9KCwzzpqQa4{1j zlhL92kny8cC4bV6>rQUuks64F>TLADcILEF>c}Ikv{!2sdf_7Oa>Lib@a;O!p6vTz zvF!ZT7}1d?kd~7*>9U1{KkmEZMG{Z#?Of3_ZV3JJkM%^QYNSWK{P=R5Tlyy!Q%9K< zRWfuXtD*fa+hOP-&lPz_O0V|IxH$s86nn7;PbfL3dhm315%`&owStgu(s5sno=0D% zDL8tx_;$^;xYE18*8JI#Q03?ECWBA-a&!2EAJHCGL5b<3U4v%J--key*aDySU4?Jm zJQoHE?sCz1I=)a9j=Ol7xr4KmMcj?IxD*X8x&ssQ(j2sX%xyIg?oRDtD6q3$=A1P# zf(lS>v3x#N*3@R>{6bL%;`MA`9VE}=HKt&-wVBi6_XA|8cql*X(y_-PCH_G2OY2^J zvg%YR94V(xt{ywt1J3ea-tR#!eX7kmD*cqjdp%T{z`4>dyb;g3_& zZtQ2t_nTo4c=Yh(_JFb?W5mT*lE9PwGqn7lCzJZe?Ez&Fo+pB*-z%`bT46ULKLk5d zCy%Q;Qx!}~7w-Uy` zzx>yyD;fY)_pk3xzIgN$=+FLs&CXXvMMZ=uT0U#g?w_BW>lWTr>m3W10#~YctTK$* z|MTBZuAca#kIEHB7XJLV4=3^e?U%-zTybH0oBE%>Y0$2sZ|LtIw-d28W2rVX&i(hN zA%EvwF7o$POqcaK{(iK-UtBtJo}8R4bomtEPVm)ma?t;sdopNasgT zOg&R}_ofX;O0myzcp3-a+nLq5(&`TO28DPzA|B9TI4YRi3B9&CyMhI462%P_i$KuP zw(8N{xf*_3tQfQ}W_g(+&0%U|zYmeqPZ2gkjG0x0(m{eBBSo&ue0f3?r}Z#yzn9!- z>Uo;JIk0*Qx{P=eH2g@d6rDARfK?BW!XWqE^v{b=+&pYD3FD%lCvwCqgW%C~a!VfJSDMHQ=Y2`07Fp~5FepGirNZMMDmRvvDE;hWQ8hK7E2W@QTG z;h)#-VZ;g!J##DG-3%eQp`?M0{!j91tXi(?@}=%iaui4;wPJ>f>h^fvnr+-8(Bicf z$8v^xte&J_c`tJhjpue&MnSGveN$(opX>T5uCz5BYfc5$M*+>E5>0U02i*;TdthGaEC0=&cg579cmA zi1j~Mdo5W`Bl=d9PoM$TYVL!VeNVr(#4?1jJj!22Q7M{!8XTE8GHM|OY#*T+kfGR= z2~mBviR4G3x~vTavNHVY^SIa~_4m+QL%S6_&Gsy4Wcq%z;j9jikO`pe^-C=u%AHd+ zttBoIq;ouw!r=Adz|X7A0+>b_AWVIUIV5ao-N7?0$_hF&OTz;2N7V&gyYSy5)MbCh z?IVgwT+=!ZwHj>0Zt}X3dC$?{y!f{AV~h&na+wp7Tl)r9QBml$~N`E)&<9O>G{nUAa0s5F{a;~f90naTNfUbw_ClT+#B+}PF^oAtWMpU+@R zgabBQk6x2A_e&Q|rw(DJG=m-8JS#vf=7S|#$JRwGCU0?0qOQcZW52!JJw$x}o$9#j zkB9UsFgy2#rjj30WM0C4jaXH(cEhN?JY$xlF0Ot*_Lv*yVB(DpO;{E1u$sITAQPo)#!65!NsspkJD>pEU`ig+S)cjO^gXMtlhzifAFiR zf1(;SOxT4$^22>>%)Y~1oL_rWQtWCY%laIlFTAOe({ zb!fr>GP8LZgV&4qwp65Ozc2#~c7Gifsq(JebAj-x3(!N0A0QL7j(7VdBc6F&umF8T_8bDog=VACG;4iI_2@vkaRi|;#M$ii?VmbOqB|6+ zVB_%431}?g2Bb&l=bhNp$iVdWB9$ydQjTlt=;rDYjy#O(87*(PYZH{`oHQ_)6JnV^ z)Pa9{!f}m*JGU&d$WuaRc2&$qcQ#G92EYjm4#AO|V)4V7lULE$m)g zN5ycNhpEwCG-P9ScE#;xJ9_T`J@|8@$&Pp5Yo?nj5IQ#|;|O5mRr9SQr5jpF9#bVN|04^jiX-c6ea?AA>0b>^*-`@YS(8Jzy=< zi){RG+;p>Tfs|@T+7mld6(PYNP#$rJ?zRjY)#Bhr_FqK^%*148`rsXUQTH)%xp=Me zjAwf0xVM_axpZs?s`wkeq_G{lgGBMfx*3>SLbsVplO-K~%_~o^TyLKAUVv`>dW6lu zWcATgu9u4qD93X^2U-egUqmWsD}A~nYJ)Fwm=Y-TT-Ol^cp#fLe6I4Q-l_~H0vqfW zB3QWskX&A{@Rf~?^dqhwL;=JE1sOyH$(r>mHt_Qvt7Yg*V%{h{CCE7n^CL{eJ3p2C z7tGPWq-B=qa4^-aV=r5C2nfBoiZO&%OT#jvZ4}&lDs0xGj zKz$4r-m}GL5h`+0gasTG`0vR>=p)%2oy=_pda4Q$7~xXrMMdypbD`nxtRZaRk&Q#N z6P?yW3pfm8P~159Yp=Q-+@N#5gCW8evmW)f%8CfUp6dkGoE;$8fbqfQ+V7W#?wN6mUDZQVmoL=- z?V2OmC$Kvr(t?@c;b!(uJ7G+#Yu&1B_O#ZLnbS{*LT?6`efm#QxsFfcLt9|OcdE;H~FHybug7Bg0FTPdKT_LCzAY^x8?;O`k_@J7(?`NZYVSlKr-Ui3rB;BK8 zs_>wZcVphTcL%21NWG8!${inu_RXYW#rko_G@PLNsI^z~;X4ZeU8xehG$~G1jYiO8 z2#uVY^F_mQgm?UKA59`3Q8*yd3!>I!de`d*>IRc|fGFl3xyM=e0+nr)`_@)TszCQv zfZW%_IPrLv*z7IKk3$ad#=ibN7N!*BnNe4J&&HwakgS@;f7i;Z`0IaY<+1i(+)|u} zy+xPu5b=bOPpHBLNM}Yj{-Ru2Vk2~h_7)`*K0+I|(j1clnYhJD0U;Os zthe$$jKl~;wl8TU%ri_ah;_b$R36qdcD$fX{qqJ8MwE7?N1iRr#5(C7ygQd@`eUzI zR|#U0(_D-ryd;N^;=e;kqU^~jX}dK{)?Re?*g0^C?oSl&2C=#Y-X{7Ba0C|Ljel5j zNJv-|U9&g;<^VR!`i%cn6>yWiO)|#d=q4>JsnbDlbfx~S4xh@7ZK8=k9vax3mzc^l zS;i#q@?GDS^k?A=J`0BeC67+a6dVzLerc?+Hzr;VHqwngB51PZy7=qIcm@2LIUQ#K zTuw3m@p(ViP7%8^bWcxIChdoLvF})o?;&3rpi9n|xGrVzTf(T%+DT*aTa*2`*PN7+ zpnTVWpISx?3;$hn7sgZs3$aJB7U;VtXmTazI6yL98f1vy^WdoQ2Ue{`hp#?#x649z zywYT9)dZ2T4CI{j4NimgM8jt0TeF)|c?*V1k2#00O8M$d%or^9yqWI7Xy)XSBjrRy z6(l;Fr*^~pLNG-WvMApZh_a*rUfwvm?S?wfJ%2z__GHI64K+gpZe4 z6tS9A2H9Nm^H*=#tobDe4Du5ZyW8pf1q@xLg3HWxSFrsoxo171G@n9|45xvg;@#$q z0?VlXFszuZMcZ{bHhIT3;u}p@gRF$N4r^39&;X@L`@8sKK8?Rqwks_Pd$j7{%d2r7kl|w# zT~E}J+I`uR&YkBm{y9PG3~_*~od%9USo!*4+C zQ7Nh&BJ=s`6F1#|v@9L|39c^Fu4R|3O-4^ctD*jZtHOTVDS}063QqK^4D=l8Zf_Mo zk@60UR#xU-&8O?#DYs(;)x>=C_02(G$}NnpeD;FZINrgVzb;WQ#~yxHh`?~=*z}_hol$nl|qyCQG-Ei z@wYu!toJwM@hu!$cJw6IE_+~_WLqcqP-BSF7x8Hk?~R3OzT%0E#v`> z9VU77r9OV1)s~oN4Ag*Z0QJ2p@~f%0KfqqtsgG0BcWHFeK!&3OZagP8CghlvM!l~z z0f*DTqpJWX6B(YnJ*-h@(pwqxXl?(O&-C~~o;QP3m&oW(;zxT?#_9u;?uiS<85`sL z-zHoWtj76SG8zqkoqJ8OozqpU>cvF4dpgKxL?A0er09Rh*NtNr7qSZheH-z{!*BAX zgV&2Fo%lIkIJ+G)k|&-M``T8;En|S?;~8UBY3&uufJ)z39n4;{NFwti?7ZfX|9i!} zdXoJee(~s^HW`N~%y1133ZxJ{jb)J1hHT9FWWxqb3BSa)JiH@vr5JV3=3ml#$$e>w zmQRiV&unMcyE+dwo5TAx7*O{}_koW-OmSNA*ZC~B_KLb@57-XBMhO8<$M05*h`wvywbU73Ckn=1ZS~?HX30h0aYyTeXQwc%c)A zd#CiM$O!M4+DM4D76~jzv3(#ca73?`^}nl85zdH2;n4(uP6Y!3nFugGULfkJz z?3X!FDVbZx_}aM7y%0bPC@e7-*FF-QD)XlDXYY#~wgFIg86~dt2~)ji&=bKkl(u=H zsF;;^;EJD@V$z1GEP+kI$i~Ys9N|(4kcvzJ2-R^aA`sR)V%TC^nCC#3G=7d^Qu>S7 zB86_Gs7XrTgCldf@Ynm@Y}sS#P^_cVSwuzM!kzlJJ;_U=)iO~w4z~*1v`eu}z0G<; zJpw{CE!`bVeZB8%AZGTp@nU{Sdr?<8r722Ke`?Q&AGz& z@kEesFCglO4Q>HHef@`z0!fH)v8-sq$qXc5qEF-R-|mGHMI%x&Oj%R8g}i)i(j>fq z!6a~#<&>&T@<2*-dmjNy3Q_Hw;wh6US(mXGmlj%l$x-4iVug1==|xdsTxD`MmD;pE z#?{xX&!7GB3?K0feUPQPdXVr7d+;=@tadxlY3T{z5$P@`!Eag`A{2V=J>CY!PrBIb zZSkLK?MkEO+Y_o|1C{1s@+You6j1hCf#e0oW3Nw^*)qN;8rk$9P(|Af+#<IL}z_jO6YEYdK9V;0#@90^aOSb^k16Kge8HmVr4Jcd#IWg=cNc zV`!U96mlged3#*UwuHF>|MwH{f9p=4n(-y=0s%K<2m43{mt8CQv4h`R=$o7~K5(BtyqNCpsPIt>OA)WopMEi_-8 zcmv7NXoP2v#YGg+Yppc~kRxc-NP)A);-Gt5ZUK~r!8lE{JJWAFoqW2$dN-b=V0EF-;pP#^Ji4HU@7(4CS9H(c>4>7V*5D#a$ ziL{8V9@!y&%={AU2F}W!tN5Ul5Sw2HQZh6n(WuZVJ09iz>Ux=8vu`N;q#mh|QoFhM zo%#N0@Ub&wFXREip`bD;+OJkQ+kKF?A3z6FIn-umi}=QBrHmz7$xP%Ic(|IB8qQYH zjFfgb&%hmD_eWBrWHBqO=?R5h>*{D3?5isz&*!LQX}{(kNc3~=^$XRjbg|@N1#u*s zTe*{CxA+5I1;FP1jQ%7wOwisPWfhxvFZG~rr#@Gt$~@}S+(ILLdwO@HclBGF#;T@o zIljlPuGST17M%cJSr6-`?UZij3rL_M-H{1^d<@@0r0MlohWiiNp^Wr;AO>q50@bUv z7gkaqshw}BD%@ns zdg|hSz2AHxdmzcj4c$I|sXyw>R#GCu_F89^=I%9wf{$cQLNJQ;?!zZ;04`)UR3{T4 z1PV~kIUZq`Ytaq%(iY2d)*0AiK&@Fpk+vOGoOf|a=V1<0F^+KQdqP@{(P>c40v#)V zxj54PEHR&gdsRq7y*vgZ zYZvaK7YK?b2M>}!5XER7Qw(<2#F}!3x;J=Z&&-nx6!B%y!a)Y23zCE^;~+y{090z} zHR+u4BQy)HXNjw`pj!n?uJQ1VQ=Pq>=F(SY@87A3$BfMQe2m%+2rOv@MEuai{IWR+ zdL=55QPc|dSMqMWYsJIEwcgS&z><)wwI}$6^O2f}tz`as{f&V_LzsXe6DVLo&^tvu zAbs?Q<3$x^u6RR3>P9tvsv1e<%Gw8@FKa02amoAH%yJmx|hfu;t^_&pQoxYXe)vg6r!_j8Qxb&j@%G~c@F{LxBtVaR*@XwUFM0q zU`m5hhAYQ;lX15|fw|?M+Jh-p3!ixct}Dg|5;#_|3mPcO8KA`c&b<~xH?e@C>fZ|K zo(qb(7Lxm^jSw*XBhV#*o#?9A%y=M7)Bp?GXfF$lt@}=x(s?`)eu9uKETxoO2>86=|OH1j6fk6-7L(b{^Ovc4RRBba`cjE({Y^)KzM-|7c zurHL-;Sa0IPvbjNz(gpMMA?LkI05(FsT%>ayJIw6*-`ghqo~i)o(e&aY~25=ez*syHXX zvMrb4!VJ-ueCTj>n%hc-rAPID>Rm}6ad3&)SlzND53^c}xa*<5C!R?9wKLzpBhZ^Q z$VfVCpi{f-%re#8<2_rKb6(;lqj%G3J4O@d7H`~%(BC3|8J#6OPrq4Y`3_X=>ZC=~ z&A~MF?qSvyfQy?hqroVgeEN9vCF#6LKOAB?U_=sKcJ(ZKblA1m2-6x4~K z7N{OJV zD4FE{6$_bF-}@+$&U>?Yz;1fi`ZP-Y0*)`bUjo;=%6>-$D*mwX=ZyR~=bnq{7}a+P ze^J_)d+TGS2y<7xb;CO1uKV4G!zYtkbiSp{T0{Q#kKW>)ZiK!K7Czgts(`berFfX$ zkB%%`EPh^k_}rxD!0flPTJUjJJ}D7eFrCVMpPDYFYUg*3cvH{%)lzn}x-3@hH?u{U zVZAj0`%0KlY)4kh^qp73c&H&InJ5hSa^8Y{TAs~dh}l)s8A}HrhD9HN;;lyck7FS~ z9h}dzmQi%Xjc3G{NR4RJEsUt?vN_EAD=wn!?e&WI zdC<4nT@{B&fyy%cX+R!AYV>ZaGew}vR9jaVP##wwn{`QPtSq1X(z^=fxBK-h(f=C5 zHci+*Py2Qr0u%YUy*HioHrgZ7i*;DwUV2%#I3c$~TF>oZ96IP%&GFM>zi{5C2+;^{ zWJI&{cTdp7|5*ZlT)N6wdZf+~(5n%cauYve59KGBa@AD-fd z1!`vVF<@QiR)FeB4o^82gb*d-o}o!O`m!~ZH1YKUR1u_4!}EsK`z3nYuQ*};`=Kc_ z^?v387X-3ugV=I|g}K4AMemq7ic)&+pMQd4514(~5+V%1A`byrL;xRk)?FZfOem6+ zVK&bj=d7aMiyi;88icg~_ZM39@Zy6YekPnr`J&sP*Kyw=vk+s090&SPqjP6=0;Myw z0Lyr5i~uAfWjWu=0@$E4TID$FERilra|VRrXK<|Qat3^~$L>b^y$<&AvO-~GvZO;& zWzNW}T1Xke?RnSHrymlQSrHva22V%N^`SkRx3-2S#6i1-n_kU8IVT zu@I{rC%5~OeI8w+;!jRKmi`f~3AYx|7QoY%%rx>xvuGAs&G-U#k+Mbgy*x`(EM0km z>N|^k63Xq1Q*{orR>z11$>cw5f`tG6`WGxydB(=4_jO4&QEI zR+%!H^uBj~O@7Vsl1FRwf&+<*_0&OkE{Su-DF`h zc<=_tLNQs5tOX2=!FoMRlFBVZT_gZdBh>`fi`mq=40`M5+R#^ifBpEAvBrqz&o61mV&-*IX6xgv0Q2#m^3&;2V({{wD;bY~uq_4)V=m}mpa%8w z(jQ28^AmZ<%SDfy8H0g7CqXkMHf+16=s%;Ehc8P~J|o$Bc<7RJ0oiHL-V?FKZ804} zW4g6%uB*enn^tESftY28GqHRhRxVx}lrm0$0I1kn%!noY&{ia7_Z3f1fzC0hU{F>U zehJ1#Cq1GuH|=I_AiBA@X;6`L=LtSgwCt=}tJh<^kg;@?Ic&IOF35j;E>LJq{YvADk4eXfOYNZ* zD%bo{j#>%&mAet>z4gv@E1mhA>a{OZz}!l4<^x|KA|;)H55?YQgA}w*)9-3Pc>sk^ zsG6wQL8xJhg~OV^{H9sZmlWmKA7t@Gk5}*2aw#6q6y9Nde2*)@9(ph^Fj_ue(k@+n zr$kFIu7IBWNt8b@9Jvu8=R zed&l4S7&4PbQDFESydn*=*oz)HSpjd3Q?*8D+n%4FT0cnR$n8}2Xs$Aag$khyZ5ks zdZVWb5XaIgk?NJ!X9&;?{|GJwQlDdUDcd}qnzJs*r|r3ynlaVtw7-h<2YWj?23tUo z?b^pxn?Y=np>WXkhxxj(_Ag8#7U$`2UdN97=q1b+`T?P-TRdYRAF+$O^-qn*OUTg& z?1gP3U$DtY0?=ID&Ee-~Zn?@xA(N`pz$J4*HYYyyYROPh@^>;JA&S0iMQ)7Lc~gIE z&xnrMoHwt?CfgMg2ckAu5ejJlE#3ms@2s2p2jQ-Km@dX=VMN?o2Jk#e z`n&ehG=e61cfSz3#Cipk>~-!Z(9e1YM5`5HfHhIa2H1|SRStql!YEt2u(QIAzVP3a z6~TKN(Y>hYc;8-7;pg^oP_{mx@pW5 zb3OO`wxXwNAFPQ)se&$XzT12Ki2$gk;3WS$3EEKRAS_P9s&}_uigAmq z-|N~?YkqWj>L1C<e(ztWlX6fEOmm(mGQnxrXCmKLT z%7cv8Tr%LR77f>ci1imo0RM?_;Jk%_7zdM~b|L$u<6*?b6$z%`>1xoavc<2xr1uQ6 z*z4W>)5$K%O`q|>q}su%LTogRXWz204*LO6M8&K!I!p+p#rv)6c;m}X(iU$Z*-ZqJ zT{I+)`8nDc0f=QT^i7<=$%vbvAU!R-<6xyZHbaFh-Fw4tHFLeU;VV7|Ad-;2dLld= za8ozsnY^43jEa1LbfHR)`DV*);R7b}{yds)Hj>Xiko97awTqYgY*|-C*o08f%p};F zD=$Qi@@^aeNcIC8nM91rgY;(;;jXn0Y9z8U`4IDK8j|+4CT18MojHJ**Zqx{n^7m_ zSH2z4)fnXwg6HlJt_KF~_&OP>3tS7(jYD3FdAUs!li&v=KS1IBn2@lb%A)Rpe4bXX z8z(A%4M>aYz##B;jCg5FP0ri{_55L}&!5J_`o-wq>!y#sCzCWd{whi+F(AawkBvB| zTz#esD(USvXcv5B4U|^kF`%?kl&zV6{)E_uPtJHK^&>vqmbYcx^(LhxS!y?$`<$_N z1?A%-={7q0P=-&Rw|@X{O1Zy`MkccSZ3l?(fE zVUAF7g)T4b>y5@UOF5AFHX4a~MNg#2xeB1sh1E4G^b47^cc9JC3UfWt>?~!X?fQzf zUk<7EtQZ#GdP*th>lM5zmgjYx9OF0Q%HBy7&sy1M>hH6Uw1{8J!!n(Jc{99YT4*$69M=vYc+$j6oGk2JHK06BXC44(Pc^wP$EWNJg%XN5TqhK|rqyZZ zMdSkboOnYc0D$aQ3rxh%Dka$hXtH-%o2}+>qWMyTH-1IXr81_34v64utRFFzf9vJ# zMtdoGpdUKxt?g<*K!VRbjU=Pk)?X`ex~R+e%6*NsDi;p2W-p>S3OFfefH0+5?YB{I zT%Y&+DO`!zK=Bk9%H>pj=OxyLaZChw$2c_pd@2e|TcdzvXOz&`Hi?YyvK%K1f%C`v zu@0M)dn&8-2~MKN%a4duTV-#GYf%;~%Gk?R zzWcNAzsDG{l4&L-VsSU0$@)T)$8a{a>?wzjXQdF=`7t8Nq86$l_K>%eTHoFh>qNYt zmF55nH1sI$lm{)l+}{IaYnIbB!@1}@sLFsn2QE9<$-31hGw)hejl6{XB?n<4S`)Z+5eRqAsxiR z9^m4D)O)G+(LbrJ)e?`$P)9=-bBZ6PR#?UBMClnrk$N2puhbN-N@tf1q@1Hc_jn6SKJqG(nWeSui0QcMdlAfLgN5-D;gIS&WpzI6AaR zd)N$1llIaEdmG{V8==J?>!0U$`2^(6j}VjZ+aT|bPwP3LW;l&*P|g^Rj&_~yc_o4Y z_KF@2Jbd@^2JfA)-&J=ZvpMb+cvByAPJ$asfa@)@DudG!dQmuf^YzynW*T2?{XAJJ$S>!vjbz(P& zWU<8apZJDA{VTrpepC5?L_}4iiTiKM;V)aUiNj@0;+`hTUgha`xSHUY)a(L_xL}#) z1=Lewe+6%lx3@VnP8Ixo-U4XKj3*s6smu3v(Q_?IhgdV^9ZRX%7{&Sujvh+eLwUgk zRze09;2O7{&8L+I!EVbhcrxLp&ApYUP95z$e=4i(!q8zt^?mpleb6VUHb;jlUxh?& zhu4wLMNQPb=FQ4rFDwATFSkFlWm|!_KEJ%#$p6 z)2E^!5IudjGu_0GnE9cgL~SD#PS)aU>!9^$NJ>4C;>)P~=1dmi%ell^i~mgDac%HN z32H)wRCeGYFo5#7HX`P%-s9eOSiU|6Qy?sXmL(RwUgnDN1jZ$MH-14~rqOV^nN*)o z-h+2h8lDX#(-!07bvlA*;UK3R?82>&!EUpLduFuN_~>~D`nBWvJ=zjmk0ReBiE+US1B9sX&&JN2;dZ?lqpqsS1-VB+%{ydI~Kj<%ec; zTuP%*W=jG$A2Kp=xDG^o;_S$Szg=Qd*%VW4FF19m3c2*Xvg~t`%-10 znqKMzr3U!*rAHpuTJKy}WjKIU5@nN+IP&5?m!4M~X@u#W58H==U^%S; zI_kS+v#o4i!<%iUH-wdL;|?2QQeNPbgh@8YiloMrxROiXL4Q1(wVrtNyP&ElDAeje z#-s@Kz3_hfVaO0r;VzyOs&Y75>UhbY4^SnQ$(DltJ8B67EitnDDev5QU92n_2UXeJ zFwYgc@nw^68F_^_YongF%1^5g>ln}XhZA-%Uu?1Y+S(9O8gbsNhO6P~`%#Mmln<10 z8XxdXwJ2jA&&}Ky4L4^&OBiT=``9vS;j}Tmk$>J(KL+wW<%B3fmc(%SKG_y?ug6qBSIa z1(I}EZKIM()PkTAc@g+v59vw9glG=NDX*-k0E}^zQ_6e z1i%K@EM*KKdkb=(l=yd_G&U)jY!muc$&I<$`!OQbZo`{k#P+}fN1U9^v=SzzR%<+d z|0a2mLm<_s*rLfbC(E+Ug0Su%Dl5c=M|~b1C9IH+;DBmXmo_! zi;%b}L+CGHSinh!k!p3`qmdZ#(q>>GSvKWNVTNOafQ+IinT$a?%LmpO?(ms6oyB(j zRLsV)$E#NxbiR;m-W>T8Tqs5sLa(z7@)Jz?MSNK3EL&quVOLyUYvu|UE=p60;Ys(b zeQw`$`g-RZzY$^TP~OMzWq46!mK5qb_au@dureWKuEj)eEku!pDN98UTtzy5A@f@$5*)a>|G&rFf;k;+#<#srSj%1u}cZ zmY6Mto!-*RVQ*90t{d?Z?F3| z?F6mQiv_rx6jY5RM^U!{95{x=2|v(NY0D_14UzehzDG1PoSaa;|w(XfH{MY>?2GK6V=2U(l_*`DcYU&MmM5x^cNXHK}dm`vNh@-|HMXb+uk1J+I3go4&Dg1kJ#$lY(5nSbVJ!0 z7BmK;Ai+gHT>N1tYIRfVz#@(Em@kNUn zQnPi&bJ=eX#JuVWT(Get33DCEgumXu?KRCKm3{Dl36(8!o^aV7;4@+Y`b-k3T^ghG z8W|% zp(ri%sB{8^mV_iE`EPV)&bjaBto5w*y#1e71lCSg7W>-Q@2a0KuD(F_<~`_}EgrP0 zu&(Fo)U~LAOJP8Dh-3y^-d~oQOqpQo2AXv0ZA!tTjtam4dgh=-z47{_%08EkkcESr zA({Y;L+gB+2WF6n_P49Xel81~1r)U`7zxubXU{Z%cO6`flrD2U(3QJl7ymSDB+GHY z^Dylf?LB@Cp|tMP?#UObT8a-ikzQSo{47%r9p`#M4*w8?1Z;H- zY96>g-AlMA<9RUMrl6wJ9%i~UHxui~^F+SNq$7|QFkMO6*>?B$IFCDv_^-=P)-;N! z)wB+kx%-57vn>H7J_St_gjo9yBv4wV_)YJibv08)!6>5X4^LSP_f%0kW-lW#Ow61d(x1AOg!qr2Bx{e!EVH$c<+8*{r{~?>0W59z8Rg1AV$K5VE z*yxeQkM@A=ur=qCs6+rjx{aD-JJOFenqg!mg~N|6M{Mz$ zmjh1Ia42iycm>!jWW&^qX#J~HiTX&Ff}0`7Gzz0Vm@E$_Wd#%TbzDAr97uP|zjG!9 zkH@|$7%mHrOSoY2MB>6A=+6t&nFWsiZ9fTj%+X*|MIKDWZKl`zquSm{YKF?3G=pDDzQ#_p|aAWl8o^@P)-+7{yAqf*{&` zO<1Q1k;Oc&&nerMd}}y+BCfu4XE`@V(`Hy}^1L7czQ{MX>KfgwuhST@f|^RP>L*mc_gSRzEVM}jO)Dgr*+{Tt3h6)^ms-|-r} zKn3=@AP)YpWrVuT7_hz?;k+h&l4ras4+3*V*$Q|q@K*9B@fpm>7^(VlhCZlQ5D|A}Vv++CRmh-th{!c{Nz($MY&BpHaZ%i|< zw3j!HOO9*Q36W_VxUki$yi3RtzpoI}pjG_%A%JPV5cvpm378N#L`r`N8IEzB?`%6( zq;;`$4{dwQHg@YodwT&B4Cj6t82*$NEs2DE?h)kWqt9C)f53i4ll&JT*jbkg;^AIEG39J& zskc+;IDg1s{(}Sc^PT~ZdSK9wzSxc(JD}~kD{<-7+J;gh4}r9AJnHJReMB4jR_1LM zxnXKcwBA!HLF}|#)JLYX6AQl97F+cWU%0S5+Mc*CfGx882~j-hBA{IU*Gf{)dUB=5 z%2^wI$m_BO_ApNuRY)|kibJhaz7B5yqcH0&BR)SZPCed!Jj;gjnE{rZU-Cy>#If}j zPUw=X^!NdI>zQohHXr~vz&|2;8k2oQyh#+%Clg3itN^{T_|hf%q6PxB!1@ZeA_LW8 zIwHB3MPw+WVG=YFzqp(T$j6CT&~>nx1j4bgPps?V*|Ync>gU?9V;{aGrDuhJ{WI|) zH#fGf09#^JWf@(4QRZr-Iin}mpzLE@6GCSo8o(dxCIke1d$J#Rb#8L>9RPU@=qoWL zTS%X;o$Fg&$AE`aVT5Lj0tySX^y@Hk)MN31IF&jbLT*=svFph=z61eFr0&NC#=cuL zC3@Oh16Wh{(6^YIAJ)dUw&Z4Z!!8FC-1}+US@NO^K+E~+g=`(Suf9T>_6T!n=tgE3 z!aFlZ0a;NqkJWxYn76PPv?G<%_`^2-yXG>s`(XX8-JNs2*rG*4rR>}15y=Fzn3Cch z*(2IX4p{)JxPV}X{w{d-18SN7zWMca4NloM%%TROWzF*w#HJ2WWwn|j9t3HTd~Re!1%q-a5q2$Ne$PW1{CD{+jv#;w;~7in*3f}Mkq zvtNSbCND^YtC7-;Aj5`U^PT6`bt5c)bVx%dgnMsGeeKjOV=mWR73(EHn7La1oS#=55(G^pl zv~34}>Hag}^@Cat1LTd6mE81#aB@#R6LP68C^B;|W zMA^bvseIMF)GphN;ZyDp-fx|`g@5$iHo>|0Wqdby?AtIEQ()k-K4$j=B6>zJesgUW zdOjF)%)bbTlHEeL2Ez`xgKUh? z2SH^Xxo+>MUX!3sa`7$+id0mORBIhBn6R=lM z%NAITKi-|BQhtB<>S_!U=_~UNzRj@~yi2F)C==IDmTtk9Dl2Kpx@5?(S{dY)#RM9y zUyI@}VkZu}J9VbsDxP4JoAnm}K}PoF0cJ_jv-sA=qqB-P+{ADWQ?ThQZ< zG#!rWdQn02R4ZFFium@OI`fK=_va_3)n27(2c50p`%L_F(-J`R0+3~7_4A0wmTeuL zHrFERDxiDf4(2sqfXNd(r6v;jWo!7Qk2uPOJGY&@e=UeM=ndv@cI>`jo;#+y-!VlO zD4A~0wnB!s<|u7&M`{oAmTc@~Auk~dOYr6s?QMTZI}l|AyjAKRm$X~lihI0qq zx6?|C^wa-=P;~%?L;Md&;q)@|1kkC(Y(h+1hhy?%~^}lGozp*<9+`|8I z5dRCE{09j8|7+;vFGii}h)?wK-y&YC{`P-xI{$*$8Ghmx1JI_wANm{O_7B?huM6&+ z3~v1E0F=A@HV2Cl}k0 z@U#DXgTG$b4GXqhnzjx6kMD5(`|2Axa9HA$c=hoApeX+QD)kl@{=O>VdBxn{umAq} ze>J4dW#|!^~Y5ULTAAa(mskQ%H@c8wA zA+G;M@BHsc@!yl;zbC~6fS>&@3;JIKQ{eCe9OnNMczgBZDmH-Lui3A1Z;HWx!=d8$ z2m4B&?mH{RY~nFK773eJp@99MH*SrUzX!(uXB>8EqV$YbdszpaY1JcP!K?19x9I9P z>0KC=MOyLYmnmbA0HUtal=>DDUYd@Bn)-#^irMoekd(_H+@ic=xj)sr!~Lu?Ye_B` zK!arWu^z%}Z{Nw?c59z!&j`-?c(a6lYv@U>5~r9*S_ZWhhyT01M|4sF2LzfK=yXgE76JT$oHdJ6AdzLyGo)E zAIokM!dcndz4ZxKCty7swf7tiSmJ4Sagp5IoS5Bdj^>p>=+;kCAr;V~1xEJTo-kTr z?i_#0!|mfNNyyTz1J$abml+vit{cG&E2ccFkuy_O^skJHq7SSGD3whaZ=MaDrJs&Q z0=C8u?C7~Z3H@PHl%cJZe6|Z)j>3tgM}LS^kUiuu8MkYmqX_T+zB6TcP{lN=yaOZl z4W6?B*0tJTA%j_LMgVK(iaJ9DYG2KFX~fP-z8=}TfaLMW>ibcYftcv!Z*}E zdA+`>9bxTL=;;}0(jtY#*ebW~XL|0{X%^b|^OBEoEfn605 zMs2zKl3qD_ynQ1=y*7A_>qKGcR(vAf#a7%_aVs49?A#H+R02H)6sIvm6PXw&wvXv9 zHK3Ga5cEzLt$c0xp__tYwRZK9vIqNBd;;B~MR(O9vvj59UbFz3eU?Y%`tfS3@Q&JWg8sIf*Y#sIY#_PxcoG>(=fNjG(i)2(5_@_@x`@+zyRdPh$b7WR@~u zo?pAd^-c)F=RiIwR1q1`Y*@4k7i)b@W$!@!;5$PLc+FY^6xf4C(5_8;HfB6i)s8Q@MpWz=9VCG-G z*-+jggQP&FMJvqG=|LU9*&}TE>U`s?02hW&1V zl+d1~u*cq@SO;l{Me1OHgHy$n6h$*-`apqwo>HR;a9o<~tG?;|oZ&hfZqkj-9+uX> znhD12zOI@5NApWR+|-gMjl(1HXNySSr@QK6b-X4Y~mA8eBM zd+VcH3@^^ZBYJdg3TD_Y78sz)O1}tW1V3ZqLL{*jz;K3nTto#+flEMA&51cgv@|hv zWy>S)SNYXIWx?EW*l$>xmdfvnqJq_7NURh4MCIb) z{f6?dGRSiWw<mWXZtH3T4L{_2n_5lu&z&GXFJEO8PU(0SOLVRuYIJ#Mi)@m8=sPw1#b~}a?YFY@~ zt$NLut^aD5uMMA9w*s0bN@cU{hfa2CNE2}?0@;>B@TEjk>#&6!qgv$X%0crM%f8xo zqQl#|apOz-ZH*ft+kpu*3Zx(6dsX3VC&VUOu{bZ|R9*ch7wy|b_o(4@(PxAms7BN$ z##t4fbk z=~o0IgmnW-e#T4oShm)(Bw<=lu4?JT@$H7)Hj!E|9e{Cm>rTwY?hO)bw}sI+EYwOr zQnZ`~yGY)S(}Ku1BfGAhEXY*aT9?F#8g~N2Xvs(xg|_)J_4;jj8%+=#Q0u$~QyvMA zX=L_CE*v7Tb)m7~(K@!ndreiSUa&f{MO__THiZ9H&N|h~Iw})xy5A1sq;7h@$LhO0z1w2$6EJ`!4Zv&ZqQ{{d&OSLNs&d|f=rk#!5e7v_b3 znX$a|<=x_ALAi9we72OLgNjuLyp`2H512CBw%c#-uA7-7R6M!D75-gA09s*LS$m)7 z31z*qJY{8QOhd`jESynF$3?|aek^Kj;m+oMSwxv}nzfH~m*w(A;(ziFk2IoR>v^#eTzaNs?pO&ln`f#*F@Idgdp{he#-L4jhkv zn>lK^>u)RyJaY($K!z!<=I)9GW&7CzQ8|BX)lH5g9nPe7I0!sbeGZ6JJa>3Q3EuJ` z=tsYrMonE$NGyZ$O6*#y79XQByNm(w24J{(J8!iP-vfemB#upMMrcfFrpUbA$nQ#Z zJGYZz81OtYqMqAoyF@&^#m@e>YHWIwL~CR!?ijF|ktsMnJN_6rL^M=P^}V8NXMf>D z!<(c<`Jt87ebih;;mEF@$W$5iN`y`8!W~e%%ft!jtuWx><9B|lw04M zwQNqaTs#lq_ZtchSZPb01kbA_++QN?;-3B4GBt|C-TDDST&=fhyNbl@2hM$Ig5xn&%qK+?mS8Tsuo zD6Tl#zWiH*n)-+xbxz}2ZRQl%bN{42(h)&P z-U>~%qBya&eC5P&^Kmw7lZBh*ZrzR2J+=uH@ApXR0d3!F*}2GSi7_}!qnQQHkQpS9 zk5@$Rkw5>0&&S>S<5v5nTc8P!J7vk2+@6W#^hlasW$(YkSHL=KCK1E;#n8W8GrriD zvT{+^?W=yCYh~Za%C{gN<5zz;#O}lt+7)^IPR=>pko=q4Danq-R^(*&Qn&IHwRxq$!?TZGLkz2`9hh*3@pccCwO%Ml^sg*_D_q!2G=AHHJp1uJL*QD0B^o8F zK89PKOe$C$aMs>BMbY&G$+p&wi?JoN@`Ew7l;8{zBr>M#MpWS5>lF%1&A{!FPooyq zpG=*;Z-*OxLJuH1U(PFsGjy#Q=AG?D3b=w*Z`!FA(E)5ITWsKl@V#~3e!|>Za!E<` zow{_^a_tuly~S@_n@nkJ;NIzbRp8ftx}Dng@PIl`FKgNcRyhZxLs-lv8qH7Mbh6_K$gm+K^*P8JE$}v?eDg&4t-_h-?>{ga5VaoO zG-?X%PZwpkW@^0UoQv>PImuIdnbSkn>Q9s%S^ABKv*}Wsn?o-4kvvbD!>Aybs@1%%`fJomNp$5_c&zdFuT2Bk7J;(r-C#hy5^a zFBqsaO5I?I7}#dvckCEFUV7r_AYngBM>KL_cyBaX-Y0Z$RNSF@^D`w^djC@5;a8M& z(S?RyKQ>LqafZ3xpjgjB5pPrLb>R{y!5$NL)$`?4;H||cktPC>V$MnU4C`;(Ex``1 ztDGx-#Plg)@(u>#m!rB>t^*3~N%us0rUod{tSpS=zv;>ad$d)#sN57Z$I%mt;jG53 zVoN*W6`o#pEm<$5uG?9%-VS#c|8g@I#ngSm#e*1-;W!B~ojvNASzQQCs`pYXlQ*m`6E*IR6N6RF1Iq6ab=FBzDk@o@}W%g zU}@V))}cp4{>w{Q390R;8Z$>wp4hAUCzQm=9M3DH=wmZ2iHA6?UYxi7S}OmV+KRig zpntn5(`7vAtKX)5dB65x)7`oFw1($lr$66OLAii10mKU?(7;S;m6YUK-{NYeHSu%u zMf4Ic2u=&}AyM!`Z2R{Hq`&RJE>9R2{d{bS+mL5_92f$Z3UbhHHj|a+%ai&q_y&JH zHUS_TaTyaCeA^yHi8Hh(`xtUtw#CswuW0spli1Q-y`J4AHMW?Gi1;dRR&5alp<16n zWqv6`HtQ-Is}sjI{Ao;DC5){!9oslx%xJR*sW;F94<4Li^le{VGmMG$GF)fZQxqH({QMyo z3AHZ~wez}m4Ryj%-YBr>omNvwgYM91K_=FE?@DuoX!$E|w2WUlz9fO|3X zlk>(1iC_f{sRmZ_g;|Gaa+t0CUQ2!l@v>w^I`)Y+lzsbz>jH#RRQG(HMNmR(?n5(g zjCZz{xYe}>dy$T+0G)6rstA=JSRHW%sX!OSd`j*g^4}$~O1WZFidH}^%$L1W=^tC% zYB|m#(~hUBbq<`{{Zvkh(hHSI%K_G=C(7#ToS3TltM8L`60NfpMe;_G*el`3cSc#_ za7-UTDf=E@SQ>sj^3f<#8x72Bgxw?vE5!N*zqu5yP>}rb2yz1bDtkt+H>Fxj;p~?` zl1-cB109qKW+#THr=u2ch}y&H%!{}E94O_3WPSt4T%W>JS~Z-tmQQw|{Zfm3J?dOh zki_%w0@M`joP)= z*;M(padmRo##6<2_e<6Q8?V9dz^%`(SLHVHl9scq<98zB4}Ev}J)MHt4^S2uYZ6yc zZ&ISNPZ;(Gmt4%cZ?e~#_-Fmo#&Cm#AJUpflv2>F%Ek0ne z{j!EW^n#JI=d^xmw}%O{ZUgTFoeZ#lxwSrVxz#+uYeyHeRa&_!(sKTmKS+btH(ZV_ z6J~!^&1gxkanmjLYnyn`oZphYU+oNsyg-$IQutak=vG@%fLbXWI4qR=4)+DR$9CS_ zELZi)*QY2gomrTN%fPkn3#w~BxWBBOV1*Jzo6g;5!#I$m3bbLk^&}f|@VwbKEVXo? z?kw^0HyhTgULnYrx8ca-&tYW{r*H`4`IkF z!Tc1h)Fe$~ns|qk_XYc|nmgTO!yy^Leh)XC?zPN$mH5Fu9rR=Zl4iskb`#MHAM%=< zON>HOcu^F;(G<3c^k*W+t1BvRo$=l`Ox)Njo(D6^6ssr2_!hjNS3x(Oq7Z8fPkjzvYvF1SGt;TZjX$sXr%y;;-dBgn>~ryx@n!dy90y}m4`TdKrR^KZBjuj|$iqPab~ongLagtJN?a@iS<3$QZ z(ShK8MSg|trA{)K{^P_^juiJ)$xXmHXc_1M9y4r}7i5`YSKMbk^IoK}9?ojmdc{~j7>2BzbK@$U z>U^qm;`IAI%Y%Sq4br4M^*eUDvb613ZmVs!ysZ!M_fD}2aR;Xm=O#9T6_vwHS2MeK zgc<94ocZLBR2E*!)Fo&a5beQJ+X#ado-~*`GS9jpc91W$ar4dID6wng5N*ju+=>1$ zGyKswRl?>}qz)o9EUVu(3Z)RFbky!0$gw%eT|WF|DUuo07BXiOI>#1=VnjmHnbX}z zx;_4KxhBha?;{dZD%0evFe_s9cUVun_BM<=W@oSDUoaau9mhw35iU?5EWET z-~J~;M@LhsFKU%`*|sU(;FokU%wg?(Q4GO`Q*Os%In+dD5CZB6SGG4Xd$?I2UNd!x ztNTWUpY4RPMbjraC=%NRSaWUniNV_!4IQ1uhI{3NuZZ>pe1EY<99W)=RP9nWi*T)b zEVP6%GD9XGXCF*Aj~eV9o6&f;8J)!5_sV@PvRK7wPST}bRFe-vmaZ5>yFCdX-IT$4 zaO>xf9(F7d5h6)6GJloN^+UFAwCtVY%x~JD#TA=1&8}Uy8pLq|UidxaMe68}ZK`CD zkMm4ypl1_{1GT6${Gr>lJImXYUHRGveUYLGJg5vCMA zv2c2e#@1ENDXUPm&bIv^>-74n+s)wxFTZE9N=hgRAJ<0zv3~C;*0IB$RkY$#@H}e% zL8#rJzT<#}t@`kz90O+NqvKAZ;qqunV*51M>B_1np?^t_GpqFn4HkQXTU?X)BLncl z!}Wh;$L*b}k&(SJg`#?cUcF2JqfgeUx$?R}htPUNuU?Nx)$Lkv7$b^p$vZe57iM5J z{WEG-`mrb;)Wq_l4fJW@8`>bZBxYhwy0q0E!=zG7F?>#K?5cHcrsoKeZnkH1ZsF4+ zaYyqyZb{Yt9U+t1XK11)U+yMF?36WCKKVQl_L~h=vrkXiDwcHFR8p-e z6hr9CIMdL+YLLJ7F6fk6gjyfa8XTRSF$v0thYRq(&iSC>kUuD z^^}KAl*OSSC-UJ28yF0P!#rg6i-Qm*mzxjQl-Yz2TbztOY%z1)xUqKOT_L{2FG$ei z;dxWEq%6Fp4qT*}_NP=Z68;ugyCio=(i6%|Ujz2g;X>%pCwuekrM#ND?qY4@y7-}b zljXte<5ew?QzsHN^2T$he#K`m_m6Yc8WwBR6^m1EJPXd8Gi!yOxwQDm=hEepNJNIE zvtUERrQ=-kJsS(rrt&a?oSx$C)CSKAuUrRe`(?SUu1boZ0B^O$rNYTkRYS*x5`l_1 zcE9)j$aq_U;9Fc0ue&I}9imk_>N{I>&1Np4b(S7vxBkF3^cx#KQkTGrQ}m=6ORr_^-nLMeay+)c@eB*}?x&pSk&F>vYv&+V<3@%UgTnIwrX z=1hOv>)iD(SS?XahJZkUJX+|^S|!UDM8P|eh1#MJ7FPcDqz6nN-G%R%)IUdjHw|7u zeNG*+Rf>M4=(ASok+ofDRFY=)-RH(9gy81vQnF|R%`kLzS$|HHf$N@8zL~2Pe$vIP z4BD^16!kEVy1iXbP?-PXuvyO2xgZx>gpn?NKj)fly=@U(L@i5sYL({%Lj&^iMc$w6nnov2{_QdQG7fEVEf-6TY z$}>jH7Y&O+=$J*_nH5&>Y_E~8mZzp+u?jgQV3VP?e}=0P`{Un;5G??OtbHz_b;*ZkHCBhOtS!N1_F zUZL<6jaOtDLB?jc+$+K@Y@FjF6&xX_Lq88a}%rp zp+lf0^I`d!!|mQdO(1w#fUT0n8h0kTT%vkg`T8!_Zzg)d9L1e9c`5(%x`TrS`F`6q zc9!sW4L)k+u!b8CRTI_^{my(Joj(BAfy1WosGjOct^zI`*bv}EiED(*WX>`}h&n^2 zw@`H;@dw0*>FMDa=AG7~kT+Q2!kvxTj2Ib#qHF6(d;@=l z&IQfA#)ors&wsVf^^m`DmcChCE>|u3lBAsJbhIED(4Fe-QO(5dH}vGQ*Y-LcCT;KY z3_kK1H~5$3mE)rko^oPK8&9Rrt2eb6B)1hUbmUdp1kE$*zRML({`mv#_n;0Vt!>?K zF}ryU>RAEqvHpH+#RuWpHdjyzVJWkp%UX2cXY)ds?yR>BN;iLLgAE$P`>z%Hx~FNPK=+B@2lgL?-WEjjWt_T z9YdPePew=uT7%6n&oc9bMyG`zs)jtzDqG^prc^suLtYe^E?Eq@%C#>YT3Kdf?_;3! zJ7Efnsm1C8T0F%9;K97)Xf3KHeLMPsF-cef2vPGvBJ49+3QN3<*A)-F4)W3Rr(Nu& z_5JYRwX2=UCEvMAc?dx$?xvf>#`!BOiBruy>b@J!Tg82O<4bOpvgqoRU1>?g zWVukc!JxtIYYV!FIYXOSYsB!}8xu3zhK0ErCiq0l4a2L++ zSAv6^6;AcUWUE^U&Zee!8W%mbZK^Jr=dffhc2l+;TI&=N4pu0-sXaIOD&C{Qx{##7 z%;afsA!ZT;vAhz_HT`m8znTD{(z9kA0$&TQwko}x*Ees%O(wyz7EWvV=a!@();yEn zwi=Hz4budoAk)ts2k+3NZ8pl?v@h_1>T-2<9P~|NPl5>vMk%8W4)J;T0HM(^F_x>ECMzyCbt_W1>YpcoiCUxOBObe>f z60nOD;>gH5BR`m_r`_H_JmJ|EVXvcT;;ep-m8wPUSqEiy?kT+J7@?sO7j@uEENBPW zE`{4K!tLIZkVT=toiX+`S>-7=F}d?@9=h{*dUO36l-K`iHA^rXhr{JM zn^=kad>N(|?TY+J;fpCVR!ZK52$JUa!3W}lBN>01<8~W61%(^lR_>F*MZr6VIH}`1 zZrTUd%YDi2`A_TpOf3)iJQIjC4q}VY2nt?Hqi5>%e(ZmwtbV0AG4o2eFRFYmC4RlC zFS(pDhG=0c+CJx#BO_4uZav9XG(`y(4$}JmUAIGfj0!hoQGA#e{BeIp2&h+Wu~%F) zS$5mmg=Z+iZY<-Y99G_phq=N_gmmxDyd@4N(=%dk z&Dklv?1`eaa`9}CXqy%pQD>C5T59XQ>%jaS$oGrv zWfY^NEvNouN<+bVXE-cQwwVV_MN|b^o0};;LF=hKnbxQ%xaYL986UAgV+Z~0rdZY| z_4K?#A>DY=as5}S2-BH>g+8B*zHbqz1l}g=mN#z4=wK2SboQo938dXBICTHzcWkQe z3~UW3RSBQGl=y@D{In=}V*9s*=7|_ZMt|emY2_t1yUEFgHz_2CxjTF5NL(5dd)#-m z_hCw`iX?yZW?DpZfaapJGvE^|br_59S|fIk0Tq?o=A25!ZbVGClNO_R6wgUf3v4g7JFpq{gigf5otX6L55>DebD zjm{F4sSXyK*Blq%+wJiiWU!ylkD;!?n!6`TYvfcvoOVB`ua*%PWWQA?vM)~vGq0v3 z&hhrzTD*dnhxg<=JTiJE!si4`G>;_ed_sqog+v8d;}g*pUZPX~Qtn&-Wyin3D|;}xiI=Kd5VQ$Z=qqW1;Q zi4FV9%OKu9XYOZk)>I*!7~nl0^#c{tFONS;n1D)6hzNbwSVV?i;1-XZ7RuO zHO$29#O8qANWJbUT{$V%nN%yOK~3i=z6oi{WB0L5frRFIQ;VGQn{{%LRv++RQb?f| zbn9jR{{3;jCMA{hrXHfm(}f+hBm?Z2w2;)8CdW1DPqxl%kwiLdDs5B7OKbK}HO zjPJ7ijyDQ2Bj``hbn!2+`DZ#d?fT6Et({6E=3}<6b{yxj!W{Y8^g8c@dz;#p8ecV? zYha#gG!IM67GdM5LFqw@6Uc6NpUdXDV202p^?&-eja)3OJ`DF&Ih#1KcOq=XRXg55 z0O=GA1!OsGrEllLN)p|B%L_ihXV z>jc@iGDX=O+N2-Fv7aj37|?!z&zRg&C`fU|vyG;MdQ5pL$J_G-WZ@jk6!u=V zDk_WO#b-`|4g=*4EK}qQ79+n^bF&$%oOEbGR&vbNlla!n_!GM$vm#)u-;l4*t#fU) z6*KhI`CyZbntsit;gWeb1A{g;@)-rO8qejBry`=S>?}4vJ1z*=X6}$Rilmm2vOpZ# zdFc1zUvX#~>{kJLY*Zb%y);&D)vZnZuHM%;eUP{n41 z;b|=3?y|XMt-D1@yC_6Jyz*>_@5_doxz1(z0_OLt`0;uvRIcsJj+DjYgz%yu9q!N< zRzb~Do(2fyXrS@IAnlAZB z{OTRo6l#!v)pki(LRnTbc;YJ{+qQ3)z19`N!rYQ!4;Wj^<%`8L>B8*#%}%uOo5w@8 zP){$qm`4yv79<|%w!e3GfaMcf2m!jyub9Eedtaz@tXu^i^&GA+wzw6 zsHcTMM9Y5mnJsvgj7%aYSZ4dZ5N6f0(f%P}ymZ-O!nMCnbF@7^ zh66v;d$<0E4}sqpS`TD4hTU~(YJstyF@lB*nTJSVGuhdSMX#N+xRBM#=SKw0qVx_1l$|V`jr9oM4OANXtYMXv-v!dd4DJ4G1?soyCYd1bC`1C+1eXty03%;Geod@zDQ`_O_rn++2a zhiZr=Dv34KYg|*|+9s;2OIhn@eV{f8VTzNq%n3-Kn#6b~QYmo5>+$*1iCsRc=I(;1 z)gk$Be*#K8@O)K325#{)18;_n>N`^Q8XVj=xcqi^OK^e3 zd+FBsWakxsq}^G$Z`vstb47i&m2f{c87)aw!2zo!FCoulv9Ie%f}$yHu`S0X>yfwp zT5QvH8e~o_#KY7AFA+ma{z}3d#ur}S)6Oj^K&+WA3*fT|AM{kToI#jd#2X`Eg$16< z=67#U<*v;40bAte3>3h3n?Z$jUeOI>Bg_OcO<%mTAPpf3vOJb*iv&)dIc44&XqISh z-t3ZE&#jW-&$YVPmEANoc`)ozv($jGGX*A$oB6bQdo!x6u4V2WiE?VL{|!Z&puWth z{k*FzClM?a*#y+tomFpo{Hu#kZuGa^W;3IZV$mKgQ%soSz6jpWptO!MWGKV*cXbP! z2wjS>)ObB8xhCl>3(Ga9xvbtBP@XXd^2drHq`fLDM|(V@iM_Y0%}B+mS@E5KLPEAo zSxBgLn6~411dXvcn87zncX%mpIoL&umoG+~5Hj@E)`<~9iZp`Z7s6mU_5J3sxfS>Y zvAQ*x>v>d3%xg8HscC0{w6trA@V=_OybP%nK?T zgYqjI0kNsdp6T4^&m1!-fy`Af?Cnu*P};wY-#sr3U(4qZJQXEI?<4k7;J z5M{QeSabdbyRxWECkvm3WVn!6?=C6)Emp|m^P>yeOow%Vq$1BT+W`!eL9?Bamz(N? zCQ=xwO9?;TR@#PZ*scT*#sX1TJcF0MO*osA2na9Mpis0Ucm6;2-ZQMpZEM>GS;A65 z))E^aO_W|VH0dZyktRq-nhF600qHe>B4DGJNbenjCiDOiR7xVCw9unK=mZFm03peH z$FkqOzvnrQ_wV;(=T8WxaXaRmV~lxS=iFQy_*t;v!wZSUVp{+37Fph;I2!9a)i^Pd zv1G$$Xo8$Q+e~gi#m_pX{H4QjJ^8vI5i5-SixOg-DQ6X_aC_T}H%Fas2kY8IDev{q zoY0hcb#KAx`P6FpK+0Du%DYkA(c%$Jz104sE8tV-bw{Xx!bFO+HD;0m>}8H_AYBAW1KA{)s zadMLS>a{>w==#lf9aqmO#-$tkEaa<|RUj<)E*8zyk@49^_t^{HdDW!Er;Bht#N4th zF|26$3{CD6F2y%*&VCx492+PNd}u&Y!Hxr6Ux)ZH*(%4`up4}X&a9`z8ZMUnlj@*2 zDPSGjY-up;0&P0&MfpcTMYR>5WKJJR$ird^MXqGO5de)`MjwXx09#?7A$)#*DsNgG#=d0f9_Q7nTHa4#x0oi3 zzC9NiAd;lmvt!h4BD|cX&sem}avZ_dpMeU8EF7eDd2YqPp}#`Pkll>TS9^H6w2Wen z-Bp=5t}NfQh^o2yt3h;eimG)ZAXQ)_Mm_H+KJ5D^&$};=)G1-d*-DGTgoG@4)90BB zp`O;i5_*D7lIBid^ck1s`tp`lnFjMrwywGCn7+7amjPHJmgXh@uKKWD_*AvPl}@j5Rvd_ zlW{Ii61{>l4k9aBNn5wlHSO>)H_eN>=&MmM#eQ~1S}={?$?Ms_&07Y9WHu0z4M#Ao zDipme-1TiZRNcH8#1o*YNU{0*JVi%*iyK*W?dM+3i^3zsF_RhglO%~S@iRw_ZtCE1 z_3mju^b6gF;`S8Ty)dYo;^s$GJ8<}k&*7!@N#U;ku$(;pKvBI-n!kXb&8eCgHZk959J^f(X zE8T=IC1cyZxLnvPF8vB;F#48$N$WsLHg+mVe03`6v54VThLVkn`F@{`ljl8+sXtD6 z5lUgfC;bdC-0Y`HrM(8t{o~4rnCF!9l}E`HOXCMu{M5WGPKl*Vsq{8kiXmrq2EB`X zs8OVi6&Wijr7Bws?PF-e3MYDX_?#jc+9A^AIFHrek)cX!q)F`z)qGo z@h+|9BMoeqf1s%6g}U<(K+AV!@+tyK1wSiAbMiYcahLVGkLr|!eJLi+Tk%7E`D>Y= z;O~ys0UWs`$|++1Bs^t-(!SMhKq5_dT-bm!d;F?wY`Y=pR?ci`dPagQpIv zK8Kz{ExeN{;sABjP%leT#^hR`WtFQWY_tsiEU%3Qyp0RWd*wdfBFRG=ywxAT!%|{Q z1RB1N4c-pVteJeJ&o!_fsu9EPt<>8Dn+NoFx+F&g>eR)8@Dzz$UG(qGnzI=~xzZO2 zTHoO_L>&;&3sX3IaCNB{bx}W&B|5t~)a1Cox${~80e?%`YFD7?^qwd7l%+;;Kxdoi z)Edq>oN1+y*6@fA^GUJ4&iyZnhN?cdQFr@sveYu)00o^TRcVKg{*QKL)_sTJ)bOnE z6-0&6^{M5*IC~P8D%&B+=x;pzuP)Z5#-DUnc?}P~-j{R5m}X#dpk~rKBB&ep(AsC7 zF=sCPtqk(B&WD`_`|UX@XNTMJ^JoY+w9v?r$ zw*EgF)hk>Eb8XU5Q4tO&Us;0pyS0mhb0&5QvQT*HJrFNEefY1-D?yFVa64uz86_kk zdkbt+E(A|HFp#PGgI+m~t3d47^D?XP(a zqP85w{Sk3Ck<+Oic}71A4Sf3>#2=lG@ff8EpMfQE{>c(?m}tZR)i#;e#UUZb)%ptN z9zRqLt4IT10j7$}S^L8ouH57D@_aRX64q(Q3S04Eqe{SBr#gOOWA$Mp%@zxcWzh~y&4LUEE~CF+!TOL&S} zt~gra=42Jy*E#`kZ(@I%Nka#CNS}-Bgx@->ObNE%w~Ng2vBRZ8OEgRb#B76~@8du! zZxIJg^N*CrnkmmumdJJwz#XnvX!^q_Zx37v$8vE2v%A-vqXS?L9||44FE5Tgmg@C( z-*M$^L)#GYI@X6Pz1{cAe9db<>;+V?48QVTnDiQ(p)~-FcT$}9Mdn&Y%1TyB=Lvlq z+(zrKF}sMf+#Gnb>bKxO@%;1QZN#z#({kYXym68Q(Wl-tUaj%hmCM)!7q)gJ@m{iOKZ$Ncu^dlzGJ83{zY_yyr`nu;$bC z{_GU=#m;{TWGCCa+S32k2kzJJ6|^-|z3&JM6FOs0&)=>M*NzsYpST@IGJ^@bjm+P0 zvcdDu@hAQ0IvcKUl!U_D>#lU)+3E@_+EeHTtPML>OQ9j6YhKU6eB3saJYw#0hc zRz8)xElmK;{c5qA*Vg-Mu88e()K>cYJ>Xi_%Rf*T<)ey%g`BZ>&Vi=$>M3;T+_pd+m>dd6aGGT2 zcl+_b6S$?EF&BJLHr+pCn6CP+hQJoGJ|XqBCHolbvk#0Zy#&oxxXD=ux z3zsc;T`m2me5C(t?KvY;hJ3`$`0BQ{zYEi3yEjVMsY&6~6ZZsh@rm3&;F;0S7auM4p#+&ry!;&B-U;vf~T|+V|$g z<6U(Ltv9f^8z~_>N+(kBM|vOr&^$dDr&=w0UO&3RXi1F&k|(8=tG;VG=E-via8;Pl zdaOp9y=>)#^Af+B&@2}h==NCWF%Yrity-N6P+M#bde6kZwXQ#Z1#yCwFQ^S1lTcCR z$v4pIsTCd9D!3PFZ-16QrEO}ZtIrQ2df&O`iUdZSx6Ejyrn;n&SpInqg>Me%tG`Z~ zqo0LTHG^X@HeHTMxwL;mk>@Y2aH@A5_YZHZHep~N4U1`@Ri3uv_|0bJ>Ke0 zx??3lsC$BDv1uWv5OEhYoS&+_kwAV-C%u$H#&XrB)=z2=kPqnMJK7EcA-d6|wG=+8 zY)?wShJA8*R`|$CXqd3kNHy#1whjfq7oMK5!zncC~dM)nxW@F5xrli z?A1Cv@nipR`(E(SpS*_Y%YSzOD)P=AyHBuJfc4fu8{@kADyHFbNt97A`Go=0!qta> zsRSV&8(O^VlbVBqJwOf;rVEF+HiM#YoS9a|YH%qpb%qgdnRR4Z^34@7?S`t*=E_=WPc!<^8TDm2gKyppdhfAGBjtu36sJGsr0-gb)g zWmKJO)Sf%r$Ye#~oRK975Xd4O@JeU9KT%Dl<8r$nC7pvltGyasAx&hLlHmxc4Ved9KrPl^T?%7FTZohoWa&9Xsz-hVeX^Xs? z7!|OKto3P6O!|*e19P`I`BR}sxj^b6y7apVh+OgntxQefAU>%-9zApsRrkbod(G|o>C!N%)`t(~Hz4 zpnId_Ks2Hc&@r$J+w)0&grnMVqv@3`%9OF_{#O_DpF{VrV=VClleMqo*?Tlf-6!_n zvY(?w8T30$J%0T_0$V|OZSbm=4*x4URfN#CbU5YJ0_kBON zzzIszJa3fZ5NEUQ5L!8@nUUgi#`El6UyV(1C}JU}%2q?PMw#5)Kc%w4%8N^3kR!_-tHg+eXgkzHkXlzWWSA{-0{= zk(>1f$-R5EIWZvb^KIq2vJK`t2bo#a7h58DktLp8%XH+DN9l-D(08)QS!JQ97Y&d! zy-M-v-NJKg<8w$U-2-sDAv9G#i&-Hbe5#-w7<}!&248j0&XNndGWSukwrMy=xsOB7 z!J-lt(Fh3H!aUV=MoPE4Ugfqjy~CiDcYy}VxOKDSBXJ7Q`%x2bEtX|bom(oG%yAnU zWHrB@)>Qap&FIh=#vc3^w(uon9O>-{6J+C8wYG=Z`|v#$8;-19s1^@@fteEC3>$!I zzc5KJ_1rRWH6Y2S1|)pk5&TDZ|Mq1{qdy$`ZNKsk;RR+=;nmiM!`8;-4$<-=Ar-!0 zGi+Fv-O{3G`OqnKYT@qQkd;LkFhI2isQ;uPbLV?RnFM+Da*Yg!ORsrb;%&c+CJFE* zzbJ12d)yN*@GOapb<7wX4|?lW^XME`Z&@AU@YVx;o~WwvYkWFtW1l5<&TR~)=(aT& zC&Wl{%8!pbVcz+ixU&9QZmNRgrx#rDrtTTb&I9np4{TPaqk9KaG>2p{y* zoM0=RYbM7pSM^kH$)aV*yu5rYp!&Q^m?YpR>4CJz^KydM(p0Xw9XlLUlp^Y)`(4;1 zFvM$?*YQ)0lh?99QR&v@p4>gD8?^QAIv@qMvR0Y9d$lhFDssdar&x>W`^sr6$7`3^ z!;Bqh>q}}h6$r98CWc$B@WBwrv>igpB3Hp9#&HDI4s z72q_9v=BHb;1&Y(YKx&RzehZSS9tKxZ%YojBp-Fk&T@M@erCbc)7m{nY(*o9AX+gA zQMj$a%ry3vraY(yk$5jcWO{S8KH`yJrIuoXd7huVLy~1p_x4x2;pmcDzioY*lFQt| zYSrhyKJ;F?c+l+5Wp4E_E8rx=ig4&en?sKH!L4bB=IU*xk{pD5{{)B>it=q@JFkk_ z+U7uS91H4M$X*NL4!+;NzfH6uqm92yH=Vq^tKGAvsT-z)1axW_v9q}?oEWUBg>BOX zPYeEAmi44A@OGnb`RD)oBgob%Nu!<8)r0U-j z&pnX2MMb~-A%1JVcv(@`lCFs!E$3F&q-cVCmZ8LfB>XPtM?X7@Km0T7%cedkAZ|q{14i zX48DY>RJ5it|NqZ4R-SZq3_iHqV2ezO8>dA1|&I7g*2%rGY@5`af- zFvvv&eXkXF>~5mY1uQ9VdmeYx%J7CZ?_7b&Jcm1w6_}7JA{&5fCb?Vv-v4dRS)0`mcW_aP%yELCqpzHDJ+;YZMzR0W!ldDV^>o{bk;t2!`?rr! z8q*NixBHb=giUlyiQ=m*4RNV5JEVADlM)M%7}VtkKcv`v^}DW57jxF=O-a>%S%uYo zms{pd9yHkdgULx7FLwffLK_I#Fk(oMw_DNpBYpM4&IN0#7KPv<*r~fIwnu}PYlC$~j(gyC*Z0E&qsC-i z!vlOQI^#HcA}Hf66C)l=eCN`_Gn!BCB^)#UK2*8dD5*3bE*j++IbZ{M(b@BjnOkkY z-*e z17={=6Wp>#1T4jvDYQxO`poQKdae-`&5Hy18E`G$El0rF%@4xWG+;%TyK+x zk32NMd^|W$%S}@PB7hAeodYZ>6?lH@`7m3=6;0cOsFc!-G@n?~4-4QQHwSSqt0b2w zI-A6Y6;-}qyTP#Yn5oJp;t{6qX!HUXK!Sa9?ce5^1Sh7O-)O6UP9;Sx>859-r|#+N zd&{jwoDh6Mkqe1{IB~v>Tva#(v3>Lp18_KS?-H}IHb0YG_vr)EHDDS_V0+IFKkUR}eHi|v>QFU+R@OS?`;1AooBuA` z7|XBMFfj@8v2rmf%rReze8fDaW$}bD5v~aKFeNbY3B5lKXB!0&cfVf4#B?*J{SPgU zAg0fP{}$;tK};94bp8asF5}~WzvjPR`M+2Bzk%`p9DcuG&(N~ zA4;yR)%?dtFdi6+k|G|jm-#6EZ?}5qvEMIf#C@dsO;To6c>lMX4dT)7Cr*0q`u+ai zzkkOBddd7hAm0hM+5i04#s2loh}VEj_+PL3^@Gz%mX6grl%LCy$qr(=u>oe?Z|*mPNczXem?;m9KqJpZ2rm9cO{#QpU@{+o+F+&z>R zt;Xb>AkD}?7^}nsz6;z;C-Q{<__s+MnD~MBU%K>$sZ5A7g8M%|IpUASKmUCa2Z9Ws zZmY11Fu8WK++`g*#8^rgtHj9FBxXTom23YaToaD}_bdOL`2TyA|1Be6V)}1j{LZ`n z8yNq84~*|^nB`>${Ay(~D7;~jD*NC9LHiNe&f>}G8~^LH_x`m)lQN}(ontkbP~Ef~ zS-;`VXsEg`@t#d`6h0i}zRYKBbtlby9ma(O?62V$5QAJM-2#bE+B`9YwaoKzHYvlO zutoHVS?{I;TR-nJcc|P$ND;ZcNa8MGEop12D;~VR z^@Xo-v8jIdWy zbbm~0yCd?cW{&u|A3v77<*h_)9%+~)O%ZqBa~5CXHPg6y5`*$MR>>vdf$8XRBo_8? zf|b2mAF8Jk-D_viE+EQ0N-ykz7RfIl1pyM&xnZ9ycMR(|iS_%0ryKPdW+ez4t%_r< zOWQ(~Hfd&yZP9*`aO2U2Fb9U$7TNj^zN`UDg(DstoT?}0J=%%3Rii||=7;D7>yxLI zamSYkd?}8o-PRVAuZ`l!8$qBD?cnAX*n7fmw$J*zyPK8lR=FHvQj8>w{IhVwb1bOJ zKD7y(lRBL^b`qQSeoo=+$o80tQ|+3onfg(9vlLbaBIs$$2KOJZaU)sVjP&Yuf$Q zs`M2c1uQRcgFp{w4tIJ$<)O_zwW%TK|6wr?UA(u*YtDvOp-^$f z%&D6Z34>wqXW3_e9w?NM1<0P4Xsv5 zfKZ;kT@NLH-3;*d{+>3YVPIrRmgb^!nu{|82TK zpL?L#8Wl+#p_Q@IXRvq`JgQYgQDX1AXi=$3#2p-9_eYC@vNZ)m0Mv5YGJgtdmgj`x zl5C5llCPSXyHlTqX6n)`E=^rW#Oa>(PI1(Tg*c|ONf_(gHD^qAHp=$)%!V&4^1dW5 z#@VVmBt+U}f>&}}zz3@_-a!v_0irm1a-9~>uF}=Bmh$8)oiwy2@9PkWY2_^5cx&3_ zLwx@Z;f*9{0x?$%ciX)@Y>s}n2UssZ4JNHajK}K zR#V$fruQ~S6x7~AGg)r0tLVdC)v~Hk=|T-!@0}Px1@{g+U>iur^o*#}#ZWc}dYf|U zFA2>ne`oOaf)^}Wr1jUcQiPGJ`q;M$xlV7hjz(g?2=-=5o3l>9qKAbwQ`>#C;r&Yv z?o+}sH#)(=1g@t1ftrdxd-M9>l7Pb4X2p8+OSD;i@4yxnhrX}v%rjyZX81AK!VjOn zn{L1#`o1(Qu%09ep3$4TXs zHw*_o%BCE3gio=XrXU4!Q>eu_DZpOHB>ibG;n0`Be{~QTB}SeQL*F67pi1?lKU*@# zC%lv-?i~o=EoDQy6uO%Xz3q(9i=XeeaK~BDMG%g-WWsV7f6DZ14QB6?4UO}DHd{TS z2IIA^t$@2aC<(u!VXVod^uxij5#i!zLA1dNoZti4MInvO+v6t~9*Wc_YsJJXZyvn$ z^YXGKsbYsU#F8x|X^`85EL9mB0QapVq(7~>g;!Ifww_z_;vZc)`xjw#-Cg-B`DQoM zdckCRFD8<(1-T@P2sofA=HHmF+AX#fWABcmS>mr%#AH7?D#lvT%5EHdu3 zt#1;goM04(alo~5*H$L__#vxQHU?K}9 zpFT=_yoB=ywg{B$=-0_!?kU-^j-96BALdO`h8fy2IZ<~$qnqD5pc=V#fIejg)zdzJ zv7f+y`*@MwZ`!q7>b<|Hq$hi|j!d)F82xg5IH_98kCRzI z99hHZEk9#9ag?5jdH#(TdA^T zoPs=dcx+`q=Nlk+_t||tNu+IQm8>K8NE%lvJ(>woFv{IFTSX8qK)2HSp!170KkGP= zQsG&-HL5~B_0bo}{hi_0tFh$-%A>sEE3v8(ox=aomEyR~w_!V-!YYJI`q_EhChK1lB$;&)AR)}oEjIJ)EU9O9`;;Yd9? zoUv5*W42LhYr(faj&(reWo4*0a-=v8{tOWU0|p&UVL8esiNt(6dYY2v(}~AEg>;119EEO zXQ=xg)9Ysw<&KLMwH{>X&mvsUb1LB{-+A;fB%`bCub6qfaIp>Kc5Ay*iv5FT0K@yK z@^1)qn+Iy%i_dSBM&<6;tHf9PI56{k^@zU1kdwjA*f1(!>Eg?LLW21KV39EFfS!1P zN|Bd^V;^OK6E&ciW9yjJJ$jl?_>tXfL!a+lkyS}le_#A$?S`py%@Zsq)LDw`tR`xh z0SZaXXml7!XudzY?|zO;`r=nDb3pgw*&-Q5bBD2sWfm{&PIwEi9(hh?w(@8=r%4HF zi4pmsQpZsKRKo!nI%O**{Xj~)ZWGVC7IFA90b_RO!~=3^4JOk_LthtJou2! z3a2c)#};xy6S+#2UA6#B)Zv-qEMIFEcrSYGiGEIZ1n_%PTUy(9cTZc2E6u+Aq48rz z)SFMH@-7&4^OGZ8aLkf%J6A=DQAe^9abs(2pk|D<_r%@=3y9=3r{+Veb%@mYGVpCY z-YtK%>YQ9#G+roroc+m9c__W<)|zKP_r_1txd#VjYN2yxyZYe`05pcL@6l}E z&c)C%h1V~LZlKuy3Yyx<8iVd9q?ozx?cqS2T%`PB8?Wa&3*t^b*?#eNNSxu|Ni(m; z=cA-iHNQe4jAzJ$RT7Pk%I(Q9q=0v0a8kLNEFHpCJ-uVeAhl6ZWCK(coDUc_+b9zQ z*xw2Y0Vn@^x@jLe__V$78B$pkBjr7YGJ!6=B-3jB?I5AW&R;XkI64j`2&{3Rt*7!zAe&Lxu2GLN6Zm6A3s;C5g|RcB z!7Y&m%{#0#>1%7GCP5w)kJR8kh{2&R;zCs@fx`>qSS1(hCvEMwl@)empM-OT>uYYk zu<_axPFLBiXn{;Mz28`|#;N?;b1~CO-@PsFMot5%ep(^+Nd|FeQf)e#zp7*rYfEag z)}GC=Ii!+PS6*V4{jA?;i0|dEr>(>emaIax_Z)iCqgGy$M}jhauJ*l-?@oLI8ECDu ztM?Dr-)GBB{`w-o>FY){V?ni5p{TN}l=*d{UKyY5#VntjCs z{Jl3(WyQmztK3x!FIJMhe|J+|57SxkfBt!6DI(ciCVlE!kbz=R^}lOhr>w z;@Xx=*`#A?lSE{$_V_r5de*E$O5Y0BB!*)cqZK`l`?C5_DnJ@+U$T;wbZNlj9n)&18|Q zS}yNrv6K9v&PMihLqcHlR%i1^7IQuV_=_avPn(WWbz~wU>T}YW{J<5yo^@~MTgUgL z>j+mfw^X-hLH?Kfh)ube?JxeH!m;1nUP%r^{N27pJZA9i!sPZMHU`+oLM~!S&*xk| z2vk9fG;n{GqcuJHBqZdjJ(F2x!*xkojfc(9pKE7^b(I^JCQPiJFF$N_CQG^lKJiJ* zY0W#hT!hM#Ev4IXM2vg7z?99j1CbU-aN9V_^Ra-^ID&??cNrAi4l-^K!IrjJh6PCm z3z}6|lXy2a>ZIbrOKmml86FZL$o;>6xPzhV>B|y={LL${+`P#}X`~zMDd>yNw+GmiRVWE2joi_rPv`@mekxiAuC4EJ6s1N#{4pjTEHswz_YJ=Z_GM9n<|i=z8??- zSp_R=3|aC{uBs(0E<+c>H`%Nk(^p078MUHnB9sP0zaKY*L;7(&8~TU28K&VE4w%u! zc&D3h9( z%%p@Ke8S2uNv?}LgzNvgTYi$fmi@vpbNdWnrtrhAAM{qeCiyp_#~w1-rwuM-tIRfJ zLwyE4(JPL!==`ZvHfVF$BI-wpu|#tL-~Wz@WpP)`a?7msqZ&^eAYWgNgq!{#{b`C& zCG?%@FO^R6tivX4uUwSf(X0*2byR=<_zLIc>7>y0$bqzpi!q&j==)3VpUti9)g&Eb z{B>m-OpnuM=s}?Q+YRh7m2FM+wq!D130k1BX#P-TT?N*#Q!p)P1UQuY?ff3kD1m)7 z3I+NM?0S0Z5!l)Q@aJhnRCHm zi(57~{<87A_pp{= zPAa6AV$C(}m^%5usl6o)ST)>j`*QL_1O6GS)Z%5q=*8hHt}Hi0olRTFXShRrsY)63 z^{pTk0rSGFGx31`qqU!QehG#Qd+I&=#mfK50DGG0*XM2zUe9CFUf!s)D_KdLt+zcF z4kz6&(G$?sHD*7HO?q-GC*s^ZbGLKMoAElL$Xe5EgPdWjghFiwr7FctpfVyEN9?)qmS!xJ}I`Y>mH zC{`najcIRt8DxzE2W54nAQYN5N9?G|q7BE}$>!DSdSH*F>u<1TL36f971H9TTON7s zdt<{0c(6sq!VJZ|H_%@OWWkW*T1B+@4y%}94GV~UaT&%v47 z*}H|dx8!;6T9M=(3e#F1Xq4Vem6cx`@Y{~3VT{jsq9sLRIdoV;@Cgu5BsXd zh0i`8($LraR_^UbYx9K{Ldt3V`WjA@&2NMqTK4jQ1#@keo*R}LH08<+LzEl8Yb)5$p- zY)_PBw{(HPkf@(JGr30}R`g!3kWVG{zm#VTOb)dErjK$+Xv5qgmpg63`lkIip+2jV z_C2{M*v7ZRyhZ$F%afApQq(o#m+lav-;_X*%k(BC^Nk+LJcgcjhyJ)LXwlcIB!$)0 z(%I1@y$J^Z?+a!%piXzSb{Xa|KmM%Fz&~C0L;X@vCVedy_~p5~OR5FLZ@Z^Wf$`Ut z;?tF57QR{a!_&Rr+t;+GuD!1}f5TNax-t|eWzUn`I^6sYQ2TD?gaN5;{PMuJX%`=W z7FxLa=$u@7=bX^-e!(8t0(kz$7Z+bVSe))M^h0_Qw0ZmCr8jO`dNvFi=-;32Sd}1w zRQhwQw!_$AeGRKyhQF3s37%p9^ctPiQ|GYp@3eDrnooQUusr#u{YGjwv~o)C3T5R6 zE2ieiSiftATH|>8a$0h=I*WJJCGmyRuuoRE;a`6=Vcra1(p`_5rrfQyReYd@yPn+X zG;9%6R);5B;w%>4`4KSHU)M@<6`K5L*T?G0i5)99IM$7D}Tl)eBa_l7`?pYN>N`^V~K{Xlj2bo~_oj`~4G;~eByR`GHFz)miv zPwzcDDYM(lG;eo9q4Pto;GMpSt~G@BDsyQzdthT(;Uq^EC75knNErlC*k1o^{lleX z$7ci9f9-!mbZbn`xZe~j%Cc}$+iOod{R**rpM^9DK>vqCFSnV6{NZdwS19R!Me}(H zpBC^!@2P^?&K^8y3WVq#SC&0mlJnxu6cyUK6GP4nrd=&bvG6Kqzq4r_3_8w|%V*xU zH)u;JN83h?_2+M|MTgBJEDQ1bbwl@hcTApqC1I696v{Dn`srAG$Stq4o=Qm%ok%k` zr)6zYD@}EZUEE3-oe&)|gBL$9X$#R&c);}72OL65*le}qAVvs6@ zBU5>bdMzR~-TF>M+>;7IIzcj%eE3rhE;%vA7G>D5mX_F52IVZUh587KI_+=0#WlLg z+EoFB`!y8_#O0ra`{^ox{(Xml_^=wW5dtm6r2VrjPUO^pr13Qg zasqX1Jq&BmUDCVL7UGh#FWunHr^94j(aI9pnYgOQmQLPzin|U=l=&TT?y9x}xHTyb za&oFK=wWMgaK0Rmt2!(ej_~^I#FG|tMS@ExrB8b9)55^OVjo5$6O8Rf=HOb?xbC|1 zCN_0*CMh&2?wPHDVcCTsfjv*P+L5W)Yd*7IO#JU99Z!4JzN;V))bWxgh2t_GcDlDZ zY!?H@-aM5XErV~BRUITzqSZp?Yc}bv0+D#^>s1$p>-;T_t%{E_iz+o`QB51yw>8`+ z10vTTkAc;z<&4UD4z!ZNUTi|v_=H$_pMt>v zJT5!iZ$%&O-_!m=-?i(Z&@E-_?`>UZ&Py-7Lr9|dVnbp6HglD0VF+mz&X8YF@eNds z+d2a(F7qk!g5g5z)huv3<~|hp!iUcAs9G(}nf(V#oWCLa>&HM6&+Y!%k zsbU}vSpup_CS{onOaivV#??;=B@PzB58%QFNF;@vH*i{^4BqYs98^Mii7t(H9hh6C!aK6)wN8(CyqVJ1Lsw24Q{?>_w--ulG~cv|3?@`Z`-p@-;>zrbe#(m zDsNHuy*A%=T-6_3e6#M1^coQO%>=|(=I`XWk!{YoC-M-t0EfcxYY_1Be-?NnVZ`|E zbXn|c%Y4b(wPkwN3aPH)(|ZT>oc@o7gqVSsI3;yIgC$(i-$5K6SM?)B{|d6@1-k%X z2(vh>ZHuI>CtxR<1))}(8;XaYW)FKP>SFWh8{A^%nl?4Ay!Q0h@@r0Zf1d|dQ#}vg z6uURiBJuYxLpWl;W{tfZD67Xfse9A;@sGT^+MXT3+$}`+RUZr#Zav*yGIFF%2#R28 zlz~NI0N5p3*?X#XC;PRW6J{+*dsg6C)#nE*ZJDm?AK*M9J*{7Y1SAYnU$MTU$n2Y; z-<3ZQ=Nzs-2wR(wcnMkkOOFB{_GnJAte&o=7lqnFSUVy%=8}%P`lUEaPv1WFpxbwI zrEpi$^h<*-qeu93UtUuowc%+8Ph_*wYqPKefAN0bBnBx#h+dSB<r+)VpzR4g;4Op&d16h-y-d)HmlPYw`ZV`kZG>C&!wDCeB?(DCtt@mM`YbNjfr035$|$|ael1B<0%w2w4mDX48+v zy_D1^(ze||!J#)<_xFox!i}T1YPxr~De&5YZE2)`ja!S!Rtml{m4&WoXea z5c!RS)=LhUncVV}y^NnN;qV^OcefH&4+zC<&IXVT;2mp7{qo5Pa*MvVr7o1V0j zl;lHr&~_o|ZdXccYwLKI819$>66P1CoEalC;zjefROY)*)|*wqFa_=WLw`w<2zpS7?#*o^*mcubMAA2>?TlpmOaKl{|FMQJR0 z8CDPkm0vTru!n*B`)bsVsu-BUg`6Lxb{ zh??IYaL1@PD?4$enI#NXq}E^uz9ie4FwHoZ*Rbxz}^F16g^^{rgaqYcd9E zq9J;6Cl;Jm2*M`2AG(erj!Ry$3IkXve5A!bfL!h=^NY@ZXNtgg#mafFZN+2#1A^zq zLhH@P0&2cc{oqZCjEXrrFQ`Z=z7YuP=?0E7^wIW{WH557WwZX=deBV(k@HFJ$*Er% z{yBIBIGuNFt$9g<^Fjq@7&?3lAUoTBe2=|UeD$5(ch0-5k?z{z2QV?3dC772ji*$&e$;g(~j;=Y{hggwW{20(ceAek3 z;*q&WS{Ac+)ZQuxyrt(#k;wM^K`&PttaOVoDQMU2Nof6RxcKW}Xu9IY*zHusaB(z{ zZ!3NCDa&8Gp~lgZleVH{9YZZDgYv#{4Ht$(niwo~>DP@c>Edz3WoVtxZprID%5Vzt!bNu*Fn#x86z**1w{f!v$o?a2&pg+YzlYir z+a|U^Ls(O4wo1@m)5KGcp8gxX1j39uaJtMZeVe@)ywuH~Thi$8a8zAls<$h@1Nu=I zMRzFc6H+WOs${x3teaDjHuj3mP(S4mj!>COy@X;Hg!7=ZF zuR!}2IY*{8em2cP=L-9|qx5p+#8aDB(gc-sF)}HA?cPUU+iE+?L+V2nD%L=j@snJ~ zQ|c#WxX(dMon`G)@dHxL029kTX>TbPb2q@);zCMb8cp&RZN-T@pOA4&IH6HDHmWzCis0Z(R!%Sg-d?|pE8Gp-(MI{d(Gt>LSRe$#bqW?mrPnn}N03WJYSREzXpYQQ&h zVrtGqn{@B)BpIArO`PtC8pp^rv(0?^c5bk_c1O(uVv<72S~lbFfcC$m>ZUiI2>;Wd z_1Tz@>948$ej^q3dbI*_Z>$jq3>B(<9O;n^Bs~bgqz~Vn5e{ju@U$%52USxLAEd#w zffQsMNQtIA^vz#bWNU2Dk1DeAHeP;bAU=_#Bo(59whKsKxgyHpTg%IHrOWfU$UgYq zq^2`#>*7#%^Zn)h55$MdZ|<3)r(zOYQrNQ6NR`BpRF~*^2AyC^tDr!L#e9nF3o+gQ z`~^MX@yEf4UC>uJ#8{-JBI}-mggVX|PQt|xa~d%a}YvcT&H z@p>ppf17oW?uE|Iueg3tueSTse(H^SZ$7P(lW@%#)z-t-TQ)LP@vKSL%s=0N zJ?&U2orkB;JI8wPO+Cg;ok)7&-<{v{={@8ObYU*l9vjgTR|@tP|E5}hjWsrH>VF{m z?PirFY#5uOH#Y_Xqk!|)?x$`wbeZv^EzW?6U*g6gXoybd8I(W$>fmI6^jhmRi%9O4 zGl^uOH)-Bq1^sc?5okZ9SO4G>OQcIZdBsTYw9D2o&d4SaCFdL{EbeN$)iwq4ijj%% z4=wuwPF~to?4#>``kh0XSKQquq(ZthOak*V(*oYQn~DBtJ==OGvUIuI#h>RR4|Ydv z5N(Q%YEH6>_ZHb_>_A>^$AuTz&TsacC&s~#_r{?@083}%Hu*BYt#g*CqQ%FsZ!0-d z`d%gP>Xf<1EXr9p(cgw}E#cp581j{a>{aFMa4_M<04MgS_JW zo8R~T_Na+E3lAhWOJxNa-iX`Q4FFpgGn`XZf}VY0r>Tdm2Ug9+92{A;3PNvrodkow z7i|YLYQ+2}f4%+r5B@sG0dvPy($k@7*ex>n4%sC}KjQ%K?G1sapZDjp*7F_#j#PuK zC|Sj{4vgqKurl@um&5|5z_8gY`I}Q7i{Hy|q*ZQXHnVGMUq@UcQ4`Eo4U26FD)~f0B28VE@I;32DaSrSp#& zhuoyu+UQU*oo#9Ojt4cBo`cdlB{CEj$DL#8l4`fn{rkAikXt8>vfREj$p>c5j*F@C zcD=4?B7XZn?7e4Hll!*+tBWP5h}e;?qVysl(m_N;y3#u;y$hj3Kt)Bm)X-7sE%Xwq zbVz{ELk}&48YBS%gpm8-TKn#^&)H|(|G49h`)c#X;gAt2zdX-;=KRjj2h(s0Y!tcW z^GND2kdv~TAs=l<^s=y_T|0rK}~~jdbI|;6JQnBb1pkU@_m;W zAy+1vU5l&D4#hXiIViaiLczQ?rI)Sr=Z}tE%{rrGv?wXTNH0c@Wq3)_1hODsW@Ln( zd+!)G3531O{Ynx>Z&`0W-3R~5EHN1hLwgMtyY=-c==-$WBDP3PPG9%CF6Pt;`E4%y zN|!5M)G#?;OSy1XQ={wK7@hpt`oJ$c$2FDl@}B`b0n1wfE5?VzFMK5XrcdBF?#pMx zP??Xr$Pez{YB>D-e1Sa)wRAW_gjYQHqDM}M zC4q5Xnr_syI>4tMLEk>{gizldaYK*Ia($97tWjzSEyrU6<7fM5EH^AP^_ABjHF%#0 zRAi&HGalQ?a6u*!8W>OV_Er!59xi4^^FoiXjq<8RaCXU5WBZWxs-(zmT7*K|fR?2u zLTs%+ED{8W2@wot#q4q8V?6aVO+awZQ-z|MYdLTI2t9bKoZ*|4?Z#?Ay zHcCTBcDzI#D`x`exmSI3YTCxV+5iiWadqv+3t1Ip^_a#)%fS6Lwh`=>6EDXk)JHe?1JwC-RnLU#?g>Z6OX;E2?+d(^ zhQ=+RzNlw@Dv}fWe+2+Hfvfrh9(|oA`J!Hg0i}A9 z+z)gunk6`BGfJM9HSq7YPN43g(Hyd*J^0?5?CiY*!>gJ~3uZyk?3P6~l-5c0uGSYz zQvxT>d9JPm>I%jkR`#n7=H5da`zgO|G$HFD3IfyfMg*nSCOZKSz|{j^b+vPA&KuKN z0`>Q;X%M4{4WB!0XB~O&&w3^mD5Y<`;|13&m|LxVT{mLyMQnUlFclWDZP<_rHHXub z$l#2&x%(9vC$-+tpnlG)%m+A?Lly52=jVG2N-i z7(Gvg`96|>MuMjRycp}<{wDsal#Y8z#{p69EU8~ReiAGmdAk`=SNZY=`~7sDDKbc> zSeyKvzLE8;mwA9scQncSf%i&td-X>6D5zs?mwUif-h%!t`tFP(MTwJ>)4v)RXCsjC zN16wx(^cB$5#)jScj4xGtSob~`Vn*=feSxEkeC*?Z5AV1pjxpZZ* zka(h%JCcGAB=qe+YIxNz%#3(+a{B!lC2|XXOiOy1RO=A27v3IJ^_qeLo`Wb8`ffhU z8QCRLwt_{A>397&p~6mPYN^_nniWDY6ZS|mJKJU6)J5@x_jrx8#t5K*AvG$q1(zWs zYfqZ!cJKxsx!|E{=2bB{KWAYm+JM#577F?9Ue)Ycfz2_%Jwr^ZZl}6GA9l7~VnNGY zC70ia>Tb4j3Z2cafF{-*m-;75Stnk@INudYM+<<^39XOEFL@wco<~!4zf_ufG%5t7 z(9){Nl^*b)OY!(XTI6@%&{d~D6IRkyW5(&N`25`HALZx zy66MH%l_=s4W%7=o~<4F6YeEb(j#1^W_>C4@&i&q@XA5Qk2*jJxOaa8mJ9YZyG z``zQSc_MSVx%C9C@%n7fqkbF9!@AsZ{aKS2j3#eLzCTuKGsD#G2k=sD_EoAFQlKSxku4{sulRHe$^X`XBd6vlO|Pfj0!Mp zFYBDWie;_l_l^TD*9+5`Cle|UM0!WkON7#PT`E$ZH%)<9@|tSqUF_pLH>G3<_x2W^*{_ezO(ZETBtX-1$6!t}{r(*Ck8zcn2 zn^Mrmxn^~jZqucA;~3Kg#cXabZ66q!t7j{Zza%BLKUeb%5!4`Ba+e&j8Gs?Hi?4#+DbEZi_mp3M z$It!v>v_A7(&uw9=O=<83)Ee1*v)oIVM%tg9 zDa1laj_!|YyC+*qFcTqBiq@L6(bfZ?R)TI$;gKTf#vSzuOOx!PBHrI@g{QRuFSgH z*FeoDkca{gyT$P!3C1E}UC#iM!ibJqTtsi2c|}EruC~vw{S)5-iM4GOjGCF{LKGNN z;hxTc^9D@?^Y3odC%%#|%t3Gz2sF!+s^4E>o6_F^i#5&go5|kO^zuB=)X@tD>TX8H zku_i1HWJ6HUX`!2zn|M2cs@i_ykh`jiKlIn{p0Dct)s3gbdkelZ^`hx10n0>T#>-T z_CrUFP`WN^oLkg^V)-GgGb^*Gt^8`YtfETnsJ!Ce#mKXZ*LeQPl1G)Gg7@i<)lsmp(VuS2GFJkyB?8RfD^UCqTqtu6t)z^Dla$ zIl)}V+z|a~48WU6=tt~FHx89miFnKOfSZs$fy3(F?7vx}>5NEe)jeQp=;%fE;y|DZ zxZ#@<8Qqaf3+H%CO6*#IP-B-t&LP6S7)(stheQqrSH2cb`%xyr`y>#hyKj* z6}NEf1oDQRX?%G(_IGBJen&cK&v8Lwdu?rW?dzSCCbCd$iBTI^@k}7eXJrU4y zS_|J&lfOs#hxc6S)kZUSu>M!v{#|CbSf#wn6nR zo9g^=e@V3_*#N(Gcd+IOZvG}KQG5N}uh6OT7yH#q4SqaUKSqf54=j znM!g)BvJNHH+->dJKud>rYW3xnJih{g{sYvOxdc_QqlAU{;P6ZrB*H1+j+fau+W0z z7W*IT?t5Ck9GLR>w^gX09`_ z`r>~OQ{jKD$MQ-oI z5&?;LVIJk~4%Rn2L{h#+%f?q53?n3oR|SA32)#&}(_%ZvEQDbQ843B|h3T!H!7r?5 zW(Rouj)M_{@^7O&H4_+SW6s%h#0+c-7#i&PNqIcwq~R6nzH7_JtFn8KYYG_snm7D9 zl55yLoqO5=BvM{HWVR7McyQC}=gz@HUYpZv36UD^8yf|2FxEo1&0g2lRe!Bcq0YRh zvbYSPc&O-`rx8!Cm?^FSV;nZ|8^Em|@NqkAEVo3FBwy`_{`^fq9&S!6@q2Aes1PCO z>a^6^kcJOnX+LnC@Q9{z+8abaWs`_npfqlBTusP1Y5U;>t}V^u14e%zWj*Gocm-WM zxZt}&^Q0V^Du_8y7!<%{M)Jp^BZPRTU|Y#kegcM0KO4`&=+}YT;SJBB;OFr^`ye>S z4}oUNVRe8Oi(k+Z$=ogPVyv-5SgA6l2XdOc2a%DsT} zFFVd?3ebGUW>36uh2G-O_r&P>9iSq8cHT0pTcvR1MUw0+A9=%0D<5)zLTOxpu3gAU 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 literal 268846 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

    C&8^0@$@yj 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

    cciYfk!<}BrGqgow}ZH zMF9`s0b(j-tNrfw`%d+WpM@WP&DwzxHz^`UzC?ftGQEPbzRig+fM@T3DExd4fciT! z&nSvKL@bSd1w3=zIlmrwrVu-Kov?wEH4F(*gRsy56oN`O3ZP4dF5%mM_p)6b-<)p~ z*oBJYjw>6)FbTA8*h&gYOS8sq_Vg+^`+8r{!pJp7b`_nXOLew>zLKhKDcFiCUl00( zUt0Msu0{+f!UGop?VTq>Un8jj9U;t>LKMvwTzAhK{%+{CEMxkhm5 zv>U4I7=<$s62|!ja8y~0-7(bDNTWt1zuooZ;|2YMMqYlKZ>p~a(JQdhlORgQH0FB1 z0lZ+>W+tO~TrWlksKTa972;Y>i*?v(FlLW)tu+-2z zP=(1HJVIf4!otAtijlTSCFtf&SRqT$XQCxdT-!DH(Y`ZQd)doZJV~KlL#g(bdjrEy z-PTsIbLW?fs+fOfDIPu^$6DQfK;TTcbxb0Q59*?VQ$z3~`{tsS`d}SP*ST1`da$Xz zG~<}Jtg+M(%30J1_bSL=!{F2jo~eZN26ki+Cm~&Eu$P?#J`Wx+lc*;784yXZ@fP1w z{|Nd(!ZsUc%5$RI9as$dNUXq42G{?fI+_^j^27~^*)m=iF9szDG~P?MB*tTVM4&wq zIbz;Tz)hRAv_O&pVFsv4ASZxN5Ui4mH$25)84W2nuVGr-`ND48E=EQj1?RRYR4zG5 zkTrl4B6r|DhPfrz+%f*l+Wr~!ZLgmxkRR`LCHamJX@G{s38fEURk7JX*d?!z4+yS{ z-g`5$9{VoWv#E*LG(SR%G1mdS`23j;tRrmj*j#+REpYciEW#T@SjX9wcrExtMI7*Qy^6tK+qMRljFzH8xYQkq+QRgKpf*62g3aWm9 zM<@Zl>}S=64Z`nz*CYWvauZbn)g_a?ZH(&B`L@khmHeKYsBdeJ_}|U?>ks{Bv;MsW zF7T#KKZfcP7p{&04*AxS1Md*4ySmu}A|Y{*KOl!z(5F6b2it~u&{=bwPVGAd4`38` z`smbk+-8H9bV zTW}R1oz4}pL~q-BiwK4gDuamoKW+W1lP+qIuo@oGESM*`vMFuD{f4r{P+7lDaqedx zqN;J3c5z*4x8f4kseLV`znkDBRChS9eaDf?OhNGkek#jx)adM6y2-oV0)Xh^qDaNm2RH#7V%l->VOT`WT_6W(`skfc zFlfP~kuVQot@P>N*-~z$qQZf|!Y^!W zL+c5?Q0lC_I29<%nLn1kDyUreLt4w5K>f|JTo-QeHnTfB`D5 zZ3&3P9IEv$H<4Y^xWB+esuNyPFm_*nSYvW{U+h!dI$UQAnY}#YkYjz z33Kd61|(ezxGC8tCQhuh`=N&-jENo`{sq7bX9sV}!_yP1REN-HppP4BdiW{dT5~m8 zi9$tL83RXU4UOI6woHcoB;%REi-ylA5olK6u+2ci*;(rI{6yI`nD)>&@kBVHC#-Dz zr9-JXEim)I>1wUti*XMq&*=CN?=TFI)*MddAAk3AZf>YCi;F7(mk;~5o2CR{tOr15 z1s;mMBF|IrNKs+2K9ijV2bBbq)O4bF9Qf<8f^qnj7O*RhY0IL6d|aeh|*2+io6nQ_z>zyjBW65 zuHhFf;_;|1Zu;a5_J%WHW>oD&%Mo<{7^nS|nJNWT3my0wV8Fm3$91@IVqicEdMU8C z`P>+&cj5Q}v&6d>z>LnX28R;jSw>PB)*ddzkRBmKwLObPA&9?4?JW0MK<843H94qVk0}amzes| z)6-K@Qo_f?*w`39HQliI*@zaa_tk6HaEss*qo{9|Pr90a0~{qh7&}-A5fixa0%8RR z^vCsY-lX72y3UTUq;%M#lm&lx2DdR*6%+don4qG^ZDAwjqe&Nor;3x)51g9|+ec!f zCO+N6VSrMcfrRx(*Kgy!Xh7cm6qnk~z+MJ?J0d0EQ6p2rpmYnYCy-+Sqq&}G%4M=U zh->)Cd3A?ch1V}$xcwbDLTuf}(03o4hqAMsP_PR=J++`oI&HnAf9C9T@oF}&Q)ldc zpJBsWv*i*BUl%Pc)2C-@?&l6S-1kI@gOD8uUj7pZIN=Q7Uf>s(Ryhp%^fc2V&niUUV!^0;(M z$;k8@F;oZf^9TxBls9`|s6U2BPy|8=&Ndu!l}eL7n^B#k$InrFT)eJ|3ohR4M-Plp zkWmpXYx&kNj$@Jbu(wL%vBQR1rHdCAP!?tO{-2%r&D#FMiC;h}AhWnjFB<>L$XqZ{fmw3FLOP56SuR0-Md3|FJ|T@8|rxOF*#!5)SZ6aadlDTuQ<~ zybWkKx*(V@W7azGKR$XFVHo{lKO*YQurR{Y70Pddk=<3BtA)lL`5CORD#Yc4uJeCw zyRQfmYp%flLEtCkG1zNtwf9}o|L(?L#cay4@k$~1%lzmckTfBmA|FZ-cEewR67U2N z3p6ZlWJmv+T3?|+R>+28AIZD=)hkTg-o4j|$kM}v0)vMC?z?Z##Ot)KW+%7@*h2gR z*~j|*ov5z!xts(<4I3xCxO)-~w()z+@)T+k3G4e;@BROJ$JcxZodFR*3pe1sMo?A> zOo2epL~D}iq3}Pg;+eKxQD@w~-4jGTpaj+)B>NhaVK}{rLRN))zH~C>@mUzvBsxFb z^pC%HFl^rc7}}>aV^sukT!>@&IU~?e=bw*qnbkt^i7TEd_p3Kdf6h@H$%*`mBC%CM zn|Le#?Uy~4VE(t?`hPYi|K~sWU%kTrv!6U44-zi1R$w1l9yM{cA;z-sU?9t5AU?US zP4v2|59%q}^rVxFq_}HXUlF5v{q0^0nLl6P?+cJ-T?dkzrW<>(%MEd{Z5`r-Fb>~U+lj8=zsnN2OC?Z={pC> zfBsSLSn5pVx%2<_uK(w^;V%F0-^;lZu6gHQ*7Y0)bNb!?nBf2OXNfHXf)oGx1ONKX zKWhR0^$-92|Nq|~!GC_0e}BgRtE~n9`gm8~V?O~#JYv$@^vRn_!Ji>y!0PH@?m8Pf zuZXUX46oJmNqUCO3sHZT2XGj|iV{3$AvnYjoI$sMYLjpwKn%%D*ng6_>Bm+wx!Q}{ z1ZCBetTV~N{Nq%}gbS^;QoJvsRr=I+EilwbQB{>69(nr{HFns-ItfV1I0v&xR* zNCtdlOkfb6*y-t`utNxO9ls_f`hc%sG@GCL0hB<{tx$!Eq2Nl`3OPX#Fsda z)gVFcq(u(=9KS<{}|w5o!~VzS77&#wWph} z2wc?~Va9pBGCqNyLkOpk8L+Ww<76JPHYmMN&`W@Y=c}EpOz(JwAnJc_A4TVglH&P)Os4U}wr< z=p*h;sOJxd;0Lzh%~Egzr9`PoYLY*_cgnM=AG>TJydD1JyOafA0aWLVFOoFUkX)+K z1LBxu&!0ja5B^mP(m$$uis0`kY|+j5t}c7Q1Q|aOzWc2@~-xi_z0>!Jllfr_7X;lc%CVY!X`_K`g-! zh0lrFSAe;!aChXy$``IgMi2DwsJ6Shx?mcQ0Yy5Dq+qQI!6L2%o_%~*A6}J)bPiB3 zaPcOvO&g#GM5I4{poTrwl71`nbw<@0!(jv-xwsrGqQnRU6n*`I52;u#221oOT6+?h zHL!0BjAmS8s5Asjyw@0a?i?Q*tB){7wU3B{?v<3((oBZfhAshxonXbW&*1k)$;ccD zc!0xGjBm|cg^hy$dZHPTk&*ZhF?VWR!xCtng%>Ej2#tPdXgwGl1lt{qIn3JeB~Yxr z>*$D8f;n6*iixRrge57~0sWP)2;yp8PPlUiwaFZQhk?{x?9{YU_XI}*pdQSL==Uh) zbnih>MF%-En}b)4$G&B4vx7dK5seSqd-z`C%YAtZAv0Rv39#`o8%E(m?EOODBPciy zXAQh@b05Mb3Y)-WRf_ypc{=+|yo}b7J>tVcn+1cQu@9g9C#k9WSWMEgrUyjJ^|Sk#$^2nNgFn9bOHBv*$cfJ7F2@fiPOfh zKi(j#6RZSYD*ysk)jg{d1<${I*Dy<-ad6S;fK4<>8MIuS;>KMQXm%?AJTUJ+E4go9 zUHc?}3M>}j3IG~|v?GZDukR{iHyH2OnE`MR>!=KWbCCF(g@_8Os{?Q@HnRX5IN&&s zZN;n18kkfAgupXf!m#{2|B5V}CSM!hY`iNrj5Pyq+sBpJK0=&`$oji7 zXR!1D9=m^rtS|&@`;Gf^XQeMc8hwkgcehz3G~+U82(f{ z!D;fx*RS$l-Q3*Z6n!WCB9biTzy@fV0GlVR14VfxEDV=K0}GP2H6hwka$*lGK4u`e zaZ7O;H}tV*JD*%MF97{DLp`xD;y?lx%wugt1K^`6I!FdEFt<0s>4831XS9}K*d(rd zDdVXC8Cm8gtgm@N#jqrzwaKvTwlnUbgjqeV3?e_<3b9ie>W&#*LMYQij$V@dW5VbCBl{#FJ(8ciXqL0yEtI&KMFrUYQD`88&%z%C4eWHW zGt2=9cW8tGV0mhX>BQW>>vm>huQ9kA2g^gzUP;*R=uum!G55lI0iNtuOA^>i&15;} z*(5=*JkUeqDIkcCL&J(gjn#>V?gKZ6c6T2_Ta(cx7`YfeXz%J;#OzM#S|PR{;D|0e zod)cBeU6P-RIWtcTj6uNKXMgQl2k4)9{C&TZdaC9|lCC zho0UUDjoN#eYAn}=fRJq|Lei$$?E_9PY>QT)OFz1#ylmG>}v(X)8QiV$e-2_Ukg z>__y)dNR#0N2?}7l;jMc2H|#`o=~?&ThGMBonpmb^*Q*@DC;8*`TN~1aTrlY(6!=z zf&74o2@D6~v^k(brf;!*q!Ymzuf#jU3$q*Sqs_tKa{1lw<*=;zLkDS4^AIYT{YOM3Mu1FsT(|&7q$#{< zudCrG-`w{CCLvgMrQGKO!Qq=A_t(gSR-u`4tvi-!@i z+L8#2*OhMWKGFP(>|8WTbi{qQVOFB#N0CVQ+3MDS)r$fw#Bt263|Pn5#*6R=;p7G* zcKjG1H@QQ97TI=#z|w~bYrP-0{ru zi|iuf^|MUK`&h`j43Wn^dLU5ZJvHU?W5k0Jvw{rNKG019A~Ef{E5kJrEIb}4JP05J zm&Oq5oCjROe|MLOS&VDksweadk9J}W5{jJrR36AlMAro7Eh>$`PazAtP(};vtH6UL zn_9zr!WxlqI#JY@8M_M9?}|d|0?#A>?rEOPaR7TIjS3^b_Y`Lbd1~Oq!8@`APxe}g zX9HB(Zg(klV9ZlpL}SAFD8tzJ#ig!sy=9bD^dzvEN4aIr;(w>GS#4&{>6rpg9f;7> zW(gi4p)7=JaH>86tV>yf4%P!_0&NkRD|%12?-*hC?&j8k5fDrsQ6(lJUb0~;#xBhV zk}nx)=Z_=3nZp-l-caD79~oIq+&Hn&?h%vSoL%!|7(54Q*pDs)al>>d?k&d|&$r;< zwZyOED91^GI%yD1E<9=uir4T93Whn{=GOu7Oz{BOL?A~16y&4$(@NGH=WH}L%*Wj! zb`oRe@d-p~bXQv_HMx5=w#aVSKGE20TZpRL+U`0<%)NWvc*cMTu~Wwqhkz?WBg}p8 zbl4F-oz(X@H={+aV%iW=1vwTt^mGar3nQyM)_Kb6jhBO||47l)r)hK#7y_-|+)KQe zD_R9cwyGl;@2zR0$ojG=YtNGAkB?yYmdCXc7utRO`W^dz^{7?B>n zWW;&Ql2(2WZdqx2_wL4C;rI`6tv+O$goP;8#A)cM{6NNppjZ7(K6clUlz|4|pp`zn z5g3?vTjYJ*7L3QwoH_Gbv=&F^&Fm3W=~yG=QVwLQq{FHMvT zo%?WZwnrIY507Jq8!BD;DEKxyVQVN3+At+@u`{{{G_q(OWpP=T!2b$LLMA+mDd|JM zRU94_5L{PIe%|MXt_XkPE9Ij<%bXv;qyH%SbQq-l#211#TyS|i03u>+gV_cSFtk~a zRZ9;@Q$@wZxPb)(Zp@}ln{WXryA(4z@P6*bi^OZp;|fAFFb+@`FRItCE0ai%N4yAw zCOq?y;NaX>5mM(X%jFV(rG<4V5yROWu4Qc9X4!;$F+TYOwJhQ+&M5rX`ukUL^GI7| ztlsay{%{Dzf2S1}ACjrVggiWu*q)&FG+p@Y_?g`x>qgG(5QmnQ6a>;HXeD@#w{Eq9 z2}V)|riH;L-|rD{x)2Y?D?w`I)BFt9YHsBE?cqgkUEO%F`SQR>RGQb$ea4%$ih==Z zwCohvocf=^(Fl@G6nt;IamT28L=3BD-JtgCjYN-imajDSCxPf7^KuG zcCDzHB9C@~Be@0}4$K!02>bF6e<$+vyNKDDnfLIm7%0X#56>4h2!_5~L}P(<50(}d z%Y=$?I0~Uk8jGO1+%Rk-nB7<&i0XaZBMHbB=E%s@XWiTis@6W}egmR+!P%LRXA{%i zSb^bh--vyDh+4mwme~3RaUBqR;pU4*;1AA>RQLqtUhi-yS|*HJcCK{Bz&ezGbFhCt zpt_|c7emzL;wOoo$rk*3mR}EQdgX_w2v&6AwOWA5iZCl*X}?R8R0E)Y=Edcy z&+85iLodU!LXXD7grp4O9VU!V<~tDGx+cND6TR;$@mLWJZ^NdcV;@d1_b*mWc;G?@ z#>j6uh=sdwdBtBm&7F?wgwW*}SNukR^Gf_OCxrdvE|qz&V2HAM8AFSoY=jY{@%%*t z0|VevfcC0hfzhFped}9xMJadZHU_(W{I?I&Z<8jIONI3A%D9R`vZ#?4kJu&Q*tA z5FY@BY#aMeK`hdInu_xqf<80P63%FErxpg4Lfw6tz&5}NX-r&@gcfCKG zo&?o0Y%qKhlocLkfZ@A>KC731Wv2T9?h~=B$A}b#0DMAEPY+KxXkDyoA;N4zGOUez z-@JL#*S7**n%np)k{$4xlBjQ(_rt^-znYqw5~IDqCx^E>pfIHUTw2IJ<@P3KoGleS zG=*mcuiy_T!(3?NBO`NASn5P;0%^Nfb`AEfz5p984A#ve;H}~R0M_ZfxOCVjzVGEr zQ^c#ElTV@x!|rhH_p3{AP{^6F(vh5e9*9z0f?60O)=59WPROYij-KxjXaINN7c>*5 zCDQk=N8Rzc>u<(*7|^d=-5R!y5h5}oN>_9>-T-n7z#&f0h3O5tBG|)VD7Ht<9_8L% z>00mEu#Uzx#Hi9mqHzLXVpD@0)+&s9W0`&AZdOHU@`r8Ow)=u_9}eB;fnLKO`*ORY z6<1i%>(2C7_4F*^<+yQ>@Nu9XInRv?Ew=P%OCQTfqp5S}MeFB(NMgI; z^{Sf#Q@qJ1{3K)-%6}Ig91MhiB$89Ug#F$wWgJ*vtMX`S z{qADLVf9478tzi@r!)Eh1tVBvLxvVEICzMHFqZ@HbR??zm;7DU@@k~?gpI3&JvKMo z()T9H7gLle60vZ5*6FdyNe#A5=+-3Ij>^bXpnMF7gs*vP)TgtwyN`VCXQL|3u!UOd zkM=?@<|l%lbC3J_G-F0S*zqFt2hiaV;DC)@W@Bc4Yj6#d_P}*~EyLi7Y9a@-9d@-q zWp|?RFh-1+kizh_5i!l>M_>pb8C3o#ijXn;OI)r=>vgrYi2>oa(WV9Axq75f2+c@i z#aCdY_OL3#t?0&A^|#heYlG~g^=;Zf^(gi}#;QU*&oX%fCVJ4C9IW5bj@bn8FO=6n zqAKy(P)orH=RVsbGzNh*OW=qO)<&lxw0RG&0R$L-b~5Yq=FOYy3zIbbMa`5^q8#c8 zN@|u1LEOzb2>#fP3BRD=V3D(o`Gk7R^M{7I`U44vdw*CNx6|1?q=b0DB6Z1EAv|5T z99Y@enqZ8DLd2Ma%6!G~2Er{df!}Y`J(a@hGD0Ib3r!Y6+|VL?1Ge>eg7=Vm6}w5( zJHF%L5aK&uuH-qZf1f!ufq$R5$iHU}-~kP1GUSoop;yozAC{DCzDVf#AG%M=c?O#5 zY$HzI=i4deVt0sxOwb&^B5*AGAF}@_M~z}~7>ljUTEn1GfA#cX7+=TfNa|t5C`n3b9 z-VcMe_Hq4v@B5(zdda#CU-}y@f%ZbXPf`ZruP*+vL@kH1G=o?bq_+?mNjJcsR>4ky zaREQ-olvnJY(xdNqd!=z*K$4e2a%Yuv$@+x8j226a-w2ANL@9dgCWLq(<=nv;Dq>R zx*+6f;er1!Jk|dbYNC-zRIsAUbAUKf9i<2=*30Ms<{G!euw`(39A4*_5)8E_ zyHgQg#P2`Fht8WqS7){=LJku{j<35ca7F?Z^OK}4PS(?;Ecpr@k~ZXKqPJne9gaKt~bgJO530% zA|fIv+;omYCwV@2q*>^yBRyJJdsDPNnKI`*iX@7@KN$$8-d# zjzDwG*AV7SNjJ{v{0_Fch?pRy!p515JQAq0&Gz6um@~5UMM>9I_K#YEWb#-$T~D~E z-5eHcm$i>#XPpjZ29^x=z)>xj!819AZ;!V{?ZejmaGN~ZWN4_YE0s~=UVkp=g3;k0 z;l@74p~o1#xdAs!@&S1-c%w9m@~)(uTZ$B3tIMS+YqzyfFeb?1R-is;p~X^cWU>>P z{S$I(BVZa^1W!PbH10-N1PWh?ZSs?oBkQR^F&nrJtpi}O7nr~5h)jJT?s)Kjy5sE| z$nxUx;PV}do|JNComP8TUS3v)31zR%9RdRwZF>hwF|a%PSCl#>@4g(}D;Bzxn1ihv zvuDbt3GdxB7bTaqLa?V`b>>oO1e-&&kDM0BFXQw{3D_>Ofr$XVEFNJ=GaM4d`X{^^RGXah4$-Qh95XpnG_LeM(8vu9_Ms zSi=MFqTMXtLqkb<*yYQHJ`H8%N9NbU8dH@Cfjs1ftV@uZM&q%6``zbNb4xbGnoSL~ zTU0Fbh_;wo9l`U(bkY!x^yrAU@6#PA|M7xRZw{O|j4Pj<&X`@DMnU=EiPl$;N3nlu z@TMug42lfzE##CjShic_)p(?ODCE!nmQcyW$0&Sg*(3z9g$4Nu&oYgj0G+_Kgm(kl z>BE2pQZh{U?}YfL#i(QpB)9A4>F!BHJ#xuTYZ1e@c&tna)kC8s^}t!F*&oEGW+9??X`b2aYRC+b5pt4$R4?t zK7u&IDe7(w<+wOB`s0TBWnv#GCJ~D;AB)&gFdIH8kSr~~5b>I~Tr6xzlk0d9{bRtT z_T?C9LnlaVkj4GRAi)m_9~H&yM9+uz7g%J6dKceRLsJvxwBOO{0ylpFW&&z?Rt`*Z z!F9od0iw=6cBSnXDnLN8facJEYbpG8NR!5c1P47KVjGNfnqnrY-y%Nqmkf)Eixli>qBj=b-Xkiiy%6EHOI_*NAt}`8)kR)! z+qLnPZFBj8z1qhX7aWe3=oHPQlU)8OxJ--!%Of z^25X7MNp0Eor1H!zaNR!(yQYM0zHBR|Ni}sPy!(DCwo3Z;J_Gk7LzbSA|xEHB!*K8 zVGo7}*UF`fD@hq0_fD`K3QNzO<$?wTzl}%h@G<8x{z}jrO5MleX3KYtl=uOn0#R5k zY@dWg5kh%ENdpM)5O0dWE@IdZ=5WBwcmvRvVE`cS#4`rOoN)8?a5qr>o2XM*waUyk zlbzi9CsD6o5{Flc(xH+AnQS~$rrXNIGRgW_lspwYH^~aPSyQu!a_`w=j#3<$D#5IP zxX-hJo)_;I7zq5`_`vN!u83!I2AYD;vrEM6HHJQVH2^Q+cSach+bhUo5O5!582Ain z$bDb5Lno=_ncerQB%fLPvp>!mA?f2B{%k2Z|BUbPRkc{5`Cz)gBjC=LQai&M`QEz2 z1-FPu52XxM6J9wZ+qPo=#Nd|NBJ2ugzbA-(Od ziOtwB3_c>!^3N-8vj2*f+b#DMu!3E12|#ak#2*U*2p4&*)&;rXeov(-6h+Y8{dlqD zh{D0%LxofWh5|BZ53zniQ;&VuV&yOXd#`AsF`qSEi{`+z2=@@)e!$w$U)IG-7srC;h?GK7=wUu=D?nbd*>Kw_xR8XFzatmBL%rAKzkuHn5bjix;u5j_N1`ezST z0I|d>T9o-|TfF~|uN`tAl|vX%?yq-giH{m>j(>@YTmV~Ev4=a<<|ov1NSB5cJ+9DI zKnsCy+y3s|Fz8dg56e;3;av8CdVtB%M>l?ySisaNw{9IuV9z?;gB}>b;f31c!2BU?$FfrzhsiX(f`rFu>ou&@3wme#GV=Z`{Bh_+2pw|DEt+EC};jGufHXm ze*>K}ye>EaDWG3L|31*K!HV=ffo=sT9*%JM3m#;dLNq6sn!r!&!Ab;x&aYdOKW{ZY zRPN2s8PL#n9{%O=GiR7Ff3gpJg|bv&?FF%(qxf6z;t544(TNmZ|9BF~qFntZ=h(wF zbkEQ>TH^o&5EU$%`uwp*+!t72(#kG#a2aqN{{!b|uxb?$_cp>($B>@ac8FYUu;pV#(Ot{X$3hq!8<8XQ*feug z)b7UE@+N`>0|}=8wli7t7>i(;7(4)jF1rG%Bc{J>Lzv>1Blc9y1`^zm?Zwigc(bZE z6FD}CF~$h$-;zCY--w@=H_%W*==ZL!o5~c^Q&V(tt!vljf}0(>_r7`o^oEqDRUG8H zodWMShu&UEC7(vvQD*=l)|KbVGXrHb=W+`XM8ndrfV!}|{ob8KmowU8AwEs@{TDbw z;svfl$eaNr-OUGcW?a-^-}@LtVAm~488P)@=cR*oaHGSC9PAgwyok6M;Bt5$FJPKK zb51`z4l*(*aRWXRd(Q+5Fe{& zRh zG8pb+z}j0o3`fI0kh>5)+e>x*9kP?X&~XQosi~6=4Hl6KRu$McpDXL^O-0yiVw108dtU zb6=e)BdMO?aS~5F3BcpgPVnJs0yoUrXMkXYHncUC({Nv{w@Dwh{0zgT7m?V9Tp(UPs z3r6qI&(5WFd9svl7j^6^81ekJiEc%DU;AFtUm}nG=6S1!6$z#>aCGeP#n$+VPT9rupwwDmZ}te7syBC`Y^0wPi=kmZ3uYN9+U_`BeGYFj8 zW~L(ukq)dL=TFo1nZKHht3W*I&NavS07P(f@Za_?nemUhUyr$`I%lg89I}f{?l8f8 zph2a6u1OZSHQ3a=D~Pl?8%G)eSB?Xh?EpfDiDxN3H%5EIl(q4kSC&5=|4_hom0~h@ zhm;$ij3OW{``}2#774q~ur)6~66tE!U`TWPvDY4ZYYC;6{r$?d_~lQd5uk>Al<>4= z%&**IxOi20X;=l`uDEbriI64Uc{nx=s*)9p6DvJJ=P+3l@Qiv1z6vbU zjm^AE+Uh~9xh<4v%QVj^;CURcvK2KxA^gGLKJWiiZ=w!P3=yyF()Hqd849mOm{%Og)t$QYqwTs7o0Om*e2*FzUA8njc294$XK2IAN=kCB zA5$5MUjxdJ-oStrxt`tMyQZd(v=|^OhFU{nIOwjMA z-leyV5|oh-Us|qBQukm`!7t6=X6=k&H(Ie=+0o^=)aLCoERJd94TrJ&7gXIE7l_x9 zXa8&~9JgG-yemQC#{E}_C9aibqsKf0OD4HlE)%Nho^b;Wdy6nQKzZg6DmuM>x>add zL%AOCi_=cj40vR?0kJhN0t1B{ht+}m_WKTyP)Aqc4q2#>l{*Mx*?DAFUn!nAVCU); z3p8E5o}>+BXi?x?s#*+ApkbDQcv)84=!o~dRFr&I9ihN`*t1@Db+YI%tIbGyK4b?@OChL8;Hfdu=hAoDjNlM`ul@xt+62Z-wR9{#+fv||eL7+@%*>fDiHVpk0Qtr`N{#N)qp5hqeGbnhH zoqeEhh@Gnobu@sYHiy3~@T8ZpNx-j>qOQ_G3eL>*L0;L0HfRR}BV2C7IXl`K8jdwOW2L(zg0ka%rrRh7zxD;GfnGI41Oi96? z04k&@(edy(SS7YIzi_s6pXvrXhK>!QOeA)`aVn%}Luwa%xgVoTi0t@VL8a`n zp~jTM=F^K6fB+*8oD)5{Lt^P=T7RXgTq+yPDsuAk8C_5A?sdF@u7vG!&x!0` z19*N6psXPYbQPtL^TPsH7+n)u1QZM*)=^*39V3dcd6-yqF0#Yr$>)O^=mQuaARrtp z->x|!RPiiQTZjJcQ+k(eO8{f9 zDZ&HKqR#`_9#?IFwj08FR#1Q{Uh^0_`QOAEit~jA1LZ&9n$^|i^{0a%mUDarxN2cb zpzcLg{TSkwnxv$pKSR!j}WWO}!|7s;_XKD*l2}rPK_bX7ZN9aimWK}A;>O>|b6@<#*49ctzw6>&^L?Ig_QBa8M`s*@ zqtpZKKTk4k+ZL<{N5X=YJ{lHLg&09WL0vt0!@BzV!LOQd?%Q{^rO|KQhn}5h42~p8 z-`kV6b_^wwJ7zOQlX7HaRpvGSS7}!s4|U$hZM&sao8(B8O4EVO5!G12=4ueR?@EPg z+*b!-OSy85D4`*#Feq2#3LTOo$u$%*S{Z5$lVaj||8`%`^YnWDeda&=+L_-pzwhsJ zyx;H7`!hWYIQIExLzrdg((a%2^c-8Zkz$7WMN(37!gGpW^UELG(&+S04&UtU?C_|w zL@{P+j9L6}IV(#`)Z#|8Tipi(Til4LAtU=fSZZ~4!Wv|g0Qm36J~@@KNjdg#(~9dn z*?7pq_FR}sb$B94X4kH+qR`XPw;>9dnqsrr`5&K%{^OH^+Nt!R1?i<9zC&haom+xB zXG5H9W6CAPAm|xd#8P59e>?JcX)%BN*w`3Uh2RS|ZP}tH)$4UuH_Np^$gqG;FQD%- z4*ZaP^|1@MVbKCuV(E+#PtL1+ilO1$h(gHMe&06OAP2zvGpqfY`w-}rckU080I1-ryiUa~80zZA)pym1V`~Ca=Tpv>RI#8c>3#GBF?UP{k#98|x z14C!OiZ$K^PMSWfh=@PnM(U14X4Soz&ty}=qS5OjPj?#G-aJpI4?yu#Gxt%={14m( zu)!1>48ppHjDL3Rd1xuR)OBf?GHZTo{Tg}@Cz3<~u#T#w#GH|x4e$^S0^Y@o-ZkWQ zj-k%+D>qkKMPR46qib{Xs|p)Fg)9WBZKgl+y2KtL*{4OgcfNid@w*HfMYMx%qH|x{ zLgdTbb(bt`!ks4G$+KB{|z>+`j$vO6Xf`fOx?eL8TQ{IRL#-UZD4j`}npy zT5`8g%$%LGM`Br7IieyWHe&H{py8xEY_&8F90C-zWVyH^o;6sjqETrB1q<6QL^!|$ zkW}BJosP}MGzo=v@bu8)7rKZTM_Bbh4ElU>)H#ai5I7v4;zelK#IibUzlmK>P2J9~ z1Enpmw=I}ha0i`HRO>WB#J_lQ3MZ1kKq${aQ`1q?JuR!7z277V4k8Q&qrvhdl{%7j zR5k%S3@g%s=0#-#T`nzFyHK}5O7Kw7q;B5gF*f^&NHZ#j1>68eve3r;&-G+4X&X6( zW9P|=h85@aePx<&bKFjzG%J4x>E8JA-<^`2yK3%t#MM%~z3=xxGk+XIdf_8#Zq<&S zatniOh+JtY9`fCSf-@4@?~BX)B;$6i?=?8X?RG#TTR+oP)nnqjI ze)jTu&9^6+`_0W0%bVaT53=|6J&(_-62eNW#5VrAh)=7VGnQ8vwJ->Q)Mvx4t}bM_ z&T+BLii!vNrS5i)h46;gA7PL?zF7h$1-p^&;SR;-%^vWd4hzJZNTt*<<9sW^RHb_6 z?HoKzpan!L3(6HZw(h_*5F>mMHM&K=P-JC}Ld}=@!-^5Q7cX8!E0IK!*}lD{HBe`D zoF$c-XY1mwr+2A$9S1j%R|2r)IQUs0yCzHzG|5`wN@zvMJaWr%piAWHMP!jtxXAKR+MZpD&|XagTrbiUQD` ztDeJPlxSA4AWsHhH}O<7=3|YXoA(IM@5PC%m&oBDa=xLjc6D(f1Y{~j=^u(=09C{7 zvd8Hrwzwij^^PT*SQ-GSw8?Jcvha6#JD z?@6UnU0iOHDBuI2%9{Mq#hCSs|EHhGewVJD7sMi-fQQ@2nGA+e@Lkb>B#6BIjxaZz zY167`RiF1k6^vBYvU_0s-Yr^J-)L-EeNuAMsGagVhX(n=d`_?$-{3)#8J}ZveYqYk z1V_Gf`@5)1Hb1BcQ(o%2FHHHN2N~1>igQc=0)OmCbxg$SaV)MjpB6okV_{`}J*=o` zhtlK$FR#B46}Pt~WAGL$kL>cTpkX@jHKDn!ZMAnYn&QSE_;5<+t zqNjOX3T&XrKP_Y73Ey~q61Z84<2;VE*!BkHHua++vq`{5qxq;dy+TX( zIQZFR`uy~rck*}3%DNosBM8S}RhA0~6#4Uaf?xvu(d*N=CvSz6y7=nVTMyPCcB3iB z-fe6;+PY;+z%{=kexGe1R&fH;b6ci|g@*o)QHl?e4lZYcX}KV(4H4`SG>lA>LL%bX7Yfa--J|&?kh$$X);?n{ z4S+RzJg`&5?6|b_k(X%Qm;4fi(L_PP^<=LMy(}mVO!GSN6YsXKMy41#Au}`iY<*uY zvHb_UK1P@EO*9}LK%I=W$EtF2RAAp2QKyjr-;6=Mxh_~9JqgT(Fddv^z^z}Vz?+N< zX@>bvbF)ZyySd38VpXVqTv9gdD{vcNo2UPyxt{G`L+Pj9dRK4Z$mVpO^iIQ+wrD}A z*U(=5TAjJL#B^U?3)Iceu{LkMB-g;s^URs!P($R1p!8h*NugP?bTTJ16on7U6Sw{TfHLG$%!I4Ah~pk}JChx`B97U0p#=_N(NZ z;L+>M6d6H2!TUNI8~0IYOE5Qzfp(l!SRtXt+Kv(NwzfiKSS-ye;_14DBc#1&vn9pF zdr%>sN!zTh9t5ZWgUx7x@u*rA2i=JO_sMQX#0B8xL?a=RRdbr;a6D~oZ6RTyk+7NX zPiWz+cd)c6l*oOx*y3GSGdl(p7&C|%g3@9BZf5ohWlNf>SD8#?r1;O#D={UX!Jfse z;AYCJ<0=Ay;txtoG2te!px}v|j+v|MAn{_L&9W(}9PCh(=AVHy)7ZLCtok4vbf1Gj zWdJ#axYo03@+k^(BntH4?p)RS8Z?UpQ)Ch{+u=$-7l7rxbBQE7pKms2n7}76rGl#2 z%E5u?p#?R*44$f;djqj68|ez+UUR13mpD$QrqX?HF{GUNyV9rrileg?RaHDZWb|{N zZ9P0bVqAHmZP|u6^@x;lSy|brs3=(C0ZO=YEQ%t0p^oqpKrsVv6r4%9kn5-|k8TbA zB!7c$l2KGtgai&PA!d<}t6ayypa1eqa~{ovy@dtqfM7NRt^mPGfvK+B51&q)eRO>fy*7x-V;@Choh1(?s*llUn zwo_mw(89oq|4_CW4h)KAtj?1=^yat^j3#<)YF6u)Cw4i9gFvo#O zhlIvL9eeve1ZuDbw$|3WL4e^u$LI~Wi)I`1-a4vls_8@9VQShA$QM71H?9Pp2)AwZ(&xX}qbtJT17ffg7@z!Q$MgD)v5 zK^VmY>cOCk8UU)VMgj%p!QalJ$J=imugzpK+4FKru0DDICCWPaIfiZ~zllProw!Y=}vZQ81)v?{V|7Nb*L(HD^{`M<5_Rt!_Q( z#V?=u8#`R^dV2J{*WU&>8NL7+Aw9$i0~eqqllmt>S!o!C?AXD<7Xp(yIa+i08Gakg zB=N?J+r-4gWMu|Wy*=>6;!Ny3lQ!v&X(T*T`VG0~tocG+N8Z23{w_dixyX>(mBcbm z)VPE*6+|V16N?PS`zw^8=OBWKiz$9005f1=7W4B*2lwG~`1r_}F}#(vPqKIrnwsD!@WK=VjpmrqB8%A+Wd~n7TBs{};h`NZVgmJ;=HDUh0 zIb!bi=+R;H6bO26D!s{YrL%t*4)xLM)vNmy7~SlJzrr<-xwzm&c1&3&k|;EK@RAFe zz5$pL4wb*GBQO{_7+H?;{h7efa^gCVW~60gKA=d46Fe#fs+*f%x66yBCJbok#jYjh z3F=qGT|i?Ly&lLSq6g;F0MF;;<{HKEP}M@Iql%*eDt@O#i~jm^7T8TMD%z>q31wx% zhd00r*#kjya@TO{+k*(gQ!Ao)R#ifK|fo+8Hq4g+O~z)L)nIKDg-2Wsvj&9k$! zP~oJY#9$Yyxz^%BqxDt&8tiE8!Z6W}fN>k^GB_(M!{3L_V{QGIEADVi zQT*-c;TV)S#kJ7GhKGfz?A%H8zO_Jgzl~YfGRwV>0*6q$7EWa32z8(U5TvdS_4-Df8kYA|;^gFzba&VVh}y z@qT>7%O^N!e2)D8+#$Zf6S)6``wy}y?(6W#h$t`yDJczjaH0al?kInk{XiBESXsGH za|#O!o$12(6s@0E$?#?5ZA|;G8xuK32j}2Fuh4+pPnE<0{Ld?H8Q$~Vi*VC`!i!*q{w%F@=ff!_5Gj6^`#eo_qUeX|8?m(%}mOS@Z!m-8sal4 My2d&Mdk>%g7o*CfzyJUM diff --git a/assets/intra_compare.png b/assets/intra_compare.png index b3cf9b13d1c299dd2d5bd3616f4d54a5392101b2..cbde8ff033d89eeb79ce6a7e30aa66a088ca195b 100644 GIT binary patch literal 182233 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 literal 151574 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%0D(6)qiV^J>Y5(hq0%Vw98+eh_?8jbsY)EqJ(# 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 BdZhpW diff --git a/assets/practical_performance.png b/assets/practical_performance.png index 31675dcf6c896def4a443b30155682c62a4c80f5..c46877db3425436df208e72e1f23a31326292b8b 100644 GIT binary patch literal 280348 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

    MOXFbMbA|KJWW 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%0AIZP>cSbOZw{XVm**EIVhtV}w^- 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 Juit(0e*k66`{Mur literal 173943 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 Ai~s-t diff --git a/assets/rd_curve.png b/assets/rd_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7037471d11bdbe217cc0793111df9bcfc7b563 GIT binary patch literal 534403 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%0A)`B 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 z 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

    y30Z2Vyny`?ug!4VZI{}h&+HR$AwBJ zD#3)f4jR|VL39Qq>Uc@&F-K9o@|%0Dx5(VUY=rdJp5(i0t?M{!MmSd-Tkg~HY*JT^ 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�PeOI1h;AB%9l!Wy=c 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�VxB-}ewK~BmF;X#YIj(2&6t+Q(($0bXo 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

    DCVC - Paper (NeurIPS 2021) & + + Paper (NeurIPS 2021) & Paper (arXiv) CodeCode Checkpoints
    DCVC-TCM - Paper (IEEE TMM) & + Paper (IEEE TMM) & Paper (arXiv) Code
    DCVC-HEM - Paper (ACM MM 2022) & + Paper (ACM MM 2022) & Paper (arXiv) Code
    DCVC-DC - Paper (CVPR 2023) & + Paper (CVPR 2023) & Paper (arXiv) Code
    DCVC-FM - Paper (CVPR 2024) & + Paper (CVPR 2024) & Paper (arXiv) Code
    DCVC-RT - Paper (CVPR 2025) & + Paper (CVPR 2025) & Paper (arXiv) CodeCode Checkpoints
    DCVC-UF + Paper (CVPR 2026) & + Paper (arXiv) + CodeCheckpoints
    EVC - Paper (ICLR 2023) & + Paper (ICLR 2023) & Paper (arXiv) CodeSF>tPmF!+PYGJ<*B%8JpCZ{8 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

    q{ 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 0: + avg_bd_rates[key] = np.mean(value) + return avg_bd_rates + + +def flatten_test_results(res): + new_res = {} + for key_method in res: + new_res[key_method] = {} + for ds_name in res[key_method]: + for seq in res[key_method][ds_name]: + ds_seq_name = seq + new_res[key_method][ds_seq_name] = res[key_method][ds_name][seq] + return new_res + + +def matplotlib_plt(all_dataset_names, data_dict, out_prefix, + distortion_metric, plot_scheme='combined'): + subplot_dicts = [] + for ds_name in all_dataset_names: + ds_data_dict = {} + for key, value in data_dict.items(): + if ds_name in value: + ds_data_dict[key] = value[ds_name] + if plot_scheme == 'separate': + _matplotlib_plt(ds_data_dict, + f'{out_prefix}_{distortion_metric}_{ds_name}.png', + ds_name=ds_name, + distortion_metric=distortion_metric) + else: + subplot_dicts.append({'data_dict': ds_data_dict, 'ds_name': ds_name}) + + if plot_scheme == 'combined': + fig, axs = plt.subplots(1, len(subplot_dicts), figsize=(5*len(subplot_dicts), 4)) + if len(subplot_dicts) == 1: + axs = [axs] + for ax, d in zip(axs, subplot_dicts): + data_dict = d['data_dict'] + ds_name = d['ds_name'] + for k in data_dict: + ax.plot(data_dict[k]['bpp'], data_dict[k][distortion_metric], label=k) + ax.scatter(data_dict[k]['bpp'], data_dict[k][distortion_metric]) + + ax.grid(True) + ax.legend(loc='lower right') + ax.set_title(ds_name) + ax.set_xlim(left=0.0) + + fig.tight_layout() + fig.savefig(out_prefix+'_'+distortion_metric+'.png') + + +def mean_over_rate_point(rate_point, distortion_metric): + i_frame_num = 0 + p_frame_num = 0 + i_frame_bpp = 0.0 + i_frame_dist = 0.0 + p_frame_bpp = 0.0 + p_frame_dist = 0.0 + all_frame_bpp = 0.0 + all_frame_dist = 0.0 + i_frame_dist_key = f'ave_i_frame_{distortion_metric}' + p_frame_dist_key = f'ave_p_frame_{distortion_metric}' + all_frame_dist_key = f'ave_all_frame_{distortion_metric}' + for seq in rate_point: + if i_frame_dist_key not in seq: + seq[i_frame_dist_key] = 0 + if p_frame_dist_key not in seq: + seq[p_frame_dist_key] = 0 + if all_frame_dist_key not in seq: + seq[all_frame_dist_key] = 0 + + i_frame_num += seq['i_frame_num'] + p_frame_num += seq['p_frame_num'] + + i_frame_bpp += seq['ave_i_frame_bpp'] * seq['i_frame_num'] + i_frame_dist += seq[i_frame_dist_key] * seq['i_frame_num'] + + p_frame_bpp += seq['ave_p_frame_bpp'] * seq['p_frame_num'] + p_frame_dist += seq[p_frame_dist_key] * seq['p_frame_num'] + + all_frame_bpp += seq['ave_all_frame_bpp'] * (seq['p_frame_num'] + seq['i_frame_num']) + all_frame_dist += seq[all_frame_dist_key] * (seq['p_frame_num'] + seq['i_frame_num']) + + out_res = {} + out_res['i_frame_num'] = i_frame_num + out_res['p_frame_num'] = p_frame_num + + all_frame_num = i_frame_num + p_frame_num + i_frame_num = 1 if i_frame_num == 0 else i_frame_num + p_frame_num = 1 if p_frame_num == 0 else p_frame_num + + out_res['ave_i_frame_bpp'] = i_frame_bpp / i_frame_num + out_res[i_frame_dist_key] = i_frame_dist / i_frame_num + out_res['ave_p_frame_bpp'] = p_frame_bpp / p_frame_num + out_res[p_frame_dist_key] = p_frame_dist / p_frame_num + out_res['ave_all_frame_bpp'] = all_frame_bpp / all_frame_num + out_res[all_frame_dist_key] = all_frame_dist / all_frame_num + return out_res + + +def mean_over_sequence(res, distortion_metric): + new_res = {} # model -> dataset -> [models] + for m in res: + new_res[m] = {} + for d in res[m]: + rate_points = {} + for s in res[m][d]: + for rate_point, value in res[m][d][s].items(): + if rate_point in rate_points: + rate_points[rate_point].append(value) + else: + rate_points[rate_point] = [value] + new_res[m][d] = {} + for rate_point, value in rate_points.items(): + new_res[m][d][rate_point] = mean_over_rate_point(value, distortion_metric) + return new_res + + +def parse_args(argv): + parser = argparse.ArgumentParser() + + parser.add_argument('--compare_between', type=str, default='class', + choices=['class', 'sequence'], + help='compare the performance between different classes/sequences') + parser.add_argument('--compare_frame_type', type=str, default='default', + choices=['default', 'all'], + help='frame type to compare BD-Rate, default is i, p, and all') + parser.add_argument('--base_method', type=str, required=True, help='name of the anchor model') + parser.add_argument('--log_paths', type=str, required=True, nargs='+', + help='list of model test result paths, model name followed by file path') + parser.add_argument('--output_path', type=str, default='stdout', + help='print the results to console or save to file; TXT or CSV') + parser.add_argument('--plot_path', type=str, default='', help='path to save the plots') + parser.add_argument('--plot_scheme', type=str, default=None, + choices=[None, 'combined', 'separate'], help='RD curve plot scheme') + parser.add_argument('--distortion_metrics', type=str, nargs='+', default=['psnr'], + choices=['psnr', 'msssim', 'psnr_y', 'psnr_u', 'psnr_v', + 'msssim_y', 'msssim_u', 'msssim_v'], + help='distortion metrics used to calculate BD-Rate and plot') + parser.add_argument('--plot_rd_curve', type=int, default=1, choices=[0, 1], + help='if 1, plot RD curves') + parser.add_argument('--rate_exclude', type=str, required=False, nargs='+', + default=None, + help='list of rate points to be excluded') + + args = parser.parse_args(argv) + return args + + +def retrieve_data(json_dict, frame_type, base_method_name, distortion_metric): + data_dict = {} + results = {} + for key_method in json_dict: + data_dict[key_method] = {} + for ds_name in json_dict[key_method]: + data_dict[key_method][ds_name] = {} + data_dict[key_method][ds_name]['bpp'] = [] + data_dict[key_method][ds_name][distortion_metric] = [] + for _, one_data in json_dict[key_method][ds_name].items(): + data_dict[key_method][ds_name]['bpp'].append( + one_data[f'ave_{frame_type}_frame_bpp']) + data_dict[key_method][ds_name][distortion_metric].append( + one_data[f'ave_{frame_type}_frame_{distortion_metric}']) + + results[distortion_metric] = {} + for key_method in json_dict: + if key_method == base_method_name: + continue + results[distortion_metric][key_method] = {} + for ds_name in json_dict[key_method]: + if (ds_name in data_dict[base_method_name] + and len(data_dict[key_method][ds_name]['bpp']) >= 3 + and data_dict[base_method_name][ds_name]['bpp'][0] > 0 + and data_dict[key_method][ds_name][distortion_metric][0] is not None + and data_dict[key_method][ds_name][distortion_metric][0] > 0): + results[distortion_metric][key_method][ds_name] = BD_RATE( + data_dict[base_method_name][ds_name]['bpp'], + data_dict[base_method_name][ds_name][distortion_metric], + data_dict[key_method][ds_name]['bpp'], + data_dict[key_method][ds_name][distortion_metric], 1) + + return data_dict, results + + +def rotate_results(ds_names, results, print_overall=False): + new_ds_names = set() + new_results = {} + for ds in ds_names: + new_results[ds] = {} + for m in results: + if ds in results[m]: + new_results[ds][m] = results[m][ds] + new_ds_names.add(m) + if print_overall: + new_results['* Overall'] = {} + new_results['* Average'] = {} + for m in results: + if '* Overall' in results[m]: + new_results['* Overall'][m] = results[m]['* Overall'] + new_results['* Average'][m] = results[m]['* Average'] + return list(new_ds_names), new_results + + +def print_results(all_dataset_names, results, rotate=False, print_overall=False): + if len(results.keys()) == 0: + return + + if rotate: + # after rotation, the meaning of all_dataset_names and results are exchanged + all_dataset_names, results = rotate_results(all_dataset_names, results, print_overall) + + all_dataset_names = sorted([x for x in all_dataset_names if not x.startswith('*')]) + all_method_names = sorted([x for x in results.keys() if not x.startswith('*')]) + if print_overall and rotate: + all_method_names += ['* Overall', '* Average'] + elif print_overall: + all_dataset_names += ['* Overall', '* Average'] + method_name_l = max(len(x) for x in results.keys()) + 2 + + line = ' ' * method_name_l + for x in all_dataset_names: + line += f' {x:{len(x)+2}}' + print(line) + + for method in all_method_names: + line = f'{method:{method_name_l}}' + for ds_name in all_dataset_names: + if ds_name not in results[method]: + line += ' ' * (1 + len(ds_name)+2) + else: + line += f' {results[method][ds_name]:<{len(ds_name)+2}.1f}' + print(line) + + +def print_results_different_metric(all_dataset_names, all_sequence_names, seq_results, results): + for ds in sorted(all_dataset_names): + print('-'*4, ds, '-'*4) + print_seq_results = {} + avg_bd_rates = avg_results(all_sequence_names[ds], seq_results) + for m in sorted(list(results.keys())): + if ds in results[m]: + print_seq_results[m] = {} + for seq in all_sequence_names[ds]: + if seq in seq_results[m]: + print_seq_results[m][seq] = seq_results[m][seq] + print_seq_results[m]['* Overall'] = results[m][ds] + print_seq_results[m]['* Average'] = avg_bd_rates[m] + + print_results(all_sequence_names[ds], + print_seq_results, + rotate=True, + print_overall=True) + print() + + +def compare(json_dict, ds_seq_names, base_method_name, compare_between, plot_path, plot_scheme, + distortion_metric, plot_rd_curve, compare_frame_type): + cls_result_dict = mean_over_sequence(json_dict, distortion_metric) + all_dataset_names = sorted(list(ds_seq_names.keys())) + if compare_between == 'sequence': + seq_json_dict = flatten_test_results(json_dict) + all_sequence_names = {} + for key, value in ds_seq_names.items(): + all_sequence_names[key] = [] + for seq in value: + all_sequence_names[key].append(seq) + + if compare_frame_type == 'default': + frame_types = ['i', 'p', 'all'] + else: + frame_types = [compare_frame_type] + + for frame_type in frame_types: + print('='*12 + f'{frame_type:>3s} frame' + '='*12) + frame_data, results_list = retrieve_data(cls_result_dict, frame_type, + base_method_name, + distortion_metric) + if compare_between == 'sequence': + seq_frame_data, seq_results_list = retrieve_data( + seq_json_dict, + frame_type, + base_method_name, + distortion_metric) + + print_results_different_metric( + all_dataset_names, + all_sequence_names, + seq_results_list[distortion_metric], + results_list[distortion_metric]) + frame_data, results_list[distortion_metric] = \ + seq_frame_data, seq_results_list[distortion_metric] + else: + print_results(all_dataset_names, results_list[distortion_metric]) + + if plot_rd_curve: + if compare_between == 'sequence': + names = [] + for _, value in all_sequence_names.items(): + names += value + else: + names = all_dataset_names + if plot_scheme == 'combined' and len(names) > 7: + warnings.warn('plotting in combined mode with more than 7 datasets/sequences' + ' is not supported') + else: + matplotlib_plt(names, frame_data, os.path.join(plot_path, f'{frame_type}_frame'), + distortion_metric, plot_scheme=plot_scheme) + + +def main(argv): + matplotlib.use('Agg') + plt.rcParams.update({ + 'grid.color': '0.5', + 'grid.linewidth': 0.5, + 'savefig.dpi': 300 + }) + + args = parse_args(argv) + + stdout = None + if args.output_path != 'stdout' and args.output_path.split('.')[-1] in ['txt', 'TXT']: + stdout = sys.stdout + sys.stdout = open(args.output_path, 'w') + + base_method_name = args.base_method + assert len(args.log_paths) % 2 == 0, \ + 'log paths shoud include both the method name and the corresponding log path' + log_paths = {} + for i in range(len(args.log_paths)//2): + log_paths[args.log_paths[2*i]] = args.log_paths[2*i+1] + assert base_method_name in log_paths, 'log paths must include the base method' + + if args.plot_scheme is None: + args.plot_scheme = 'combined' if args.compare_between == 'class' else 'separate' + if len(args.plot_path) > 0: + create_folder(args.plot_path) + + json_dict = {} # model -> dataset -> seq -> [models] + ds_seq_names = {} + seq_consistency = True + for key_method, json_log_path in log_paths.items(): + json_dict[key_method] = {} + with open(json_log_path) as json_file: + json_data = json.load(json_file) + for ds_name in json_data: + json_dict[key_method][ds_name] = {} + if ds_name not in ds_seq_names: + ds_seq_names[ds_name] = set(json_data[ds_name].keys()) + else: + if ds_seq_names[ds_name] != set(json_data[ds_name].keys()): + seq_consistency = False + for seq in json_data[ds_name]: + json_dict[key_method][ds_name][seq] = {} + for rate_point in sorted(list(json_data[ds_name][seq].keys())): + if args.rate_exclude is not None and rate_point in args.rate_exclude: + continue + json_dict[key_method][ds_name][seq][rate_point] = \ + json_data[ds_name][seq][rate_point] + if not seq_consistency: + warnings.warn('inconsistency found in the sequences tested in each dataset') + + for distortion_metric in args.distortion_metrics: + print(f'result for: {distortion_metric.upper()}') + compare(json_dict, ds_seq_names, base_method_name, args.compare_between, args.plot_path, + args.plot_scheme, distortion_metric, args.plot_rd_curve, + args.compare_frame_type) + + if stdout: + sys.stdout.close() + sys.stdout = stdout + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/requirements.txt b/requirements.txt index 21ad776..00e16fc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,10 @@ -numpy>=1.20.0 -scipy -matplotlib -tqdm bd-metric +cmake +matplotlib +ninja +numpy pillow +psutil pybind11 +scipy +tqdm diff --git a/src/cpp/install.sh b/src/cpp/install.sh new file mode 100644 index 0000000..1e5a323 --- /dev/null +++ b/src/cpp/install.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +start=$(date +%s) +pip install --no-build-isolation . +end=$(date +%s) +runtime=$((end - start)) +echo "Execution time: $runtime seconds" diff --git a/src/cpp/py_rans/bind.cpp b/src/cpp/py_rans/bind.cpp new file mode 100644 index 0000000..9cc7f96 --- /dev/null +++ b/src/cpp/py_rans/bind.cpp @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "py_rans.h" + +#include +#include +#include +#include +#include + +namespace py = pybind11; + +PYBIND11_MODULE(MLCodec_extensions_cpp, m) +{ + py::class_(m, "RansEncoder") + .def(py::init<>()) + .def("encode_y", py::overload_cast&>(&RansEncoder::encode_y)) + .def("encode_z", py::overload_cast&, const int, const int>( + &RansEncoder::encode_z)) + .def("flush", &RansEncoder::flush) + .def("get_encoded_stream", &RansEncoder::get_encoded_stream) + .def("reset", &RansEncoder::reset) + .def("set_cdf", + py::overload_cast&, const py::array_t&, const int>( + &RansEncoder::set_cdf)) + .def("set_entropy_coder_parallel", &RansEncoder::set_entropy_coder_parallel); + + py::class_(m, "RansDecoder") + .def(py::init<>()) + .def("set_stream", py::overload_cast&>(&RansDecoder::set_stream)) + .def("decode_y", py::overload_cast&>(&RansDecoder::decode_y)) + .def("decode_z", &RansDecoder::decode_z) + .def("set_cdf", + py::overload_cast&, const py::array_t&, const int>( + &RansDecoder::set_cdf)) + .def("set_entropy_coder_parallel", &RansDecoder::set_entropy_coder_parallel); + + m.def("pmf_to_quantized_cdf", &pmf_to_quantized_cdf, "Return quantized CDF for a given PMF"); +} diff --git a/src/cpp/py_rans/py_rans.cpp b/src/cpp/py_rans/py_rans.cpp index 1f5d047..1dbc82e 100644 --- a/src/cpp/py_rans/py_rans.cpp +++ b/src/cpp/py_rans/py_rans.cpp @@ -4,390 +4,497 @@ #include "py_rans.h" #include -#include #include #include #include namespace py = pybind11; -RansEncoder::RansEncoder() +// Count trailing identical zero bytes shared between two encoded streams. +// This allows overlapping the reversed stream to save space. +static int compute_identical_bytes(const std::vector& a, int na, + const std::vector& b, int nb) { - m_encoder0 = std::make_shared(); - m_encoder1 = std::make_shared(); + int identical_bytes = 0; + int check_bytes = std::min({ na, nb, 8 }); + for (int i = 0; i < check_bytes; i++) { + if (a[na - 1 - i] != 0) { + break; + } + if (b[nb - 1 - i] != 0) { + break; + } + identical_bytes++; + } + if (identical_bytes == 0 && a[na - 1] == b[nb - 1]) { + identical_bytes = 1; + } + return identical_bytes; } -void RansEncoder::encode_y(const py::array_t& symbols, const int cdf_group_index) +std::vector pmf_to_quantized_cdf(const std::vector& pmf) { - py::buffer_info symbols_buf = symbols.request(); - int16_t* symbols_ptr = static_cast(symbols_buf.ptr); + /* NOTE(begaintj): ported from `ryg_rans` public implementation. Not optimal + * although it's only run once per model after training. See TF/compression + * implementation for an optimized version. */ + constexpr int precision = 16; + constexpr uint32_t prob_max = (1u << precision); + constexpr int min_freq = 1; - int symbolSize = static_cast(symbols.size()); - if (m_use_two_encoders) { - int symbolSize0 = symbolSize / 2; - int symbolSize1 = symbolSize - symbolSize0; - - auto vec_symbols0 = std::make_shared>(symbolSize0); - memcpy(vec_symbols0->data(), symbols_ptr, symbolSize0 * sizeof(int16_t)); - m_encoder0->encode_y(vec_symbols0, cdf_group_index); - auto vec_symbols1 = std::make_shared>(symbolSize1); - memcpy(vec_symbols1->data(), symbols_ptr + symbolSize0, symbolSize1 * sizeof(int16_t)); - m_encoder1->encode_y(vec_symbols1, cdf_group_index); - } else { - auto vec_symbols0 = std::make_shared>(symbolSize); - memcpy(vec_symbols0->data(), symbols_ptr, symbolSize * sizeof(int16_t)); - m_encoder0->encode_y(vec_symbols0, cdf_group_index); + std::vector cdf(pmf.size() + 1); + cdf[0] = 0; /* freq 0 */ + + std::transform(pmf.begin(), pmf.end(), cdf.begin() + 1, + [=](float p) { return static_cast(p * prob_max + 0.5); }); + + const uint32_t total = std::accumulate(cdf.begin(), cdf.end(), 0); + + std::transform(cdf.begin(), cdf.end(), cdf.begin(), [=](uint32_t p) { + return static_cast(((static_cast(prob_max) * p) / total)); + }); + + std::partial_sum(cdf.begin(), cdf.end(), cdf.begin()); + cdf.back() = prob_max; + + for (int i = 0; i < static_cast(cdf.size() - 1); ++i) { + if (cdf[i] + min_freq > cdf[i + 1]) { + /* Try to steal frequency from low-frequency symbols */ + uint32_t best_freq = ~0u; + int best_steal = -1; + for (int j = 0; j < static_cast(cdf.size()) - 1; ++j) { + uint32_t freq = cdf[j + 1] - cdf[j]; + if (freq >= min_freq * 2 && freq < best_freq) { + best_freq = freq; + best_steal = j; + } + } + + assert(best_steal != -1); + + if (best_steal < i) { + for (int j = best_steal + 1; j <= i; ++j) { + cdf[j] -= min_freq; + } + } else { + assert(best_steal > i); + for (int j = i + 1; j <= best_steal; ++j) { + cdf[j] += min_freq; + } + } + } } + + assert(cdf[0] == 0); + assert(cdf.back() == prob_max); + for (int i = 0; i < static_cast(cdf.size()) - 1; ++i) { + assert(cdf[i + 1] > cdf[i]); + } + + return cdf; } -void RansEncoder::encode_z(const py::array_t& symbols, const int cdf_group_index, - const int start_offset, const int per_channel_size) +RansEncoder::RansEncoder() { - py::buffer_info symbols_buf = symbols.request(); - int8_t* symbols_ptr = static_cast(symbols_buf.ptr); + m_encoders.resize(MAX_EC_PARALLEL); + for (int i = 0; i < MAX_EC_PARALLEL; i++) { + m_encoders[i] = std::make_shared(); + } +} - int symbolSize = static_cast(symbols.size()); - if (m_use_two_encoders) { - int symbolSize0 = symbolSize / 2; - int symbolSize1 = symbolSize - symbolSize0; - int channel_half = symbolSize0 / per_channel_size; - - auto vec_symbols0 = std::make_shared>(symbolSize0); - memcpy(vec_symbols0->data(), symbols_ptr, symbolSize0 * sizeof(int8_t)); - m_encoder0->encode_z(vec_symbols0, cdf_group_index, start_offset, per_channel_size); - auto vec_symbols1 = std::make_shared>(symbolSize1); - memcpy(vec_symbols1->data(), symbols_ptr + symbolSize0, symbolSize1 * sizeof(int8_t)); - m_encoder1->encode_z(vec_symbols1, cdf_group_index, start_offset + channel_half, - per_channel_size); - } else { - auto vec_symbols0 = std::make_shared>(symbolSize); - memcpy(vec_symbols0->data(), symbols_ptr, symbolSize * sizeof(int8_t)); - m_encoder0->encode_z(vec_symbols0, cdf_group_index, start_offset, per_channel_size); +void RansEncoder::encode_y(const std::shared_ptr>& symbols, const int symbolSize) +{ + int n = m_entropy_coder_parallel; + int size0 = symbolSize / n; + for (int i = 0; i < n - 1; i++) { + m_encoders[i]->encode_y(symbols, size0, size0 * i); } + m_encoders[n - 1]->encode_y(symbols, symbolSize - size0 * (n - 1), size0 * (n - 1)); } -int RansEncoder::add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, - const py::array_t& offsets) +void RansEncoder::encode_y(const py::array_t& symbols) { - py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); - py::buffer_info offsets_buf = offsets.request(); - int32_t* cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); - int32_t* offsets_ptr = static_cast(offsets_buf.ptr); + py::buffer_info symbols_buf = symbols.request(); + int16_t* symbols_ptr = static_cast(symbols_buf.ptr); - int cdf_num = static_cast(cdfs_sizes.size()); - auto vec_cdfs_sizes = std::make_shared>(cdf_num); - memcpy(vec_cdfs_sizes->data(), cdfs_sizes_ptr, sizeof(int32_t) * cdf_num); - auto vec_offsets = std::make_shared>(offsets.size()); - memcpy(vec_offsets->data(), offsets_ptr, sizeof(int32_t) * offsets.size()); + int symbolSize = static_cast(symbols.size()); + auto vec_symbols = std::make_shared>(symbolSize); + std::copy(symbols_ptr, symbols_ptr + symbolSize, vec_symbols->data()); + encode_y(vec_symbols, symbolSize); +} - int per_vector_size = static_cast(cdfs.size() / cdf_num); - auto vec_cdfs = std::make_shared>>(cdf_num); - auto cdfs_raw = cdfs.unchecked<2>(); - for (int i = 0; i < cdf_num; i++) { - std::vector t(per_vector_size); - memcpy(t.data(), cdfs_raw.data(i, 0), sizeof(int32_t) * per_vector_size); - vec_cdfs->at(i) = t; +void RansEncoder::encode_z(const std::shared_ptr>& symbols, + const int cdf_offset, const int ch) +{ + int symbolSize = static_cast(symbols->size()); + int n = m_entropy_coder_parallel; + int size0 = symbolSize / n; + for (int i = 0; i < n - 1; i++) { + m_encoders[i]->encode_z(symbols, size0, size0 * i, cdf_offset, ch); } - - int cdf_idx = m_encoder0->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); - m_encoder1->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); - return cdf_idx; + m_encoders[n - 1]->encode_z(symbols, symbolSize - size0 * (n - 1), size0 * (n - 1), cdf_offset, ch); } -void RansEncoder::empty_cdf_buffer() +void RansEncoder::encode_z(const py::array_t& symbols, const int cdf_offset, const int ch) { - m_encoder0->empty_cdf_buffer(); - m_encoder1->empty_cdf_buffer(); + py::buffer_info symbols_buf = symbols.request(); + int8_t* symbols_ptr = static_cast(symbols_buf.ptr); + + int symbolSize = static_cast(symbols.size()); + auto vec_symbols = std::make_shared>(symbolSize); + std::copy(symbols_ptr, symbols_ptr + symbolSize, vec_symbols->data()); + encode_z(vec_symbols, cdf_offset, ch); } void RansEncoder::flush() { - m_encoder0->flush(); - m_encoder1->flush(); + int n = m_entropy_coder_parallel; + for (int i = 0; i < n; i++) { + m_encoders[i]->flush(); + } } py::array_t RansEncoder::get_encoded_stream() { - if (m_use_two_encoders) { - auto result0 = m_encoder0->get_encoded_stream(); - int nbytes0 = static_cast(result0->size()); - auto result1 = m_encoder1->get_encoded_stream(); - int nbytes1 = static_cast(result1->size()); - - int identical_bytes = 0; - int check_bytes = std::min(nbytes0, nbytes1); - check_bytes = std::min(check_bytes, 8); - for (int i = 0; i < check_bytes; i++) { - if (result0->at(nbytes0 - 1 - i) != 0) { - break; - } - if (result1->at(nbytes1 - 1 - i) != 0) { - break; - } - identical_bytes++; - } - if (identical_bytes == 0 && result0->at(nbytes0 - 1) == result1->at(nbytes1 - 1)) { - identical_bytes = 1; - } + int n = m_entropy_coder_parallel; + + // Collect all encoded streams + std::vector>> results(n); + std::vector nbytes(n); + for (int i = 0; i < n; i++) { + results[i] = m_encoders[i]->get_encoded_stream(); + nbytes[i] = static_cast(results[i]->size()); + } - py::array_t stream(nbytes0 + nbytes1 - identical_bytes); + if (n == 1) { + /** + * The input arguments to py::array_t constructor are array size and stride. + * The code may fail to perform correct encoding-decoding by omitting array stride. + * It would be more robust by explicitly specifying the stride. + * + * By only passing the array size, i.e., "py::array_t stream(nbytes0);", + * our empirical results are as follows: + * pybind11==3.0.1, numpy==2.3.3: succeeded + * pybind11==2.10.4, numpy==1.26.0: succeeded + * pybind11==2.10.4, numpy==2.3.3: failed. the array stride defaults to 0 + */ + py::array_t stream({ nbytes[0] }, { sizeof(uint8_t) }); py::buffer_info stream_buf = stream.request(); uint8_t* stream_ptr = static_cast(stream_buf.ptr); - - std::copy(result0->begin(), result0->end(), stream_ptr); - std::reverse_copy(result1->begin(), result1->end() - identical_bytes, stream_ptr + nbytes0); + std::copy(results[0]->begin(), results[0]->end(), stream_ptr); return stream; } - auto result0 = m_encoder0->get_encoded_stream(); - int nbytes0 = static_cast(result0->size()); + // For n >= 2, streams are paired: (0,1), (2,3), ... + // Each pair is merged: stream[2k] forward + stream[2k+1] reversed with zero-byte overlap. + // If n is odd, the last stream stands alone (forward only). + int num_pairs = n / 2; + bool has_tail = (n % 2 != 0); + + // Compute group sizes (each pair merged) and the tail + std::vector group_sizes(num_pairs); + std::vector identical(num_pairs); + for (int p = 0; p < num_pairs; p++) { + int i0 = p * 2; + int i1 = p * 2 + 1; + identical[p] = compute_identical_bytes(*results[i0], nbytes[i0], *results[i1], nbytes[i1]); + group_sizes[p] = nbytes[i0] + nbytes[i1] - identical[p]; + } + int tail_size = has_tail ? nbytes[n - 1] : 0; + + // Header: (num_pairs - 1 + has_tail) int32_t offsets + // For n==2 (1 pair, no tail): 0 offsets, no header + int num_offsets = num_pairs - 1 + (has_tail ? 1 : 0); + int header_size = num_offsets * 4; + + int total_size = header_size; + for (int p = 0; p < num_pairs; p++) { + total_size += group_sizes[p]; + } + total_size += tail_size; - py::array_t stream(nbytes0); + py::array_t stream({ total_size }, { sizeof(uint8_t) }); py::buffer_info stream_buf = stream.request(); uint8_t* stream_ptr = static_cast(stream_buf.ptr); - std::copy(result0->begin(), result0->end(), stream_ptr); + // Write header: cumulative offsets for groups after the first + // offset[k] = cumulative size of groups 0..k (so decoder knows where group k+1 starts) + int cumulative = group_sizes[0]; + for (int k = 0; k < num_offsets; k++) { + *reinterpret_cast(stream_ptr + k * 4) = cumulative; + if (k + 1 < num_pairs) { + cumulative += group_sizes[k + 1]; + } else { + // This offset points to the tail start (== total payload without header) + // Already correct: cumulative == sum of all group_sizes + } + } + + // Write groups + int pos = header_size; + for (int p = 0; p < num_pairs; p++) { + int i0 = p * 2; + int i1 = p * 2 + 1; + std::copy(results[i0]->begin(), results[i0]->end(), stream_ptr + pos); + std::reverse_copy(results[i1]->begin(), results[i1]->end() - identical[p], + stream_ptr + pos + nbytes[i0]); + pos += group_sizes[p]; + } + + // Write tail + if (has_tail) { + std::copy(results[n - 1]->begin(), results[n - 1]->end(), stream_ptr + pos); + } + return stream; } void RansEncoder::reset() { - m_encoder0->reset(); - m_encoder1->reset(); + for (int i = 0; i < MAX_EC_PARALLEL; i++) { + m_encoders[i]->reset(); + } +} + +void RansEncoder::set_cdf(const std::shared_ptr>& cdfs, + const std::shared_ptr>& cdfs_sizes, const int index) +{ + int cdf_num = static_cast(cdfs_sizes->size()); + int per_vector_size = static_cast(cdfs->size() / cdf_num); + auto max_value = std::make_shared>(cdf_num); + auto ransSymbols = std::make_shared>>(cdf_num); + for (int i = 0; i < cdf_num; i++) { + max_value->at(i) = static_cast(cdfs_sizes->at(i) - 2); + + const int32_t* cdf = cdfs->data() + i * per_vector_size; + std::vector ransSym(per_vector_size); + const int ransSize = per_vector_size - 1; + for (int j = 0; j < ransSize; j++) { + ransSym[j] = RansSymbol( + { static_cast(cdf[j]), static_cast(cdf[j + 1] - cdf[j]) }); + } + ransSymbols->at(i) = std::move(ransSym); + } + + for (int i = 0; i < MAX_EC_PARALLEL; i++) { + m_encoders[i]->set_cdf(ransSymbols, max_value, index); + } } -void RansEncoder::set_use_two_encoders(bool b) +void RansEncoder::set_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const int index) { - m_use_two_encoders = b; + py::buffer_info cdfs_buf = cdfs.request(); + py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); + int32_t* cdfs_ptr = static_cast(cdfs_buf.ptr); + int32_t* cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); + + auto vec_cdfs = std::make_shared>(cdfs.size()); + std::copy(cdfs_ptr, cdfs_ptr + cdfs.size(), vec_cdfs->data()); + auto vec_cdfs_sizes = std::make_shared>(cdfs_sizes.size()); + std::copy(cdfs_sizes_ptr, cdfs_sizes_ptr + cdfs_sizes.size(), vec_cdfs_sizes->data()); + + set_cdf(vec_cdfs, vec_cdfs_sizes, index); } -bool RansEncoder::get_use_two_encoders() +void RansEncoder::set_entropy_coder_parallel(int n) { - return m_use_two_encoders; + assert(n >= 1 && n <= MAX_EC_PARALLEL); + m_entropy_coder_parallel = n; } RansDecoder::RansDecoder() { - m_decoder0 = std::make_shared(); - m_decoder1 = std::make_shared(); + m_decoded_tensor = std::make_shared>(3840 * 2160 / 16 / 16 * 128 * 2); + m_decoders.resize(MAX_EC_PARALLEL); + for (int i = 0; i < MAX_EC_PARALLEL; i++) { + m_decoders[i] = std::make_shared(); + } } -void RansDecoder::set_stream(const py::array_t& encoded) +void RansDecoder::decode_y(const std::shared_ptr>& indexes, const int indexSize) { - py::buffer_info encoded_buf = encoded.request(); - const uint8_t* encoded_ptr = static_cast(encoded_buf.ptr); - const int encoded_size = static_cast(encoded.size()); - auto stream0 = std::make_shared>(encoded.size()); - std::copy(encoded_ptr, encoded_ptr + encoded_size, stream0->data()); - m_decoder0->set_stream(stream0); - if (m_use_two_decoders) { - auto stream1 = std::make_shared>(encoded.size()); - std::reverse_copy(encoded_ptr, encoded_ptr + encoded_size, stream1->data()); - m_decoder1->set_stream(stream1); + m_current_decoded_tensor_size = indexSize; + if (m_decoded_tensor == nullptr || static_cast(m_decoded_tensor->size()) < indexSize) { + m_decoded_tensor = std::make_shared>(indexSize * 2); + } + int8_t* decoded_ptr = m_decoded_tensor->data(); + + int n = m_entropy_coder_parallel; + int size0 = indexSize / n; + for (int i = 0; i < n - 1; i++) { + m_decoders[i]->decode_y(decoded_ptr, indexes, size0, size0 * i); } + m_decoders[n - 1]->decode_y(decoded_ptr, indexes, indexSize - size0 * (n - 1), size0 * (n - 1)); } -void RansDecoder::decode_y(const py::array_t& indexes, const int cdf_group_index) +void RansDecoder::decode_y(const py::array_t& indexes) { py::buffer_info indexes_buf = indexes.request(); uint8_t* indexes_ptr = static_cast(indexes_buf.ptr); int indexSize = static_cast(indexes.size()); - if (m_use_two_decoders) { - int indexSize0 = indexSize / 2; - int indexSize1 = indexSize - indexSize0; - - auto vec_indexes0 = std::make_shared>(indexSize0); - std::copy(indexes_ptr, indexes_ptr + indexSize0, vec_indexes0->data()); - m_decoder0->decode_y(vec_indexes0, cdf_group_index); - - auto vec_indexes1 = std::make_shared>(indexSize1); - std::copy(indexes_ptr + indexSize0, indexes_ptr + indexSize, vec_indexes1->data()); - m_decoder1->decode_y(vec_indexes1, cdf_group_index); - } else { - auto vec_indexes0 = std::make_shared>(indexSize); - std::copy(indexes_ptr, indexes_ptr + indexSize, vec_indexes0->data()); - m_decoder0->decode_y(vec_indexes0, cdf_group_index); - } + auto vec_indexes = std::make_shared>(indexSize); + std::copy(indexes_ptr, indexes_ptr + indexSize, vec_indexes->data()); + + decode_y(vec_indexes, indexSize); } -py::array_t RansDecoder::decode_and_get_y(const py::array_t& indexes, - const int cdf_group_index) +void RansDecoder::decode_z(const int total_size, const int cdf_offset, const int ch) { - decode_y(indexes, cdf_group_index); - return get_decoded_tensor(); + m_current_decoded_tensor_size = total_size; + if (m_decoded_tensor == nullptr || static_cast(m_decoded_tensor->size()) < total_size) { + m_decoded_tensor = std::make_shared>(total_size * 2); + } + int8_t* decoded_ptr = m_decoded_tensor->data(); + + int n = m_entropy_coder_parallel; + int size0 = total_size / n; + for (int i = 0; i < n - 1; i++) { + m_decoders[i]->decode_z(decoded_ptr, size0, size0 * i, cdf_offset, ch); + } + m_decoders[n - 1]->decode_z(decoded_ptr, total_size - size0 * (n - 1), size0 * (n - 1), + cdf_offset, ch); } -void RansDecoder::decode_z(const int total_size, const int cdf_group_index, const int start_offset, - const int per_channel_size) +std::shared_ptr> RansDecoder::get_decoded_tensor_cpp() { - if (m_use_two_decoders) { - int symbolSize0 = total_size / 2; - int symbolSize1 = total_size - symbolSize0; - int channel_half = symbolSize0 / per_channel_size; - m_decoder0->decode_z(symbolSize0, cdf_group_index, start_offset, per_channel_size); - m_decoder1->decode_z(symbolSize1, cdf_group_index, start_offset + channel_half, - per_channel_size); - } else { - m_decoder0->decode_z(total_size, cdf_group_index, start_offset, per_channel_size); + int n = m_entropy_coder_parallel; + for (int i = 0; i < n; i++) { + m_decoders[i]->wait_for_decoding_finish(); } + return m_decoded_tensor; } -py::array_t RansDecoder::get_decoded_tensor() +void RansDecoder::set_cdf(const std::shared_ptr>& cdfs, + const std::shared_ptr>& cdfs_sizes, const int index) { - if (m_use_two_decoders) { - auto result0 = m_decoder0->get_decoded_tensor(); - const int total_size0 = static_cast(result0->size()); + int cdf_num = static_cast(cdfs_sizes->size()); - auto result1 = m_decoder1->get_decoded_tensor(); - const int total_size1 = static_cast(result1->size()); - py::array_t output(total_size0 + total_size1); - py::buffer_info buf = output.request(); - int8_t* buf_ptr = static_cast(buf.ptr); - std::copy(result0->begin(), result0->end(), buf_ptr); - std::copy(result1->begin(), result1->end(), buf_ptr + total_size0); + int per_vector_size = static_cast(cdfs->size() / cdf_num); + auto vec_cdfs = std::make_shared>>(cdf_num); + auto max_value = std::make_shared>(cdf_num); + for (int i = 0; i < cdf_num; i++) { + max_value->at(i) = static_cast(cdfs_sizes->at(i) - 2); - return output; + std::vector t(per_vector_size); + std::copy(cdfs->data() + i * per_vector_size, + cdfs->data() + i * per_vector_size + per_vector_size, t.data()); + vec_cdfs->at(i) = std::move(t); } - auto result0 = m_decoder0->get_decoded_tensor(); - const int total_size0 = static_cast(result0->size()); - - py::array_t output(total_size0); - py::buffer_info buf = output.request(); - int8_t* buf_ptr = static_cast(buf.ptr); - std::copy(result0->begin(), result0->end(), buf_ptr); - - return output; + for (int i = 0; i < MAX_EC_PARALLEL; i++) { + m_decoders[i]->set_cdf(vec_cdfs, max_value, index); + } } -int RansDecoder::add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, - const py::array_t& offsets) +void RansDecoder::set_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const int index) { + py::buffer_info cdfs_buf = cdfs.request(); py::buffer_info cdfs_sizes_buf = cdfs_sizes.request(); - py::buffer_info offsets_buf = offsets.request(); + int32_t* cdfs_ptr = static_cast(cdfs_buf.ptr); int32_t* cdfs_sizes_ptr = static_cast(cdfs_sizes_buf.ptr); - int32_t* offsets_ptr = static_cast(offsets_buf.ptr); - int cdf_num = static_cast(cdfs_sizes.size()); - auto vec_cdfs_sizes = std::make_shared>(cdf_num); - memcpy(vec_cdfs_sizes->data(), cdfs_sizes_ptr, sizeof(int32_t) * cdf_num); - auto vec_offsets = std::make_shared>(offsets.size()); - memcpy(vec_offsets->data(), offsets_ptr, sizeof(int32_t) * offsets.size()); + auto vec_cdfs = std::make_shared>(cdfs.size()); + std::copy(cdfs_ptr, cdfs_ptr + cdfs.size(), vec_cdfs->data()); + auto vec_cdfs_sizes = std::make_shared>(cdfs_sizes.size()); + std::copy(cdfs_sizes_ptr, cdfs_sizes_ptr + cdfs_sizes.size(), vec_cdfs_sizes->data()); - int per_vector_size = static_cast(cdfs.size() / cdf_num); - auto vec_cdfs = std::make_shared>>(cdf_num); - auto cdfs_raw = cdfs.unchecked<2>(); - for (int i = 0; i < cdf_num; i++) { - std::vector t(per_vector_size); - memcpy(t.data(), cdfs_raw.data(i, 0), sizeof(int32_t) * per_vector_size); - vec_cdfs->at(i) = t; - } - int cdf_idx = m_decoder0->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); - m_decoder1->add_cdf(vec_cdfs, vec_cdfs_sizes, vec_offsets); - return cdf_idx; + set_cdf(vec_cdfs, vec_cdfs_sizes, index); } -void RansDecoder::empty_cdf_buffer() +void RansDecoder::set_entropy_coder_parallel(int n) { - m_decoder0->empty_cdf_buffer(); - m_decoder1->empty_cdf_buffer(); + assert(n >= 1 && n <= MAX_EC_PARALLEL); + m_entropy_coder_parallel = n; } -void RansDecoder::set_use_two_decoders(bool b) +void RansDecoder::set_stream(const uint8_t* ptr, const int size) { - m_use_two_decoders = b; -} + int n = m_entropy_coder_parallel; -bool RansDecoder::get_use_two_decoders() -{ - return m_use_two_decoders; -} - -std::vector pmf_to_quantized_cdf(const std::vector& pmf, int precision) -{ - /* NOTE(begaintj): ported from `ryg_rans` public implementation. Not optimal - * although it's only run once per model after training. See TF/compression - * implementation for an optimized version. */ + if (n == 1) { + auto stream0 = std::make_shared>(size); + std::copy(ptr, ptr + size, stream0->data()); + m_decoders[0]->set_stream(stream0); + return; + } - std::vector cdf(pmf.size() + 1); - cdf[0] = 0; /* freq 0 */ + if (n == 2) { + // No header, entire buffer is one pair + auto stream0 = std::make_shared>(size); + std::copy(ptr, ptr + size, stream0->data()); + m_decoders[0]->set_stream(stream0); - std::transform(pmf.begin(), pmf.end(), cdf.begin() + 1, [=](float p) { - return static_cast(std::round(p * (1 << precision)) + 0.5); - }); + auto stream1 = std::make_shared>(size); + std::reverse_copy(ptr, ptr + size, stream1->data()); + m_decoders[1]->set_stream(stream1); + return; + } - const uint32_t total = std::accumulate(cdf.begin(), cdf.end(), 0); + // n >= 3: header + groups + optional tail + int num_pairs = n / 2; + bool has_tail = (n % 2 != 0); + int num_offsets = num_pairs - 1 + (has_tail ? 1 : 0); + int header_size = num_offsets * 4; - std::transform(cdf.begin(), cdf.end(), cdf.begin(), [precision, total](uint32_t p) { - return static_cast((((1ull << precision) * p) / total)); - }); + // Read cumulative offsets + std::vector offsets(num_offsets); + for (int k = 0; k < num_offsets; k++) { + offsets[k] = *reinterpret_cast(ptr + k * 4); + } - std::partial_sum(cdf.begin(), cdf.end(), cdf.begin()); - cdf.back() = 1 << precision; + // Compute group start/end positions (relative to after header) + const uint8_t* payload = ptr + header_size; + int payload_size = size - header_size; + + std::vector group_start(num_pairs); + std::vector group_size(num_pairs); + group_start[0] = 0; + group_size[0] = offsets[0]; // first offset == size of first group + for (int p = 1; p < num_pairs; p++) { + group_start[p] = offsets[p - 1]; + if (p < num_offsets) { + group_size[p] = offsets[p] - offsets[p - 1]; + } else { + // Last group: extends to end of payload (or to tail start) + int groups_end = has_tail ? offsets[num_offsets - 1] : payload_size; + group_size[p] = groups_end - offsets[p - 1]; + } + } - for (int i = 0; i < static_cast(cdf.size() - 1); ++i) { - if (cdf[i] == cdf[i + 1]) { - /* Try to steal frequency from low-frequency symbols */ - uint32_t best_freq = ~0u; - int best_steal = -1; - for (int j = 0; j < static_cast(cdf.size()) - 1; ++j) { - uint32_t freq = cdf[j + 1] - cdf[j]; - if (freq > 1 && freq < best_freq) { - best_freq = freq; - best_steal = j; - } - } + // Set streams for each pair + for (int p = 0; p < num_pairs; p++) { + int i0 = p * 2; + int i1 = p * 2 + 1; + const uint8_t* group_ptr = payload + group_start[p]; + int gs = group_size[p]; - assert(best_steal != -1); + auto s0 = std::make_shared>(gs); + std::copy(group_ptr, group_ptr + gs, s0->data()); + m_decoders[i0]->set_stream(s0); - if (best_steal < i) { - for (int j = best_steal + 1; j <= i; ++j) { - cdf[j]--; - } - } else { - assert(best_steal > i); - for (int j = i + 1; j <= best_steal; ++j) { - cdf[j]++; - } - } - } + auto s1 = std::make_shared>(gs); + std::reverse_copy(group_ptr, group_ptr + gs, s1->data()); + m_decoders[i1]->set_stream(s1); } - assert(cdf[0] == 0); - assert(cdf.back() == (1u << precision)); - for (int i = 0; i < static_cast(cdf.size()) - 1; ++i) { - assert(cdf[i + 1] > cdf[i]); - } + // Tail + if (has_tail) { + int tail_start = offsets[num_offsets - 1]; + int tail_size = payload_size - tail_start; + const uint8_t* tail_ptr = payload + tail_start; - return cdf; + auto s = std::make_shared>(tail_size); + std::copy(tail_ptr, tail_ptr + tail_size, s->data()); + m_decoders[n - 1]->set_stream(s); + } } -PYBIND11_MODULE(MLCodec_extensions_cpp, m) +void RansDecoder::set_stream(const py::array_t& encoded) { - py::class_(m, "RansEncoder") - .def(py::init<>()) - .def("encode_y", &RansEncoder::encode_y) - .def("encode_z", &RansEncoder::encode_z) - .def("flush", &RansEncoder::flush) - .def("get_encoded_stream", &RansEncoder::get_encoded_stream) - .def("reset", &RansEncoder::reset) - .def("add_cdf", &RansEncoder::add_cdf) - .def("empty_cdf_buffer", &RansEncoder::empty_cdf_buffer) - .def("set_use_two_encoders", &RansEncoder::set_use_two_encoders) - .def("get_use_two_encoders", &RansEncoder::get_use_two_encoders); - - py::class_(m, "RansDecoder") - .def(py::init<>()) - .def("set_stream", &RansDecoder::set_stream) - .def("decode_y", &RansDecoder::decode_y) - .def("decode_and_get_y", &RansDecoder::decode_and_get_y) - .def("decode_z", &RansDecoder::decode_z) - .def("get_decoded_tensor", &RansDecoder::get_decoded_tensor) - .def("add_cdf", &RansDecoder::add_cdf) - .def("empty_cdf_buffer", &RansDecoder::empty_cdf_buffer) - .def("set_use_two_decoders", &RansDecoder::set_use_two_decoders) - .def("get_use_two_decoders", &RansDecoder::get_use_two_decoders); - - m.def("pmf_to_quantized_cdf", &pmf_to_quantized_cdf, "Return quantized CDF for a given PMF"); + py::buffer_info encoded_buf = encoded.request(); + const uint8_t* encoded_ptr = static_cast(encoded_buf.ptr); + const int encoded_size = static_cast(encoded.size()); + set_stream(encoded_ptr, encoded_size); } diff --git a/src/cpp/py_rans/py_rans.h b/src/cpp/py_rans/py_rans.h index c7d223a..5fe733a 100644 --- a/src/cpp/py_rans/py_rans.h +++ b/src/cpp/py_rans/py_rans.h @@ -4,6 +4,7 @@ #pragma once #include "rans.h" #include +#include #include #include @@ -11,6 +12,10 @@ namespace py = pybind11; +constexpr int MAX_EC_PARALLEL = 8; + +std::vector pmf_to_quantized_cdf(const std::vector& pmf); + // the classes in this file only perform the type conversion // from python type (numpy) to C++ type (vector) class RansEncoder { @@ -22,22 +27,24 @@ class RansEncoder { RansEncoder& operator=(const RansEncoder&) = delete; RansEncoder& operator=(RansEncoder&&) = delete; - void encode_y(const py::array_t& symbols, const int cdf_group_index); - void encode_z(const py::array_t& symbols, const int cdf_group_index, - const int start_offset, const int per_channel_size); + // symbols may contain more elements than symbolSize + void encode_y(const std::shared_ptr>& symbols, const int symbolSize); + void encode_y(const py::array_t& symbols); + void encode_z(const std::shared_ptr>& symbols, const int cdf_offset, + const int ch); + void encode_z(const py::array_t& symbols, const int cdf_offset, const int ch); void flush(); py::array_t get_encoded_stream(); void reset(); - int add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, - const py::array_t& offsets); - void empty_cdf_buffer(); - void set_use_two_encoders(bool b); - bool get_use_two_encoders(); + void set_cdf(const std::shared_ptr>& cdfs, + const std::shared_ptr>& cdfs_sizes, const int index); + void set_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const int index); + void set_entropy_coder_parallel(int n); private: - std::shared_ptr m_encoder0; - std::shared_ptr m_encoder1; - bool m_use_two_encoders{ false }; + std::vector> m_encoders; + int m_entropy_coder_parallel{ 1 }; }; class RansDecoder { @@ -49,23 +56,23 @@ class RansDecoder { RansDecoder& operator=(const RansDecoder&) = delete; RansDecoder& operator=(RansDecoder&&) = delete; + void decode_y(const std::shared_ptr>& indexes, const int indexSize); + void decode_y(const py::array_t& indexes); + // if is_stream_nhmw, ch is channel number + // otherwise, ch is per channel element number + void decode_z(const int total_size, const int cdf_offset, const int ch); + std::shared_ptr> get_decoded_tensor_cpp(); + void set_cdf(const std::shared_ptr>& cdfs, + const std::shared_ptr>& cdfs_sizes, const int index); + void set_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, + const int index); + void set_entropy_coder_parallel(int n); void set_stream(const py::array_t&); - - void decode_y(const py::array_t& indexes, const int cdf_group_index); - py::array_t decode_and_get_y(const py::array_t& indexes, const int cdf_group_index); - void decode_z(const int total_size, const int cdf_group_index, const int start_offset, - const int per_channel_size); - py::array_t get_decoded_tensor(); - int add_cdf(const py::array_t& cdfs, const py::array_t& cdfs_sizes, - const py::array_t& offsets); - void empty_cdf_buffer(); - void set_use_two_decoders(bool b); - bool get_use_two_decoders(); + void set_stream(const uint8_t* ptr, const int size); private: - std::shared_ptr m_decoder0; - std::shared_ptr m_decoder1; - bool m_use_two_decoders{ false }; + std::shared_ptr> m_decoded_tensor; + int m_current_decoded_tensor_size{ 0 }; + std::vector> m_decoders; + int m_entropy_coder_parallel{ 1 }; }; - -std::vector pmf_to_quantized_cdf(const std::vector& pmf, int precision); diff --git a/src/cpp/py_rans/rans.cpp b/src/cpp/py_rans/rans.cpp index 11eb342..75ffc29 100644 --- a/src/cpp/py_rans/rans.cpp +++ b/src/cpp/py_rans/rans.cpp @@ -1,134 +1,175 @@ -/* Copyright 2020 InterDigital Communications, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Rans64 extensions from: - * https://fgiesen.wordpress.com/2015/12/21/rans-in-practice/ - * Unbounded range coding from: - * https://github.com/tensorflow/compression/blob/master/tensorflow_compression/cc/kernels/unbounded_index_range_coding_kernels.cc - **/ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. #include "rans.h" #include #include +#include #include - -constexpr uint16_t bypass_precision = 2; /* number of bits in bypass mode */ -constexpr uint16_t max_bypass_val = (1 << bypass_precision) - 1; - -inline void RansEncPutBits(RansState& r, uint8_t*& ptr, uint32_t val) -{ - RansAssert(bypass_precision <= 8); - RansAssert(val < (1u << bypass_precision)); - - constexpr uint32_t freq = 1 << (SCALE_BITS - bypass_precision); - constexpr uint32_t x_max = freq << ENC_RENORM_SHIFT_BITS; - while (r >= x_max) { - *(--ptr) = static_cast(r & 0xff); - r >>= 8; +#include +#include + +constexpr int SCALE_BITS = 16; +constexpr int RANS_SHIFT_BITS = 23; +constexpr uint32_t RANS_BYTE_L = 1u << RANS_SHIFT_BITS; +constexpr int ENC_RENORM_SHIFT_BITS = RANS_SHIFT_BITS - SCALE_BITS + 8; +constexpr uint32_t DEC_MASK = (1u << SCALE_BITS) - 1; +constexpr uint16_t BYPASS_PRECISION = 2; // number of bits in bypass mode +constexpr uint16_t MAX_BYPASS_VAL = (1 << BYPASS_PRECISION) - 1; + +#if defined(__GNUC__) || defined(__clang__) + #define FORCE_INLINE inline __attribute__((always_inline)) +#elif defined(_MSC_VER) + #define FORCE_INLINE __forceinline +#else + #define FORCE_INLINE inline +#endif + +FORCE_INLINE void RansDecAdvance(RansState& r, const uint8_t*& ptr, uint32_t start, uint32_t freq) +{ + r = freq * (r >> SCALE_BITS) + (r & DEC_MASK) - start; + + // renormalize + while (r < RANS_BYTE_L) { + r = (r << 8) | *ptr++; } +} - r = (r << bypass_precision) | val; +FORCE_INLINE int32_t RansDecGet(RansState& r) +{ + return r & DEC_MASK; } -inline uint32_t RansDecGetBits(RansState& r, uint8_t*& ptr) +FORCE_INLINE uint32_t RansDecGetBits(RansState& r, const uint8_t*& ptr) { - uint32_t val = r & ((1u << bypass_precision) - 1); + uint32_t val = r & ((1u << BYPASS_PRECISION) - 1); - /* Re-normalize */ - r = r >> bypass_precision; + // renormalize + r = r >> BYPASS_PRECISION; if (r < RANS_BYTE_L) { r = (r << 8) | *ptr++; - RansAssert(r >= RANS_BYTE_L); + assert(r >= RANS_BYTE_L); } return val; } -RansEncoderLib::RansEncoderLib() +FORCE_INLINE void RansDecInit(RansState& r, const uint8_t*& ptr) +{ + r = (*ptr++) << 0; + r |= (*ptr++) << 8; + r |= (*ptr++) << 16; + r |= (*ptr++) << 24; +} + +FORCE_INLINE void RansEncFlush(const RansState& r, uint8_t*& ptr) { - _stream = std::make_shared>(); + ptr -= 4; + ptr[0] = static_cast(r >> 0); + ptr[1] = static_cast(r >> 8); + ptr[2] = static_cast(r >> 16); + ptr[3] = static_cast(r >> 24); } -int RansEncoderLib::add_cdf(const std::shared_ptr>> cdfs, - const std::shared_ptr> cdfs_sizes, - const std::shared_ptr> offsets) +FORCE_INLINE void RansEncInit(RansState& r) { + r = RANS_BYTE_L; +} - auto ransSymbols = std::make_shared>>(cdfs->size()); - for (int i = 0; i < static_cast(cdfs->size()); i++) { - const int32_t* cdf = cdfs->at(i).data(); - std::vector ransSym(cdfs->at(i).size()); - const int ransSize = static_cast(ransSym.size() - 1); - for (int j = 0; j < ransSize; j++) { - ransSym[j] = RansSymbol( - { static_cast(cdf[j]), static_cast(cdf[j + 1] - cdf[j]) }); - } - ransSymbols->at(i) = ransSym; +FORCE_INLINE void RansEncPut(RansState& r, uint8_t*& ptr, uint32_t start, uint32_t freq) +{ + // renormalize + const uint32_t r_max = freq << ENC_RENORM_SHIFT_BITS; + while (r >= r_max) { + // converting to uint8_t will only keep the lowest 8 bits, equal to r & 0xff + *(--ptr) = static_cast(r); + r >>= 8; } - _ransSymbols.push_back(ransSymbols); - _cdfs_sizes.push_back(cdfs_sizes); - _offsets.push_back(offsets); - return static_cast(_ransSymbols.size()) - 1; + r = ((r / freq) << SCALE_BITS) + (r % freq) + start; } -void RansEncoderLib::empty_cdf_buffer() +FORCE_INLINE void RansEncPutBits(RansState& r, uint8_t*& ptr, uint32_t val) { - _ransSymbols.clear(); - _cdfs_sizes.clear(); - _offsets.clear(); + static_assert(BYPASS_PRECISION <= 8); + assert(val < (1u << BYPASS_PRECISION)); + + constexpr uint32_t freq = 1 << (SCALE_BITS - BYPASS_PRECISION); + constexpr uint32_t x_max = freq << ENC_RENORM_SHIFT_BITS; + while (r >= x_max) { + *(--ptr) = static_cast(r); + r >>= 8; + } + + r = (r << BYPASS_PRECISION) | val; } -FORCE_INLINE void RansEncoderLib::encode_one_symbol(uint8_t*& ptr, RansState& rans, const int32_t symbol, - const int32_t cdf_size, const int32_t offset, - const std::vector& ransSymbols) +FORCE_INLINE int8_t decode_one_symbol(const uint8_t*& ptr8, RansState& rans, const int32_t* cdf, + const int8_t max_value) { - const int32_t max_value = cdf_size - 2; - int32_t value = symbol - offset; + const int32_t cum_freq = RansDecGet(rans); - uint32_t raw_val = 0; - if (value < 0) { - raw_val = -2 * value - 1; - value = max_value; - } else if (value >= max_value) { - raw_val = 2 * (value - max_value); - value = max_value; + int s = 1; + while (cdf[s] <= cum_freq) { + s++; } + s--; + + RansDecAdvance(rans, ptr8, cdf[s], cdf[s + 1] - cdf[s]); + + int32_t value = static_cast(s); if (value == max_value) { + // Bypass decoding mode + int32_t val = RansDecGetBits(rans, ptr8); + int32_t n_bypass = val; + + while (val == MAX_BYPASS_VAL) { + val = RansDecGetBits(rans, ptr8); + n_bypass += val; + } + + int32_t raw_val = 0; + for (int j = 0; j < n_bypass; ++j) { + val = RansDecGetBits(rans, ptr8); + raw_val |= val << (j * BYPASS_PRECISION); + } + value = raw_val + max_value; + } + + return static_cast((value % 2 == 1) ? (value + 1) / 2 : -(value + 1) / 2); +} + +FORCE_INLINE void encode_one_symbol(uint8_t*& ptr, RansState& rans, const int32_t symbol, + const int8_t max_value, const std::vector& ransSymbols) +{ + int32_t value = abs(symbol) * 2 - (symbol > 0); + + if (value >= max_value) { + const uint32_t raw_val = value - max_value; + value = max_value; + std::vector bypassBins; bypassBins.reserve(20); - /* Determine the number of bypasses (in bypass_precision size) needed to - * encode the raw value. */ + // Determine the number of bypasses (in BYPASS_PRECISION size) + // needed to encode the raw value. int32_t n_bypass = 0; - while ((raw_val >> (n_bypass * bypass_precision)) != 0) { + while ((raw_val >> (n_bypass * BYPASS_PRECISION)) != 0) { ++n_bypass; } - /* Encode number of bypasses */ + // Encode number of bypasses int32_t val = n_bypass; - while (val >= max_bypass_val) { - bypassBins.push_back(max_bypass_val); - val -= max_bypass_val; + while (val >= MAX_BYPASS_VAL) { + bypassBins.push_back(MAX_BYPASS_VAL); + val -= MAX_BYPASS_VAL; } bypassBins.push_back(static_cast(val)); - /* Encode raw value */ + // Encode raw value for (int32_t j = 0; j < n_bypass; ++j) { - const int32_t val1 = (raw_val >> (j * bypass_precision)) & max_bypass_val; + const int32_t val1 = (raw_val >> (j * BYPASS_PRECISION)) & MAX_BYPASS_VAL; bypassBins.push_back(static_cast(val1)); } @@ -139,184 +180,189 @@ FORCE_INLINE void RansEncoderLib::encode_one_symbol(uint8_t*& ptr, RansState& ra RansEncPut(rans, ptr, ransSymbols[value].start, ransSymbols[value].range); } -void RansEncoderLib::encode_y(const std::shared_ptr> symbols, - const int cdf_group_index) +RansEncoderLib::RansEncoderLib() { - PendingTask p; - p.workType = WorkType::EncodeDecodeY; - p.symbols_y = symbols; - p.cdf_group_index = cdf_group_index; - m_pendingEncodingList.push_back(p); + m_ransSymbols.resize(2); + m_max_value.resize(2); + m_stream_buffer = new uint8_t[max_stream_buffer_size]; + m_stream = std::make_shared>(); + m_thread = std::thread(&RansEncoderLib::worker, this); } -void RansEncoderLib::encode_z(const std::shared_ptr> symbols, - const int cdf_group_index, const int start_offset, - const int per_channel_size) -{ - PendingTask p; - p.workType = WorkType::EncodeDecodeZ; - p.symbols_z = symbols; - p.cdf_group_index = cdf_group_index; - p.start_offset = start_offset; - p.per_channel_size = per_channel_size; - m_pendingEncodingList.push_back(p); -} -#include -FORCE_INLINE void RansEncoderLib::encode_y_internal(uint8_t*& ptr, RansState& rans, - const std::shared_ptr> symbols, - const int cdf_group_index) +RansEncoderLib::~RansEncoderLib() { - // backward loop on symbols from the end; - const int16_t* symbols_ptr = symbols->data(); - const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); - const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); - const int symbol_size = static_cast(symbols->size()); + { + std::lock_guard lk(m_mutex_pending); + m_finish = true; + } + m_cv_pending.notify_all(); + if (m_thread.joinable()) { + m_thread.join(); + } - for (int i = symbol_size - 1; i >= 0; i--) { - const int32_t combined_symbol = symbols_ptr[i]; - const int32_t cdf_idx = combined_symbol & 0xff; - const int32_t s = combined_symbol >> 8; - encode_one_symbol(ptr, rans, s, cdfs_sizes_ptr[cdf_idx], offsets_ptr[cdf_idx], - _ransSymbols[cdf_group_index]->at(cdf_idx)); + if (m_stream_buffer != nullptr) { + delete[] m_stream_buffer; + m_stream_buffer = nullptr; } } -FORCE_INLINE void RansEncoderLib::encode_z_internal(uint8_t*& ptr, RansState& rans, - const std::shared_ptr> symbols, - const int cdf_group_index, const int start_offset, - const int per_channel_size) +void RansEncoderLib::check_buffer_capacity(int symbol_count) { - // backward loop on symbols from the end; - const int8_t* symbols_ptr = symbols->data(); - const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); - const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); - const int symbol_size = static_cast(symbols->size()); - - for (int i = symbol_size - 1; i >= 0; i--) { - const int32_t cdf_idx = i / per_channel_size + start_offset; - encode_one_symbol(ptr, rans, symbols_ptr[i], cdfs_sizes_ptr[cdf_idx], offsets_ptr[cdf_idx], - _ransSymbols[cdf_group_index]->at(cdf_idx)); + // Conservative upper bound: each symbol can emit up to 4 bytes (3 bytes renorm + overhead). + // The flush at the end writes 4 bytes for the final state. + const int required_bytes = symbol_count * 4 + 4; + const int remaining_bytes = static_cast(m_ptr - m_stream_buffer); + if (remaining_bytes < required_bytes) { + throw std::runtime_error("rANS buffer overflow: encoding " + std::to_string(symbol_count) + + " symbols requires up to " + std::to_string(required_bytes) + + " bytes, but only " + std::to_string(remaining_bytes) + + " bytes remain in the buffer (capacity: " + + std::to_string(max_stream_buffer_size) + ")"); } } -void RansEncoderLib::flush() +void RansEncoderLib::encode_y(const std::shared_ptr>& symbols, + const int symbol_size, const int symbol_offset) { - RansState rans; - RansEncInit(rans); - - int32_t total_symbol_size = 0; - for (auto it = m_pendingEncodingList.begin(); it != m_pendingEncodingList.end(); it++) { - if (it->workType == WorkType::EncodeDecodeY) { - total_symbol_size += static_cast(it->symbols_y->size()); - } else if (it->workType == WorkType::EncodeDecodeZ) { - total_symbol_size += static_cast(it->symbols_z->size()); - } - } - - if (total_symbol_size == 0) { - _stream->resize(0); - return; - } - - uint8_t* output = new uint8_t[total_symbol_size]; // too much space ? - uint8_t* ptrEnd = output + total_symbol_size; - uint8_t* ptr = ptrEnd; - assert(ptr != nullptr); - - for (auto it = m_pendingEncodingList.rbegin(); it != m_pendingEncodingList.rend(); it++) { - PendingTask p = *it; - if (p.workType == WorkType::EncodeDecodeY) { - encode_y_internal(ptr, rans, p.symbols_y, p.cdf_group_index); - } else if (p.workType == WorkType::EncodeDecodeZ) { - encode_z_internal(ptr, rans, p.symbols_z, p.cdf_group_index, p.start_offset, - p.per_channel_size); - } + PendingTask p; + p.workType = WorkType::EncodeDecodeY; + p.symbols_y = symbols; + p.symbol_size = symbol_size; + p.symbol_offset = symbol_offset; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push(std::move(p)); } + m_cv_pending.notify_one(); +} - RansEncFlush(rans, ptr); +void RansEncoderLib::encode_y_internal(const std::shared_ptr>& symbols, + const int symbol_size, const int symbol_offset) +{ + check_buffer_capacity(symbol_size); - const int nbytes = static_cast(std::distance(ptr, ptrEnd)); + // backward loop on symbols from the end; + const int16_t* symbols_ptr = symbols->data(); + const int8_t* max_value_ptr = m_max_value[1]->data(); + const std::vector* ransSymbols_ptr = m_ransSymbols[1]->data(); + const int symbol_start = symbol_offset; + const int symbol_end = symbol_offset + symbol_size - 1; - _stream->resize(nbytes); - memcpy(_stream->data(), ptr, nbytes); - delete[] output; + for (int i = symbol_end; i >= symbol_start; i--) { + const int16_t combined_symbol = symbols_ptr[i]; + const int32_t cdf_idx = combined_symbol & 0xff; + const int32_t s = static_cast(combined_symbol >> 8); + encode_one_symbol(m_ptr, m_rans, s, max_value_ptr[cdf_idx], ransSymbols_ptr[cdf_idx]); + } } -std::shared_ptr> RansEncoderLib::get_encoded_stream() +void RansEncoderLib::encode_z(const std::shared_ptr>& symbols, const int symbol_size, + const int symbol_offset, const int cdf_offset, const int ch) { - return _stream; + PendingTask p; + p.workType = WorkType::EncodeDecodeZ; + p.symbols_z = symbols; + p.symbol_size = symbol_size; + p.symbol_offset = symbol_offset; + p.cdf_offset = cdf_offset; + p.ch = ch; + { + std::unique_lock lk(m_mutex_pending); + m_pending.push(std::move(p)); + } + m_cv_pending.notify_one(); } -void RansEncoderLib::reset() +void RansEncoderLib::encode_z_internal(const std::shared_ptr>& symbols, + const int symbol_size, const int symbol_offset, + const int cdf_offset, const int ch) { - m_pendingEncodingList.clear(); - _stream->clear(); -} + check_buffer_capacity(symbol_size); -RansEncoderLibMultiThread::RansEncoderLibMultiThread() - : RansEncoderLib() - , m_finish(false) - , m_result_ready(false) -{ - m_thread = std::thread(&RansEncoderLibMultiThread::worker, this); -} -RansEncoderLibMultiThread::~RansEncoderLibMultiThread() -{ - { - std::lock_guard lk(m_mutex_pending); - std::lock_guard lk1(m_mutex_result); - m_finish = true; + // backward loop on symbols from the end; + const int8_t* symbols_ptr = symbols->data(); + const int8_t* max_value_ptr = m_max_value[0]->data(); + const std::vector* ransSymbols_ptr = m_ransSymbols[0]->data(); + const int symbol_start = symbol_offset; + const int symbol_end = symbol_offset + symbol_size - 1; + + for (int i = symbol_end; i >= symbol_start; i--) { + const int32_t cdf_idx = (i % ch) + cdf_offset; + encode_one_symbol(m_ptr, m_rans, symbols_ptr[i], max_value_ptr[cdf_idx], + ransSymbols_ptr[cdf_idx]); } - m_cv_pending.notify_one(); - m_cv_result.notify_one(); - m_thread.join(); } -void RansEncoderLibMultiThread::flush() +void RansEncoderLib::flush() { PendingTask p; p.workType = WorkType::Flush; { std::unique_lock lk(m_mutex_pending); - m_pending.push_back(p); + m_pending.push(std::move(p)); } m_cv_pending.notify_one(); } -std::shared_ptr> RansEncoderLibMultiThread::get_encoded_stream() +std::shared_ptr> RansEncoderLib::get_encoded_stream() { std::unique_lock lk(m_mutex_result); m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); - return RansEncoderLib::get_encoded_stream(); + return m_stream; } -void RansEncoderLibMultiThread::reset() +void RansEncoderLib::reset() { - RansEncoderLib::reset(); + m_stream->clear(); + + RansEncInit(m_rans); + + uint8_t* ptrEnd = m_stream_buffer + max_stream_buffer_size; + m_ptr = ptrEnd; + std::lock_guard lk(m_mutex_result); m_result_ready = false; } -void RansEncoderLibMultiThread::worker() +void RansEncoderLib::set_cdf(const std::shared_ptr>>& ransSymbols, + const std::shared_ptr>& max_value, const int index) +{ + assert(index < 2); + m_ransSymbols[index] = ransSymbols; + m_max_value[index] = max_value; +} + +void RansEncoderLib::worker() { while (!m_finish) { std::unique_lock lk(m_mutex_pending); - m_cv_pending.wait(lk, [this] { return m_pending.size() > 0 || m_finish; }); + m_cv_pending.wait(lk, [this] { return !m_pending.empty() || m_finish; }); if (m_finish) { - lk.unlock(); break; } - if (m_pending.size() == 0) { - lk.unlock(); - // std::cout << "contine in worker" << std::endl; - continue; - } - while (m_pending.size() > 0) { - auto p = m_pending.front(); - m_pending.pop_front(); + while (!m_pending.empty()) { + auto p = std::move(m_pending.front()); + m_pending.pop(); lk.unlock(); - if (p.workType == WorkType::Flush) { - RansEncoderLib::flush(); + if (p.workType == WorkType::EncodeDecodeY) { + RansEncoderLib::encode_y_internal(p.symbols_y, p.symbol_size, p.symbol_offset); + } else if (p.workType == WorkType::EncodeDecodeZ) { + RansEncoderLib::encode_z_internal(p.symbols_z, p.symbol_size, p.symbol_offset, + p.cdf_offset, p.ch); + } else if (p.workType == WorkType::Flush) { + RansEncFlush(m_rans, m_ptr); + + uint8_t* ptrEnd = m_stream_buffer + max_stream_buffer_size; + const int nbytes = static_cast(std::distance(m_ptr, ptrEnd)); + + if (m_ptr < m_stream_buffer || nbytes > max_stream_buffer_size) { + throw std::runtime_error("rANS stream buffer overflow: encoded size (" + + std::to_string(nbytes) + ") exceeds buffer capacity (" + + std::to_string(max_stream_buffer_size) + ")"); + } + + m_stream->resize(nbytes); + std::copy(m_ptr, m_ptr + nbytes, m_stream->data()); { std::lock_guard lk_result(m_mutex_result); m_result_ready = true; @@ -329,132 +375,27 @@ void RansEncoderLibMultiThread::worker() } } -void RansDecoderLib::set_stream(const std::shared_ptr> encoded) -{ - _stream = encoded; - _ptr8 = (uint8_t*)(_stream->data()); - RansDecInit(_rans, _ptr8); -} - -int RansDecoderLib::add_cdf(const std::shared_ptr>> cdfs, - const std::shared_ptr> cdfs_sizes, - const std::shared_ptr> offsets) -{ - _cdfs.push_back(cdfs); - _cdfs_sizes.push_back(cdfs_sizes); - _offsets.push_back(offsets); - return static_cast(_cdfs.size()) - 1; -} - -void RansDecoderLib::empty_cdf_buffer() -{ - _cdfs.clear(); - _cdfs_sizes.clear(); - _offsets.clear(); -} - -FORCE_INLINE int8_t RansDecoderLib::decode_one_symbol(const int32_t* cdf, const int32_t cdf_size, - const int32_t offset) -{ - const int32_t max_value = cdf_size - 2; - const int32_t cum_freq = static_cast(RansDecGet(_rans)); - - int s = 1; - while (cdf[s++] <= cum_freq) { - } - s -= 2; - - RansDecAdvance(_rans, _ptr8, cdf[s], cdf[s + 1] - cdf[s]); - - int32_t value = static_cast(s); - - if (value == max_value) { - /* Bypass decoding mode */ - int32_t val = RansDecGetBits(_rans, _ptr8); - int32_t n_bypass = val; - - while (val == max_bypass_val) { - val = RansDecGetBits(_rans, _ptr8); - n_bypass += val; - } - - int32_t raw_val = 0; - for (int j = 0; j < n_bypass; ++j) { - val = RansDecGetBits(_rans, _ptr8); - raw_val |= val << (j * bypass_precision); - } - value = raw_val >> 1; - if (raw_val & 1) { - value = -value - 1; - } else { - value += max_value; - } - } - - return static_cast(value + offset); -} - -void RansDecoderLib::decode_y(const std::shared_ptr> indexes, - const int cdf_group_index) -{ - int index_size = static_cast(indexes->size()); - m_decoded = std::make_shared>(index_size); - - int8_t* outout_ptr = m_decoded->data(); - const uint8_t* indexes_ptr = indexes->data(); - const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); - const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); - const auto& cdfs = _cdfs[cdf_group_index]; - for (int i = 0; i < index_size; ++i) { - const int32_t cdf_idx = indexes_ptr[i]; - outout_ptr[i] = decode_one_symbol(cdfs->at(cdf_idx).data(), cdfs_sizes_ptr[cdf_idx], - offsets_ptr[cdf_idx]); - } -} - -void RansDecoderLib::decode_z(const int total_size, const int cdf_group_index, - const int start_offset, const int per_channel_size) -{ - m_decoded = std::make_shared>(total_size); - - int8_t* outout_ptr = m_decoded->data(); - const int32_t* cdfs_sizes_ptr = _cdfs_sizes[cdf_group_index]->data(); - const int32_t* offsets_ptr = _offsets[cdf_group_index]->data(); - const auto& cdfs = _cdfs[cdf_group_index]; - for (int i = 0; i < total_size; ++i) { - const int32_t cdf_idx = i / per_channel_size + start_offset; - outout_ptr[i] = decode_one_symbol(cdfs->at(cdf_idx).data(), cdfs_sizes_ptr[cdf_idx], - offsets_ptr[cdf_idx]); - } -} - -std::shared_ptr> RansDecoderLib::get_decoded_tensor() +RansDecoderLib::RansDecoderLib() { - return m_decoded; + m_cdfs.resize(2); + m_max_value.resize(2); + m_thread = std::thread(&RansDecoderLib::worker, this); } -RansDecoderLibMultiThread::RansDecoderLibMultiThread() - : RansDecoderLib() - , m_finish(false) - , m_result_ready(false) -{ - m_thread = std::thread(&RansDecoderLibMultiThread::worker, this); -} - -RansDecoderLibMultiThread::~RansDecoderLibMultiThread() +RansDecoderLib::~RansDecoderLib() { { std::lock_guard lk(m_mutex_pending); - std::lock_guard lk1(m_mutex_result); m_finish = true; } - m_cv_pending.notify_one(); - m_cv_result.notify_one(); - m_thread.join(); + m_cv_pending.notify_all(); + if (m_thread.joinable()) { + m_thread.join(); + } } -void RansDecoderLibMultiThread::decode_y(const std::shared_ptr> indexes, - const int cdf_group_index) +void RansDecoderLib::decode_y(int8_t* decoded_ptr, const std::shared_ptr>& indexes, + const int symbol_size, const int symbol_offset) { { std::lock_guard lk(m_mutex_result); @@ -463,16 +404,32 @@ void RansDecoderLibMultiThread::decode_y(const std::shared_ptr lk(m_mutex_pending); - m_pending.push_back(p); + m_pending.push(std::move(p)); } m_cv_pending.notify_one(); } -void RansDecoderLibMultiThread::decode_z(const int total_size, const int cdf_group_index, - const int start_offset, const int per_channel_size) +void RansDecoderLib::decode_y_internal(int8_t* decoded_ptr, + const std::shared_ptr>& indexes, + const int symbol_size, const int symbol_offset) +{ + const uint8_t* indexes_ptr = indexes->data(); + const int8_t* max_value_ptr = m_max_value[1]->data(); + const std::vector* cdfs = m_cdfs[1]->data(); + for (int i = 0; i < symbol_size; ++i) { + const int32_t cdf_idx = indexes_ptr[i + symbol_offset]; + decoded_ptr[i + symbol_offset] = + decode_one_symbol(m_ptr8, m_rans, cdfs[cdf_idx].data(), max_value_ptr[cdf_idx]); + } +} + +void RansDecoderLib::decode_z(int8_t* decoded_ptr, const int symbol_size, const int symbol_offset, + const int cdf_offset, const int ch) { { std::lock_guard lk(m_mutex_result); @@ -480,47 +437,69 @@ void RansDecoderLibMultiThread::decode_z(const int total_size, const int cdf_gro } PendingTask p; p.workType = WorkType::EncodeDecodeZ; - p.total_size = total_size; - p.cdf_group_index = cdf_group_index; - p.start_offset = start_offset; - p.per_channel_size = per_channel_size; + p.decoded_ptr = decoded_ptr; + p.symbol_size = symbol_size; + p.symbol_offset = symbol_offset; + p.cdf_offset = cdf_offset; + p.ch = ch; { std::unique_lock lk(m_mutex_pending); - m_pending.push_back(p); + m_pending.push(std::move(p)); } m_cv_pending.notify_one(); } -std::shared_ptr> RansDecoderLibMultiThread::get_decoded_tensor() +void RansDecoderLib::decode_z_internal(int8_t* decoded_ptr, const int symbol_size, + const int symbol_offset, const int cdf_offset, const int ch) +{ + const int8_t* max_value_ptr = m_max_value[0]->data(); + const std::vector* cdfs = m_cdfs[0]->data(); + + for (int i = 0; i < symbol_size; ++i) { + const int32_t cdf_idx = ((i + symbol_offset) % ch) + cdf_offset; + decoded_ptr[i + symbol_offset] = + decode_one_symbol(m_ptr8, m_rans, cdfs[cdf_idx].data(), max_value_ptr[cdf_idx]); + } +} + +void RansDecoderLib::set_cdf(const std::shared_ptr>>& cdfs, + const std::shared_ptr>& max_value, const int index) +{ + assert(index < 2); + m_cdfs[index] = cdfs; + m_max_value[index] = max_value; +} + +void RansDecoderLib::set_stream(const std::shared_ptr> encoded) +{ + m_stream = encoded; + m_ptr8 = m_stream->data(); + RansDecInit(m_rans, m_ptr8); +} + +bool RansDecoderLib::wait_for_decoding_finish() { std::unique_lock lk(m_mutex_result); m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); - return RansDecoderLib::get_decoded_tensor(); + return true; } -void RansDecoderLibMultiThread::worker() +void RansDecoderLib::worker() { while (!m_finish) { std::unique_lock lk(m_mutex_pending); - m_cv_pending.wait(lk, [this] { return m_pending.size() > 0 || m_finish; }); + m_cv_pending.wait(lk, [this] { return !m_pending.empty() || m_finish; }); if (m_finish) { - lk.unlock(); break; } - if (m_pending.size() == 0) { - lk.unlock(); - // std::cout << "contine in worker" << std::endl; - continue; - } - while (m_pending.size() > 0) { - auto p = m_pending.front(); - m_pending.pop_front(); + while (!m_pending.empty()) { + auto p = std::move(m_pending.front()); + m_pending.pop(); lk.unlock(); if (p.workType == WorkType::EncodeDecodeY) { - RansDecoderLib::decode_y(p.indexes, p.cdf_group_index); + decode_y_internal(p.decoded_ptr, p.indexes, p.symbol_size, p.symbol_offset); } else if (p.workType == WorkType::EncodeDecodeZ) { - RansDecoderLib::decode_z(p.total_size, p.cdf_group_index, p.start_offset, - p.per_channel_size); + decode_z_internal(p.decoded_ptr, p.symbol_size, p.symbol_offset, p.cdf_offset, p.ch); } { std::lock_guard lk_result(m_mutex_result); diff --git a/src/cpp/py_rans/rans.h b/src/cpp/py_rans/rans.h index 995dfee..28e97f2 100644 --- a/src/cpp/py_rans/rans.h +++ b/src/cpp/py_rans/rans.h @@ -1,56 +1,16 @@ -/* Copyright 2020 InterDigital Communications, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. #pragma once #include -#include +#include #include #include -#ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpedantic" - #pragma GCC diagnostic ignored "-Wsign-compare" -#endif - -#ifdef _MSC_VER - #pragma warning(disable : 4244) -#endif - -#include "rans_byte.h" - -#ifdef _MSC_VER - #pragma warning(default : 4244) -#endif - -#ifdef __GNUC__ - #pragma GCC diagnostic pop -#endif - -#ifdef _MSC_VER - #define FORCE_INLINE __forceinline -#endif - -#ifdef __GNUC__ - #define FORCE_INLINE __attribute__((always_inline)) inline -#endif - struct RansSymbol { uint16_t start; - uint16_t range; // range for normal coding and 0 for bypass coding + uint16_t range; }; enum class WorkType { @@ -64,138 +24,110 @@ struct PendingTask { std::shared_ptr> symbols_y; std::shared_ptr> symbols_z; std::shared_ptr> indexes; + int8_t* decoded_ptr{ nullptr }; int total_size{ 0 }; - int cdf_group_index{ 0 }; - int start_offset{ 0 }; - int per_channel_size{ 0 }; + int cdf_offset{ 0 }; + int symbol_size{ 0 }; + int symbol_offset{ 0 }; + int ch{ 0 }; + + PendingTask() = default; + PendingTask(PendingTask&&) noexcept = default; + PendingTask& operator=(PendingTask&&) noexcept = default; + + PendingTask(const PendingTask&) = delete; + PendingTask& operator=(const PendingTask&) = delete; }; +using RansState = uint32_t; + /* NOTE: Warning, we buffer everything for now... In case of large files we * should split the bitstream into chunks... Or for a memory-bounded encoder **/ class RansEncoderLib { public: RansEncoderLib(); - virtual ~RansEncoderLib() = default; + virtual ~RansEncoderLib(); RansEncoderLib(const RansEncoderLib&) = delete; RansEncoderLib(RansEncoderLib&&) = delete; RansEncoderLib& operator=(const RansEncoderLib&) = delete; RansEncoderLib& operator=(RansEncoderLib&&) = delete; - void encode_y(const std::shared_ptr> symbols, const int cdf_group_index); - void encode_z(const std::shared_ptr> symbols, const int cdf_group_index, - const int start_offset, const int per_channel_size); - - FORCE_INLINE void encode_y_internal(uint8_t*& ptr, RansState& rans, - const std::shared_ptr> symbols, - const int cdf_group_index); - FORCE_INLINE void encode_z_internal(uint8_t*& ptr, RansState& rans, - const std::shared_ptr> symbols, - const int cdf_group_index, const int start_offset, - const int per_channel_size); - FORCE_INLINE void encode_one_symbol(uint8_t*& ptr, RansState& rans, const int32_t symbol, - const int32_t cdf_size, const int32_t offset, - const std::vector& ransSymbols); - virtual void flush(); - virtual std::shared_ptr> get_encoded_stream(); - virtual void reset(); - virtual int add_cdf(const std::shared_ptr>> cdfs, - const std::shared_ptr> cdfs_sizes, - const std::shared_ptr> offsets); - virtual void empty_cdf_buffer(); + void check_buffer_capacity(int symbol_count); + void encode_y(const std::shared_ptr>& symbols, const int symbol_size, + const int symbol_offset); + void encode_y_internal(const std::shared_ptr>& symbols, + const int symbol_size, const int symbol_offset); + void encode_z(const std::shared_ptr>& symbols, const int symbol_size, + const int symbol_offset, const int cdf_offset, const int ch); + void encode_z_internal(const std::shared_ptr>& symbols, const int symbol_size, + const int symbol_offset, const int cdf_offset, const int ch); + void flush(); + std::shared_ptr> get_encoded_stream(); + void reset(); + void set_cdf(const std::shared_ptr>>& ransSymbols, + const std::shared_ptr>& max_value, const int index); + void worker(); private: - std::shared_ptr> _stream; - - std::vector>>> _ransSymbols; - std::vector>> _cdfs_sizes; - std::vector>> _offsets; - - std::list m_pendingEncodingList; -}; - -class RansEncoderLibMultiThread : public RansEncoderLib { -public: - RansEncoderLibMultiThread(); - virtual ~RansEncoderLibMultiThread(); - virtual void flush() override; - virtual std::shared_ptr> get_encoded_stream() override; - virtual void reset() override; + static const int max_stream_buffer_size = 10 * 1000 * 1000; + uint8_t* m_stream_buffer{ nullptr }; + RansState m_rans; + uint8_t* m_ptr{ nullptr }; + std::shared_ptr> m_stream; - void worker(); + std::vector>>> m_ransSymbols; + std::vector>> m_max_value; -private: - bool m_finish; - bool m_result_ready; + bool m_finish{ false }; + bool m_result_ready{ false }; std::thread m_thread; std::mutex m_mutex_result; std::mutex m_mutex_pending; std::condition_variable m_cv_pending; std::condition_variable m_cv_result; - std::list m_pending; + std::queue m_pending; }; class RansDecoderLib { public: - RansDecoderLib() {} - virtual ~RansDecoderLib() = default; + RansDecoderLib(); + virtual ~RansDecoderLib(); RansDecoderLib(const RansDecoderLib&) = delete; RansDecoderLib(RansDecoderLib&&) = delete; RansDecoderLib& operator=(const RansDecoderLib&) = delete; RansDecoderLib& operator=(RansDecoderLib&&) = delete; - virtual void set_stream(const std::shared_ptr> encoded); - - FORCE_INLINE int8_t decode_one_symbol(const int32_t* cdf, const int32_t cdf_size, - const int32_t offset); - - virtual void decode_y(const std::shared_ptr> indexes, - const int cdf_group_index); - virtual void decode_z(const int total_size, const int cdf_group_index, const int start_offset, - const int per_channel_size); - - virtual std::shared_ptr> get_decoded_tensor(); - - virtual int add_cdf(const std::shared_ptr>> cdfs, - const std::shared_ptr> cdfs_sizes, - const std::shared_ptr> offsets); - virtual void empty_cdf_buffer(); + void decode_y(int8_t* decoded_ptr, const std::shared_ptr>& indexes, + const int symbol_size, const int symbol_offset); + void decode_y_internal(int8_t* decoded_ptr, const std::shared_ptr>& indexes, + const int symbol_size, const int symbol_offset); + void decode_z(int8_t* decoded_ptr, const int symbol_size, const int symbol_offset, + const int cdf_offset, const int ch); + void decode_z_internal(int8_t* decoded_ptr, const int symbol_size, const int symbol_offset, + const int cdf_offset, const int ch); + void set_cdf(const std::shared_ptr>>& cdfs, + const std::shared_ptr>& max_value, const int index); + void set_stream(const std::shared_ptr> encoded); + bool wait_for_decoding_finish(); + void worker(); private: - RansState _rans; - uint8_t* _ptr8; - std::shared_ptr> _stream; - std::shared_ptr> m_decoded; - - std::vector>>> _cdfs; - std::vector>> _cdfs_sizes; - std::vector>> _offsets; -}; + RansState m_rans; + const uint8_t* m_ptr8{ nullptr }; + std::shared_ptr> m_stream; -class RansDecoderLibMultiThread : public RansDecoderLib { -public: - RansDecoderLibMultiThread(); - virtual ~RansDecoderLibMultiThread(); - - virtual void decode_y(const std::shared_ptr> indexes, - const int cdf_group_index) override; - - virtual void decode_z(const int total_size, const int cdf_group_index, const int start_offset, - const int per_channel_size) override; - - virtual std::shared_ptr> get_decoded_tensor() override; + std::vector>>> m_cdfs; + std::vector>> m_max_value; - void worker(); - -private: - bool m_finish; - bool m_result_ready; + bool m_finish{ false }; + bool m_result_ready{ false }; std::thread m_thread; std::mutex m_mutex_result; std::mutex m_mutex_pending; std::condition_variable m_cv_pending; std::condition_variable m_cv_result; - std::list m_pending; -}; \ No newline at end of file + std::queue m_pending; +}; diff --git a/src/cpp/pyproject.toml b/src/cpp/pyproject.toml new file mode 100644 index 0000000..9787c3b --- /dev/null +++ b/src/cpp/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/src/cpp/setup.py b/src/cpp/setup.py index 7e1b036..a86631b 100644 --- a/src/cpp/setup.py +++ b/src/cpp/setup.py @@ -7,7 +7,7 @@ from pybind11.setup_helpers import Pybind11Extension, build_ext -if sys.platform == "win32": +if sys.platform == 'win32': extra_compile_args = ['/std:c++17', '/O2', '/W4', '/WX', '/wd4100'] extra_link_args = [] else: @@ -16,7 +16,7 @@ setup( - name="MLCodec_extensions_cpp", + name='MLCodec_extensions_cpp', ext_modules=[ Pybind11Extension( name='MLCodec_extensions_cpp', @@ -25,7 +25,7 @@ extra_link_args=extra_link_args, ), ], - cmdclass={"build_ext": build_ext}, + cmdclass={'build_ext': build_ext}, zip_safe=False, - python_requires=">=3.12", + python_requires='>=3.12', ) diff --git a/src/datasets/image_dataset.py b/src/datasets/image_dataset.py new file mode 100644 index 0000000..8c184a2 --- /dev/null +++ b/src/datasets/image_dataset.py @@ -0,0 +1,72 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import json +import numpy as np +import os +import random +import torch + +from PIL import Image +from torch.utils.data import Dataset + +from ..utils.transforms import rgb2ycbcr_np + + +class ImageFolder(Dataset): + def __init__(self, root_folder_path, patch_h, patch_w, qp_num, lambdas): + self.root_folder_path = root_folder_path + with open(os.path.join(root_folder_path, 'description.json')) as json_file: + self.dataset = json.load(json_file) + + self.dataset_length = len(self.dataset) + self.patch_h = patch_h + self.patch_w = patch_w + self.qp_num = qp_num + self.lambdas = lambdas + + def __getitem__(self, index): + image_path = os.path.join(self.root_folder_path, self.dataset[index]) + img = Image.open(image_path).convert('RGB') + width, height = img.size + + pad_height = self.patch_h - height + pad_width = self.patch_w - width + pad_height = max(0, pad_height) + pad_width = max(0, pad_width) + pad_size = ((pad_height // 2, pad_height - pad_height // 2), + (pad_width // 2, pad_width - pad_width // 2), + (0, 0),) + padded_height = height + pad_height + padded_width = width + pad_width + y = random.randint(0, padded_height - self.patch_h) + x = random.randint(0, padded_width - self.patch_w) + + if random.choice([True, False]): + img = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + img = np.array(img).astype(np.uint8) + img = np.pad(img, pad_size, mode='constant') + img = img[y:y+self.patch_h, x:x+self.patch_w, :] + + img = img.astype(np.float32) / 255.0 + img = rgb2ycbcr_np(img) + img = img - 0.5 + img = torch.as_tensor(img, dtype=torch.float32) + img = img.permute(2, 0, 1).contiguous() + # img in [3, H, W] + + curr_qp = random.randint(0, self.qp_num - 1) + curr_lambda = self.lambdas[curr_qp] + curr_qp = torch.tensor(curr_qp, dtype=torch.int32) + curr_lambda = torch.tensor(curr_lambda, dtype=torch.float32) + return [img, curr_qp, curr_lambda] + + def __len__(self): + return self.dataset_length + + def get_patch_size(self): + return self.patch_w, self.patch_h + + def set_patch_size(self, patch_width, patch_height): + self.patch_w = patch_width + self.patch_h = patch_height diff --git a/src/datasets/video_dataset.py b/src/datasets/video_dataset.py new file mode 100644 index 0000000..aeb0af2 --- /dev/null +++ b/src/datasets/video_dataset.py @@ -0,0 +1,123 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import json +import numpy as np +import os +import random +import torch + +from PIL import Image +from torch.utils.data import Dataset + +from ..utils.transforms import rgb2ycbcr_np + + +class VideoFolder(Dataset): + def __init__(self, root_folder_path, patch_h, patch_w, qp_num, lambdas, frame_num=5, + group_of_pictures=1): + self.root_folder_path = root_folder_path + with open(os.path.join(self.root_folder_path, 'description.json')) as json_file: + desc = json.load(json_file) + self.seqs = desc['seqs'] + self.frames = desc['frames'] + + self.dataset_length = len(self.seqs) + self.patch_h = patch_h + self.patch_w = patch_w + self.qp_num = qp_num + self.lambdas = lambdas + self.frame_num = frame_num + self.group_of_pictures = group_of_pictures + + def __getitem__(self, index): + seq = self.seqs[index] + height = seq['height'] + width = seq['width'] + seq_length = seq['seq_length'] + seq_path = seq['path'] + + img_indexes = [] + if self.frame_num < seq_length: + frame_index = random.randint(0, seq_length - self.frame_num - 1) + img_indexes = list(range(frame_index, frame_index + self.frame_num)) + else: + increasing = True + frame_index = 0 + while len(img_indexes) < self.frame_num: + img_indexes.append(frame_index) + if increasing: + if frame_index == seq_length - 1: + frame_index -= 1 + increasing = False + else: + frame_index += 1 + else: + if frame_index == 0: + frame_index += 1 + increasing = True + else: + frame_index -= 1 + + flip = random.choice([True, False]) + + pad_height = self.patch_h - height + pad_width = self.patch_w - width + pad_height = max(0, pad_height) + pad_width = max(0, pad_width) + pad_size = ((pad_height // 2, pad_height - pad_height // 2), + (pad_width // 2, pad_width - pad_width // 2), + (0, 0),) + padded_height = height + pad_height + padded_width = width + pad_width + y = random.randint(0, padded_height - self.patch_h) + x = random.randint(0, padded_width - self.patch_w) + + video_data = [] + curr_img_group = [] + for img_index in img_indexes: + img_path = os.path.join(self.root_folder_path, seq_path, self.frames[img_index]) + img = Image.open(img_path).convert('RGB') + if flip: + img = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + img = np.array(img).astype(np.uint8) + img = np.pad(img, pad_size, mode='constant') + + img = img[y:y+self.patch_h, x:x+self.patch_w, :] + img = img.astype(np.float32) / 255.0 + img = rgb2ycbcr_np(img) + img = img - 0.5 + img = torch.as_tensor(img, dtype=torch.float32) + img = img.permute(2, 0, 1).contiguous() + # img in [3, H, W] + if len(video_data) == 0: + video_data.append(img) + else: + curr_img_group.append(img) + if len(curr_img_group) == self.group_of_pictures: + img = torch.cat(curr_img_group, dim=0) + video_data.append(img) + curr_img_group = [] + + curr_qp = random.randint(0, self.qp_num - 1) + curr_lambda = self.lambdas[curr_qp] + video_data.append(torch.tensor(curr_qp, dtype=torch.int32)) + video_data.append(torch.tensor(curr_lambda, dtype=torch.float32)) + + return video_data + + def __len__(self): + return self.dataset_length + + def get_frame_num(self): + return self.frame_num + + def get_patch_size(self): + return self.patch_w, self.patch_h + + def set_frame_num(self, frame_num): + self.frame_num = frame_num + + def set_patch_size(self, patch_width, patch_height): + self.patch_w = patch_width + self.patch_h = patch_height diff --git a/src/layers/extensions/inference/bind.cpp b/src/layers/extensions/inference/bind.cpp index 0bc8e24..3bf01f5 100644 --- a/src/layers/extensions/inference/bind.cpp +++ b/src/layers/extensions/inference/bind.cpp @@ -1,36 +1,39 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -#include "def.h" #include +#include "dmc_htl_proxy.h" +#include "dmc_hts_proxy.h" +#include "dmc_ld_proxy.h" +#include "dmci_proxy.h" + PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { - m.def("process_with_mask_cuda", &process_with_mask_cuda); - m.def("combine_for_reading_2x_cuda", &combine_for_reading_2x_cuda); - m.def("restore_y_2x_cuda", &restore_y_2x_cuda); - m.def("restore_y_4x_cuda", &restore_y_4x_cuda); - m.def("build_index_dec_cuda", &build_index_dec_cuda); - m.def("build_index_enc_cuda", &build_index_enc_cuda); - m.def("bias_quant_cuda", &bias_quant_cuda); - m.def("round_and_to_int8_cuda", &round_and_to_int8_cuda); - m.def("clamp_reciprocal_with_quant_cuda", &clamp_reciprocal_with_quant_cuda); - m.def("add_and_multiply_cuda", &add_and_multiply_cuda); - m.def("bias_pixel_shuffle_8_cuda", &bias_pixel_shuffle_8_cuda); - m.def("replicate_pad_cuda", &replicate_pad_cuda); - m.def("bias_wsilu_depthwise_conv2d_cuda", &bias_wsilu_depthwise_conv2d_cuda); + py::class_(m, "DMCIProxy") + .def(py::init<>()) + .def("set_param", &DMCIProxy::set_param) + .def("compress", &DMCIProxy::compress) + .def("decompress", &DMCIProxy::decompress); + + py::class_(m, "DMCHTLProxy") + .def(py::init<>()) + .def("set_param", &DMCHTLProxy::set_param) + .def("add_ref_feature_from_frame", &DMCHTLProxy::add_ref_feature_from_frame) + .def("compress", &DMCHTLProxy::compress) + .def("decompress", &DMCHTLProxy::decompress); - py::class_(m, "DepthConvProxy") + py::class_(m, "DMCHTSProxy") .def(py::init<>()) - .def("set_param", &DepthConvProxy::set_param) - .def("set_param_with_adaptor", &DepthConvProxy::set_param_with_adaptor) - .def("forward", &DepthConvProxy::forward) - .def("forward_with_quant_step", &DepthConvProxy::forward_with_quant_step) - .def("forward_with_cat", &DepthConvProxy::forward_with_cat); + .def("set_param", &DMCHTSProxy::set_param) + .def("add_ref_feature_from_frame", &DMCHTSProxy::add_ref_feature_from_frame) + .def("compress", &DMCHTSProxy::compress) + .def("decompress", &DMCHTSProxy::decompress); - py::class_(m, "SubpelConv2xProxy") + py::class_(m, "DMCLDProxy") .def(py::init<>()) - .def("set_param", &SubpelConv2xProxy::set_param) - .def("forward", &SubpelConv2xProxy::forward) - .def("forward_with_cat", &SubpelConv2xProxy::forward_with_cat); + .def("set_param", &DMCLDProxy::set_param) + .def("add_ref_feature_from_frame", &DMCLDProxy::add_ref_feature_from_frame) + .def("compress", &DMCLDProxy::compress) + .def("decompress", &DMCLDProxy::decompress); } diff --git a/src/layers/extensions/inference/common_cpp.h b/src/layers/extensions/inference/common_cpp.h new file mode 100644 index 0000000..5e56fc4 --- /dev/null +++ b/src/layers/extensions/inference/common_cpp.h @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include + +class GPUInfo { +public: + GPUInfo() + { + int deviceCount; + cudaGetDeviceCount(&deviceCount); + + if (deviceCount == 0) { + return; + } + + // only query the first GPU + cudaDeviceProp deviceProp; + cudaGetDeviceProperties(&deviceProp, 0); + computeCapability = deviceProp.major * 10 + deviceProp.minor; + } + ~GPUInfo() {} + +public: + int computeCapability{ 0 }; +}; + +inline GPUInfo& get_gpu_info() +{ + static GPUInfo info; + return info; +} + +inline int get_gpu_sm() +{ + return get_gpu_info().computeCapability; +} diff --git a/src/layers/extensions/inference/common_cu.h b/src/layers/extensions/inference/common_cu.h new file mode 100644 index 0000000..088712b --- /dev/null +++ b/src/layers/extensions/inference/common_cu.h @@ -0,0 +1,184 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include "common_cutlass.h" +#include "def_const.h" + +constexpr uint64_t conv_key(uint64_t sm, uint64_t W, uint64_t H, uint64_t C2, uint64_t C1, + uint64_t stride, uint64_t kernel) +{ + /** + * Valid range: + * kernel: 0 - 1 () 2^0 - 2^0 + * stride: 0 - 1 (<<1) 2^1 - 2^1 + * C1: 2^3 - 2^13 (>>1) 2^2 - 2^12 + * C2: 2^3 - 2^13 (<<10) 2^13 - 2^23 + * H: 2^0 - 2^15 (<<24) 2^24 - 2^39 + * W: 2^0 - 2^15 (<<40) 2^40 - 2^55 + * SM: 1 - 0xFF (8bits) (<<56) + */ + assert(C2 <= (1 << 13) && (C2 & 7) == 0 && C1 <= (1 << 13) && (C1 & 7) == 0 && H <= (1 << 15) + && W <= (1 << 15) && sm <= 0xFF); + return kernel | (stride << 1) | (C1 >> 1) | (C2 << 10) | (H << 24) | (W << 40) | (sm << 56); +} + +struct CudaCHW { + int C; + int H; + int W; +}; + +template +__forceinline__ std::tuple get_kernel_config_1D(const at::Tensor& x) +{ + int N = x.numel(); + assert(N % factor == 0); + N /= factor; + const int BLOCK_SIZE = 256; + const dim3 blockDim(BLOCK_SIZE); + const dim3 gridDim((N + BLOCK_SIZE - 1) / BLOCK_SIZE); + + static cudaLaunchAttribute attrs = get_cuda_launch_attribute(); + cudaLaunchConfig_t config; + config.gridDim = gridDim; + config.blockDim = blockDim; + config.dynamicSmemBytes = 0; + config.stream = at::cuda::getCurrentCUDAStream(); + config.attrs = &attrs; + config.numAttrs = 1; + + return { config, N }; +} + +template +__forceinline__ std::tuple get_kernel_config_4D(const int C, + const int H, const int W) +{ + assert(C % factor == 0); + const dim3 gridDim((C / factor + BLOCK_SIZE_X - 1) / BLOCK_SIZE_X, + (W + BLOCK_SIZE_Y - 1) / BLOCK_SIZE_Y, (H + BLOCK_SIZE_Z - 1) / BLOCK_SIZE_Z); + const dim3 blockDim(BLOCK_SIZE_X, BLOCK_SIZE_Y, BLOCK_SIZE_Z); + + static cudaLaunchAttribute attrs = get_cuda_launch_attribute(); + cudaLaunchConfig_t config; + config.gridDim = gridDim; + config.blockDim = blockDim; + config.dynamicSmemBytes = 0; + config.stream = at::cuda::getCurrentCUDAStream(); + config.attrs = &attrs; + config.numAttrs = 1; + return { config, { C / factor, H, W } }; +} + +template +__forceinline__ std::tuple get_kernel_config_4D(const at::Tensor& x) +{ + const int C = x.size(1); + const int H = x.size(2); + const int W = x.size(3); + return get_kernel_config_4D(C, H, W); +} + +struct __align__(2) bool2 +{ + bool x; + bool y; +}; + +template +__forceinline__ __device__ void load2(const T* src, T& dst0, T& dst1) +{ + if constexpr (std::is_same_v) { + half2 v = *reinterpret_cast(src); + dst0 = __low2half(v); + dst1 = __high2half(v); + } else if constexpr (std::is_same_v) { + short2 v = *reinterpret_cast(src); + dst0 = v.x; + dst1 = v.y; + } else if constexpr (std::is_same_v) { + char2 v = *reinterpret_cast(src); + dst0 = v.x; + dst1 = v.y; + } else if constexpr (std::is_same_v) { + uchar2 v = *reinterpret_cast(src); + dst0 = v.x; + dst1 = v.y; + } else if constexpr (std::is_same_v) { + bool2 v = *reinterpret_cast(src); + dst0 = v.x; + dst1 = v.y; + } else { + dst0 = src[0]; + dst1 = src[1]; + } +} + +__forceinline__ __device__ at::Half log(const at::Half& a) +{ + return hlog(a); +} + +__forceinline__ __device__ bool2 make_bool2(bool x, bool y) +{ + bool2 t; + t.x = x; + t.y = y; + return t; +} + +__forceinline__ __device__ at::Half max(const at::Half& a, const at::Half& b) +{ + return __hmax(a, b); +} + +__forceinline__ __device__ at::Half min(const at::Half& a, const at::Half& b) +{ + return __hmin(a, b); +} + +__forceinline__ __device__ at::Half operator*(const at::Half& a, const bool b) +{ + return b ? a : static_cast(0.f); +} + +__forceinline__ __device__ bool operator>(const at::Half& a, const at::Half& b) +{ + return __hgt(a, b); +} + +__forceinline__ __device__ at::Half reciprocal(const at::Half& a) +{ + return hrcp(a); +} + +template +__forceinline__ __device__ void store2(T* dst, T src0, T src1) +{ + if constexpr (std::is_same_v) { + *reinterpret_cast(dst) = __halves2half2(src0, src1); + } else if constexpr (std::is_same_v) { + *reinterpret_cast(dst) = make_short2(src0, src1); + } else if constexpr (std::is_same_v) { + *reinterpret_cast(dst) = make_char2(src0, src1); + } else if constexpr (std::is_same_v) { + *reinterpret_cast(dst) = make_uchar2(src0, src1); + } else if constexpr (std::is_same_v) { + *reinterpret_cast(dst) = make_bool2(src0, src1); + } else { + dst[0] = src0; + dst[1] = src1; + } +} + +__forceinline__ __device__ int16_t to_int16(const at::Half& a) +{ + return static_cast(__half2int_rd(a)); +} + +__forceinline__ __device__ uint8_t to_uint8(const at::Half& a) +{ + return static_cast(__half2uint_rd(a)); +} diff --git a/src/layers/extensions/inference/common_cutlass.h b/src/layers/extensions/inference/common_cutlass.h new file mode 100644 index 0000000..6179c9a --- /dev/null +++ b/src/layers/extensions/inference/common_cutlass.h @@ -0,0 +1,289 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#if CURRENT_DEVICE_SM == 90 || CURRENT_DEVICE_SM == 100 + #define cudaGDC() cudaGridDependencySynchronize() +#else + #define cudaGDC() ((void)0) +#endif + +template +CUTLASS_HOST_DEVICE T four(); + +template <> +CUTLASS_HOST_DEVICE float four() +{ + return 4.f; +} + +template <> +CUTLASS_HOST_DEVICE cutlass::half_t four() +{ + uint16_t bits = 0x4400u; + return reinterpret_cast(bits); +} + +__forceinline__ cudaLaunchAttribute get_cuda_launch_attribute() +{ + cudaLaunchAttribute attr; + attr.id = cudaLaunchAttributeProgrammaticStreamSerialization; +#if CURRENT_DEVICE_SM == 90 || CURRENT_DEVICE_SM == 100 + attr.val.programmaticStreamSerializationAllowed = 1; +#else + attr.val.programmaticStreamSerializationAllowed = 0; +#endif + return attr; +} + +__device__ __forceinline__ std::tuple global_idx_chw() +{ + const int c = blockIdx.x * blockDim.x + threadIdx.x; + const int w = blockIdx.y * blockDim.y + threadIdx.y; + const int h = blockIdx.z * blockDim.z + threadIdx.z; + return { c, h, w }; +} + +// T maybe vector type, and may be different from t.dtype +template +struct GPUTensor1D { + GPUTensor1D(at::Tensor& t) : ptr(static_cast(t.data_ptr())) {} + GPUTensor1D(const at::Tensor& t) : ptr(static_cast(t.data_ptr())) {} + GPUTensor1D(std::nullptr_t) : ptr(nullptr) {} + + __device__ T& operator[](int idx) { return ptr[idx]; } + __device__ T& operator[](int idx) const { return ptr[idx]; } + + T* __restrict__ const ptr; +}; + +template +class GPUTensorND : public at::PackedTensorAccessor32 { + using Base = at::PackedTensorAccessor32; + +public: + GPUTensorND(at::Tensor& t) : Base(t.packed_accessor32()) {} + GPUTensorND(const at::Tensor& t) : Base(t.packed_accessor32()) {} + GPUTensorND(std::nullptr_t) : Base(make_null_base()) {} + + static inline Base make_null_base() + { + int32_t sizes[N] = { 0 }; + int32_t strides[N] = { 0 }; + return Base(nullptr, sizes, strides); + } +}; + +template +using GPUTensor2D = GPUTensorND; + +template +using GPUTensor4D = GPUTensorND; + +constexpr int HINT_NUM = 30; +constexpr int HINT_NUM_EX = 96; + +template +struct WSiLUOp; + +template +struct WSiLUOp> { + static const bool kIsHeavy = true; + + CUTLASS_HOST_DEVICE + cutlass::Array operator()(cutlass::Array const& value) const + { + cutlass::epilogue::thread::Sigmoid> sigmoid_op; + cutlass::multiplies> mul; + return mul(value, sigmoid_op(mul(four(), value))); + } +}; + +// clang-format off +// Macro for Sm80 Hint definitions +#define DEFINE_HINT_SM80(N, TB_M, TB_N, TB_K, W_M, W_N, W_K, OP_M, OP_N, OP_K, STAGES) \ +struct Hint##N { \ + using SmArch = cutlass::arch::Sm80; \ + using ShapeThreadBlock = cutlass::gemm::GemmShape; \ + using ShapeWarp = cutlass::gemm::GemmShape; \ + using ShapeOp = cutlass::gemm::GemmShape; \ + static constexpr int Stages = STAGES; \ +} + +// N TB_M TB_N TB_K W_M W_N W_K OP_M OP_N OP_K STAGES +DEFINE_HINT_SM80( 0, 256, 128, 32, 64, 64, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 1, 128, 256, 32, 64, 64, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 2, 128, 128, 32, 64, 64, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 3, 64, 256, 32, 64, 64, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 4, 256, 64, 32, 64, 64, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 5, 64, 128, 32, 32, 64, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 6, 128, 64, 32, 64, 32, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 7, 64, 64, 32, 32, 32, 32, 16, 8, 8, 2); +DEFINE_HINT_SM80( 8, 64, 64, 64, 32, 32, 64, 16, 8, 16, 5); +DEFINE_HINT_SM80( 9, 256, 128, 32, 64, 64, 32, 16, 8, 16, 3); +DEFINE_HINT_SM80( 10, 128, 256, 32, 64, 64, 32, 16, 8, 16, 3); +DEFINE_HINT_SM80( 11, 256, 64, 32, 64, 64, 32, 16, 8, 16, 3); +DEFINE_HINT_SM80( 12, 256, 64, 32, 64, 64, 32, 16, 8, 16, 4); +DEFINE_HINT_SM80( 13, 64, 256, 32, 64, 64, 32, 16, 8, 16, 4); +DEFINE_HINT_SM80( 14, 128, 128, 32, 64, 64, 32, 16, 8, 16, 3); // default Sm80, Sm86, Sm90 +DEFINE_HINT_SM80( 15, 128, 128, 32, 64, 64, 32, 16, 8, 16, 4); +DEFINE_HINT_SM80( 16, 128, 128, 32, 64, 64, 32, 16, 8, 16, 5); +DEFINE_HINT_SM80( 17, 128, 64, 32, 64, 32, 32, 16, 8, 16, 6); +DEFINE_HINT_SM80( 18, 64, 128, 32, 32, 64, 32, 16, 8, 16, 6); +DEFINE_HINT_SM80( 19, 64, 64, 32, 32, 32, 32, 16, 8, 16, 10); +DEFINE_HINT_SM80( 20, 256, 128, 64, 64, 64, 64, 16, 8, 16, 3); +DEFINE_HINT_SM80( 21, 128, 256, 64, 64, 64, 64, 16, 8, 16, 3); +DEFINE_HINT_SM80( 22, 256, 64, 64, 64, 64, 64, 16, 8, 16, 4); +DEFINE_HINT_SM80( 23, 64, 256, 64, 64, 64, 64, 16, 8, 16, 4); +DEFINE_HINT_SM80( 24, 128, 128, 64, 64, 64, 64, 16, 8, 16, 4); +DEFINE_HINT_SM80( 25, 256, 64, 64, 64, 64, 64, 16, 8, 16, 3); +DEFINE_HINT_SM80( 26, 64, 256, 64, 64, 64, 64, 16, 8, 16, 3); +DEFINE_HINT_SM80( 27, 128, 128, 64, 64, 64, 64, 16, 8, 16, 3); +DEFINE_HINT_SM80( 28, 128, 64, 64, 64, 32, 64, 16, 8, 16, 3); +DEFINE_HINT_SM80( 29, 64, 128, 64, 32, 64, 64, 16, 8, 16, 3); + +// Macro for Sm90 Hint definitions +#define DEFINE_HINT_SM90(N, T_M, T_N, T_K, C_X, C_Y, C_Z) \ +struct Hint##N { \ + using SmArch = cutlass::arch::Sm90; \ + using TileShape = cute::Shape; \ + using ClusterShape = cute::Shape; \ + using EpilogueSchedule = cutlass::epilogue::TmaWarpSpecializedCooperative; \ + using KernelSchedule = cutlass::gemm::KernelTmaWarpSpecializedCooperative; \ +} + +// N T_M T_N T_K C_X C_Y C_Z +DEFINE_HINT_SM90( 30, _128, _128, _64, _1, _2, _1); +DEFINE_HINT_SM90( 31, _128, _128, _64, _2, _1, _1); +DEFINE_HINT_SM90( 32, _128, _256, _64, _1, _2, _1); +DEFINE_HINT_SM90( 33, _128, _256, _64, _2, _1, _1); +DEFINE_HINT_SM90( 34, _256, _128, _64, _1, _2, _1); +DEFINE_HINT_SM90( 35, _256, _128, _64, _2, _1, _1); +DEFINE_HINT_SM90( 36, _256, _256, _64, _1, _2, _1); +DEFINE_HINT_SM90( 37, _256, _256, _64, _2, _1, _1); + +// Macros for Sm100 Hint definitions with different schedule combinations +// Type A: TmaWarpSpecialized2Sm + KernelTmaWarpSpecialized2SmSm100 +#define DEFINE_HINT_SM100_2SM(N, T_M, T_N, T_K, C_X, C_Y, C_Z) \ +struct Hint##N { \ + using SmArch = cutlass::arch::Sm100; \ + using TileShape = cute::Shape; \ + using ClusterShape = cute::Shape; \ + using EpilogueSchedule = cutlass::epilogue::TmaWarpSpecialized2Sm; \ + using KernelSchedule = cutlass::gemm::KernelTmaWarpSpecialized2SmSm100; \ +} + +// Type B: TmaWarpSpecialized1Sm + KernelTmaWarpSpecialized1SmSm100 +#define DEFINE_HINT_SM100_1SM(N, T_M, T_N, T_K, C_X, C_Y, C_Z) \ +struct Hint##N { \ + using SmArch = cutlass::arch::Sm100; \ + using TileShape = cute::Shape; \ + using ClusterShape = cute::Shape; \ + using EpilogueSchedule = cutlass::epilogue::TmaWarpSpecialized1Sm; \ + using KernelSchedule = cutlass::gemm::KernelTmaWarpSpecialized1SmSm100; \ +} + +// Type C: EpilogueScheduleAuto + KernelTmaWarpSpecialized2SmSm100 +#define DEFINE_HINT_SM100_AUTO_2SM(N, T_M, T_N, T_K, C_X, C_Y, C_Z) \ +struct Hint##N { \ + using SmArch = cutlass::arch::Sm100; \ + using TileShape = cute::Shape; \ + using ClusterShape = cute::Shape; \ + using EpilogueSchedule = cutlass::epilogue::collective::EpilogueScheduleAuto; \ + using KernelSchedule = cutlass::gemm::KernelTmaWarpSpecialized2SmSm100; \ +} + +// Type D: EpilogueScheduleAuto + KernelTmaWarpSpecialized1SmSm100 +#define DEFINE_HINT_SM100_AUTO_1SM(N, T_M, T_N, T_K, C_X, C_Y, C_Z) \ +struct Hint##N { \ + using SmArch = cutlass::arch::Sm100; \ + using TileShape = cute::Shape; \ + using ClusterShape = cute::Shape; \ + using EpilogueSchedule = cutlass::epilogue::collective::EpilogueScheduleAuto; \ + using KernelSchedule = cutlass::gemm::KernelTmaWarpSpecialized1SmSm100; \ +} + +// Hints 38-51: TmaWarpSpecialized2Sm + KernelTmaWarpSpecialized2SmSm100 +// N T_M T_N T_K C_X C_Y C_Z +DEFINE_HINT_SM100_2SM( 38, _128, _128, _64, int, int, _1); +DEFINE_HINT_SM100_2SM( 39, _128, _128, _64, cute::_2, cute::_1, _1); +DEFINE_HINT_SM100_2SM( 40, _128, _128, _64, cute::_2, cute::_2, _1); +DEFINE_HINT_SM100_2SM( 41, _128, _128, _64, cute::_4, cute::_1, _1); +DEFINE_HINT_SM100_2SM( 42, _128, _128, _64, cute::_2, cute::_4, _1); +DEFINE_HINT_SM100_2SM( 43, _128, _128, _64, cute::_4, cute::_2, _1); +DEFINE_HINT_SM100_2SM( 44, _128, _128, _64, cute::_4, cute::_4, _1); +DEFINE_HINT_SM100_2SM( 45, _128, _256, _64, int, int, _1); +DEFINE_HINT_SM100_2SM( 46, _128, _256, _64, cute::_2, cute::_1, _1); +DEFINE_HINT_SM100_2SM( 47, _128, _256, _64, cute::_2, cute::_2, _1); +DEFINE_HINT_SM100_2SM( 48, _128, _256, _64, cute::_4, cute::_1, _1); +DEFINE_HINT_SM100_2SM( 49, _128, _256, _64, cute::_2, cute::_4, _1); +DEFINE_HINT_SM100_2SM( 50, _128, _256, _64, cute::_4, cute::_2, _1); +DEFINE_HINT_SM100_2SM( 51, _128, _256, _64, cute::_4, cute::_4, _1); + +// Hints 52-66: TmaWarpSpecialized1Sm + KernelTmaWarpSpecialized1SmSm100 +// N T_M T_N T_K C_X C_Y C_Z +DEFINE_HINT_SM100_1SM( 52, _64, _128, _64, int, int, _1); +DEFINE_HINT_SM100_1SM( 53, _64, _128, _64, cute::_1, cute::_1, _1); +DEFINE_HINT_SM100_1SM( 54, _64, _128, _64, cute::_1, cute::_2, _1); +DEFINE_HINT_SM100_1SM( 55, _64, _128, _64, cute::_1, cute::_4, _1); +DEFINE_HINT_SM100_1SM( 56, _64, _128, _64, cute::_4, cute::_4, _1); +DEFINE_HINT_SM100_1SM( 57, _128, _128, _64, int, int, _1); +DEFINE_HINT_SM100_1SM( 58, _128, _128, _64, cute::_1, cute::_1, _1); +DEFINE_HINT_SM100_1SM( 59, _128, _128, _64, cute::_1, cute::_2, _1); +DEFINE_HINT_SM100_1SM( 60, _128, _128, _64, cute::_1, cute::_4, _1); +DEFINE_HINT_SM100_1SM( 61, _128, _128, _64, cute::_4, cute::_4, _1); +DEFINE_HINT_SM100_1SM( 62, _128, _256, _64, int, int, _1); +DEFINE_HINT_SM100_1SM( 63, _128, _256, _64, cute::_1, cute::_1, _1); +DEFINE_HINT_SM100_1SM( 64, _128, _256, _64, cute::_1, cute::_2, _1); +DEFINE_HINT_SM100_1SM( 65, _128, _256, _64, cute::_1, cute::_4, _1); +DEFINE_HINT_SM100_1SM( 66, _128, _256, _64, cute::_4, cute::_4, _1); + +// Hints 67-80: EpilogueScheduleAuto + KernelTmaWarpSpecialized2SmSm100 +// N T_M T_N T_K C_X C_Y C_Z +DEFINE_HINT_SM100_AUTO_2SM( 67, _256, _128, _64, int, int, _1); +DEFINE_HINT_SM100_AUTO_2SM( 68, _256, _128, _64, cute::_2, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_2SM( 69, _256, _128, _64, cute::_2, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_2SM( 70, _256, _128, _64, cute::_4, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_2SM( 71, _256, _128, _64, cute::_2, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_2SM( 72, _256, _128, _64, cute::_4, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_2SM( 73, _256, _128, _64, cute::_4, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_2SM( 74, _256, _256, _64, int, int, _1); +DEFINE_HINT_SM100_AUTO_2SM( 75, _256, _256, _64, cute::_2, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_2SM( 76, _256, _256, _64, cute::_2, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_2SM( 77, _256, _256, _64, cute::_4, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_2SM( 78, _256, _256, _64, cute::_2, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_2SM( 79, _256, _256, _64, cute::_4, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_2SM( 80, _256, _256, _64, cute::_4, cute::_4, _1); + +// Hints 81-95: EpilogueScheduleAuto + KernelTmaWarpSpecialized1SmSm100 +// N T_M T_N T_K C_X C_Y C_Z +DEFINE_HINT_SM100_AUTO_1SM( 81, _64, _128, _64, int, int, _1); +DEFINE_HINT_SM100_AUTO_1SM( 82, _64, _128, _64, cute::_1, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_1SM( 83, _64, _128, _64, cute::_1, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_1SM( 84, _64, _128, _64, cute::_1, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_1SM( 85, _64, _128, _64, cute::_4, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_1SM( 86, _128, _128, _64, int, int, _1); +DEFINE_HINT_SM100_AUTO_1SM( 87, _128, _128, _64, cute::_1, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_1SM( 88, _128, _128, _64, cute::_1, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_1SM( 89, _128, _128, _64, cute::_1, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_1SM( 90, _128, _128, _64, cute::_4, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_1SM( 91, _128, _256, _64, int, int, _1); +DEFINE_HINT_SM100_AUTO_1SM( 92, _128, _256, _64, cute::_1, cute::_1, _1); +DEFINE_HINT_SM100_AUTO_1SM( 93, _128, _256, _64, cute::_1, cute::_2, _1); +DEFINE_HINT_SM100_AUTO_1SM( 94, _128, _256, _64, cute::_1, cute::_4, _1); +DEFINE_HINT_SM100_AUTO_1SM( 95, _128, _256, _64, cute::_4, cute::_4, _1); +// clang-format on diff --git a/src/layers/extensions/inference/cuda_check.h b/src/layers/extensions/inference/cuda_check.h new file mode 100644 index 0000000..4687b5d --- /dev/null +++ b/src/layers/extensions/inference/cuda_check.h @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include + +#define CUDA_CHECK(expr) \ + do { \ + cudaError_t err = (expr); \ + if (err != cudaSuccess) { \ + throw std::runtime_error(std::string("CUDA error: ") + cudaGetErrorString(err) \ + + " at " + __FILE__ + ":" + std::to_string(__LINE__)); \ + } \ + } while (0) diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias.cu new file mode 100644 index 0000000..bf84e2a --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias.cu @@ -0,0 +1,540 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_NAME = "HINT_MAP_BIAS"; +std::unordered_map HINT_MAP_BIAS = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 20, 12, 512, 128, 0, 0), 28 }, + { conv_key(80, 20, 12, 1024, 128, 0, 0), 17 }, + { conv_key(80, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(80, 26, 15, 256, 128, 0, 0), 19 }, + { conv_key(80, 26, 15, 256, 512, 0, 0), 8 }, + { conv_key(80, 26, 15, 256, 768, 0, 0), 8 }, + { conv_key(80, 26, 15, 384, 384, 0, 0), 8 }, + { conv_key(80, 26, 15, 512, 256, 0, 0), 8 }, + { conv_key(80, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(80, 26, 15, 768, 768, 0, 0), 8 }, + { conv_key(80, 28, 16, 128, 256, 0, 0), 19 }, + { conv_key(80, 28, 16, 256, 128, 0, 0), 29 }, + { conv_key(80, 28, 16, 512, 256, 0, 0), 8 }, + { conv_key(80, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(80, 30, 17, 512, 128, 0, 0), 7 }, + { conv_key(80, 30, 17, 1024, 128, 0, 0), 18 }, + { conv_key(80, 40, 24, 512, 128, 0, 0), 17 }, + { conv_key(80, 40, 24, 1024, 256, 0, 0), 14 }, + { conv_key(80, 52, 30, 128, 256, 0, 0), 19 }, + { conv_key(80, 52, 30, 192, 256, 0, 0), 19 }, + { conv_key(80, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(80, 52, 30, 256, 128, 0, 0), 17 }, + { conv_key(80, 52, 30, 256, 192, 0, 0), 19 }, + { conv_key(80, 52, 30, 256, 256, 0, 0), 19 }, + { conv_key(80, 52, 30, 256, 448, 0, 0), 8 }, + { conv_key(80, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(80, 52, 30, 256, 768, 0, 0), 8 }, + { conv_key(80, 52, 30, 384, 192, 0, 0), 29 }, + { conv_key(80, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 192, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(80, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 1024, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 1536, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 2048, 0, 0), 29 }, + { conv_key(80, 52, 30, 768, 768, 0, 0), 14 }, + { conv_key(80, 52, 32, 128, 256, 0, 0), 19 }, + { conv_key(80, 52, 32, 256, 128, 0, 0), 28 }, + { conv_key(80, 52, 32, 512, 256, 0, 0), 29 }, + { conv_key(80, 52, 32, 512, 512, 0, 0), 29 }, + { conv_key(80, 60, 34, 512, 128, 0, 0), 14 }, + { conv_key(80, 60, 34, 1024, 128, 0, 0), 1 }, + { conv_key(80, 60, 34, 1024, 256, 0, 0), 14 }, + { conv_key(80, 80, 45, 128, 256, 0, 0), 29 }, + { conv_key(80, 80, 45, 256, 128, 0, 0), 14 }, + { conv_key(80, 80, 45, 256, 512, 0, 0), 14 }, + { conv_key(80, 80, 45, 256, 768, 0, 0), 14 }, + { conv_key(80, 80, 45, 384, 384, 0, 0), 27 }, + { conv_key(80, 80, 45, 512, 256, 0, 0), 14 }, + { conv_key(80, 80, 45, 512, 512, 0, 0), 29 }, + { conv_key(80, 80, 45, 768, 768, 0, 0), 9 }, + { conv_key(80, 80, 45, 1536, 256, 0, 0), 14 }, + { conv_key(80, 80, 48, 128, 256, 0, 0), 29 }, + { conv_key(80, 80, 48, 256, 128, 0, 0), 14 }, + { conv_key(80, 80, 48, 512, 256, 0, 0), 14 }, + { conv_key(80, 80, 48, 512, 512, 0, 0), 9 }, + { conv_key(80, 104, 60, 192, 256, 0, 0), 14 }, + { conv_key(80, 104, 60, 192, 384, 0, 0), 14 }, + { conv_key(80, 104, 60, 256, 192, 0, 0), 14 }, + { conv_key(80, 104, 60, 256, 256, 0, 0), 14 }, + { conv_key(80, 104, 60, 256, 448, 0, 0), 14 }, + { conv_key(80, 104, 60, 256, 512, 0, 0), 14 }, + { conv_key(80, 104, 60, 384, 192, 0, 0), 14 }, + { conv_key(80, 104, 60, 512, 192, 0, 0), 14 }, + { conv_key(80, 104, 60, 512, 512, 0, 0), 14 }, + { conv_key(80, 104, 60, 512, 1024, 0, 0), 14 }, + { conv_key(80, 104, 60, 512, 1536, 0, 0), 9 }, + { conv_key(80, 104, 60, 512, 2048, 0, 0), 9 }, + { conv_key(80, 120, 68, 128, 256, 0, 0), 16 }, + { conv_key(80, 120, 68, 256, 128, 0, 0), 14 }, + { conv_key(80, 120, 68, 256, 512, 0, 0), 9 }, + { conv_key(80, 120, 68, 256, 768, 0, 0), 21 }, + { conv_key(80, 120, 68, 384, 384, 0, 0), 11 }, + { conv_key(80, 120, 68, 512, 128, 0, 0), 14 }, + { conv_key(80, 120, 68, 512, 256, 0, 0), 14 }, + { conv_key(80, 120, 68, 512, 512, 0, 0), 14 }, + { conv_key(80, 120, 68, 768, 768, 0, 0), 9 }, + { conv_key(80, 120, 68, 1024, 256, 0, 0), 14 }, + { conv_key(80, 120, 68, 1536, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 192, 256, 0, 0), 11 }, + { conv_key(80, 160, 90, 192, 384, 0, 0), 11 }, + { conv_key(80, 160, 90, 256, 192, 0, 0), 14 }, + { conv_key(80, 160, 90, 256, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 256, 448, 0, 0), 14 }, + { conv_key(80, 160, 90, 256, 512, 0, 0), 14 }, + { conv_key(80, 160, 90, 384, 192, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 192, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 512, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 1024, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 1536, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 2048, 0, 0), 14 }, + { conv_key(80, 240, 135, 128, 256, 0, 0), 2 }, + { conv_key(80, 240, 135, 256, 128, 0, 0), 14 }, + { conv_key(80, 240, 135, 256, 512, 0, 0), 14 }, + { conv_key(80, 240, 135, 256, 768, 0, 0), 14 }, + { conv_key(80, 240, 135, 384, 384, 0, 0), 14 }, + { conv_key(80, 240, 135, 512, 256, 0, 0), 14 }, + { conv_key(80, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(80, 240, 135, 768, 768, 0, 0), 14 }, + { conv_key(80, 240, 135, 1536, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 128, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 192, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 192, 384, 0, 0), 11 }, + { conv_key(80, 240, 136, 256, 128, 0, 0), 14 }, + { conv_key(80, 240, 136, 256, 192, 0, 0), 14 }, + { conv_key(80, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 256, 448, 0, 0), 14 }, + { conv_key(80, 240, 136, 256, 512, 0, 0), 14 }, + { conv_key(80, 240, 136, 384, 192, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 192, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 512, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 1024, 0, 0), 9 }, + { conv_key(80, 240, 136, 512, 1536, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 2048, 0, 0), 9 }, + { conv_key(80, 480, 270, 192, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 192, 384, 0, 0), 11 }, + { conv_key(80, 480, 270, 256, 192, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 448, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 512, 0, 0), 14 }, + { conv_key(80, 480, 270, 384, 192, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 192, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 512, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 1024, 0, 0), 20 }, + { conv_key(80, 480, 270, 512, 1536, 0, 0), 20 }, + { conv_key(80, 480, 270, 512, 2048, 0, 0), 20 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 20, 12, 512, 128, 0, 0), 19 }, + { conv_key(89, 20, 12, 1024, 128, 0, 0), 18 }, + { conv_key(89, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(89, 26, 15, 256, 128, 0, 0), 7 }, + { conv_key(89, 26, 15, 256, 512, 0, 0), 8 }, + { conv_key(89, 26, 15, 256, 768, 0, 0), 8 }, + { conv_key(89, 26, 15, 384, 384, 0, 0), 19 }, + { conv_key(89, 26, 15, 512, 256, 0, 0), 19 }, + { conv_key(89, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(89, 26, 15, 768, 768, 0, 0), 8 }, + { conv_key(89, 28, 16, 128, 256, 0, 0), 19 }, + { conv_key(89, 28, 16, 256, 128, 0, 0), 8 }, + { conv_key(89, 28, 16, 512, 256, 0, 0), 8 }, + { conv_key(89, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(89, 30, 17, 512, 128, 0, 0), 19 }, + { conv_key(89, 30, 17, 1024, 128, 0, 0), 19 }, + { conv_key(89, 40, 24, 512, 128, 0, 0), 18 }, + { conv_key(89, 40, 24, 1024, 256, 0, 0), 29 }, + { conv_key(89, 52, 30, 128, 256, 0, 0), 8 }, + { conv_key(89, 52, 30, 192, 256, 0, 0), 8 }, + { conv_key(89, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 128, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 192, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 256, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 448, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 768, 0, 0), 8 }, + { conv_key(89, 52, 30, 384, 192, 0, 0), 18 }, + { conv_key(89, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(89, 52, 30, 512, 192, 0, 0), 29 }, + { conv_key(89, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(89, 52, 30, 512, 512, 0, 0), 18 }, + { conv_key(89, 52, 30, 512, 1024, 0, 0), 29 }, + { conv_key(89, 52, 30, 512, 1536, 0, 0), 28 }, + { conv_key(89, 52, 30, 512, 2048, 0, 0), 28 }, + { conv_key(89, 52, 30, 768, 768, 0, 0), 14 }, + { conv_key(89, 52, 32, 128, 256, 0, 0), 19 }, + { conv_key(89, 52, 32, 256, 128, 0, 0), 17 }, + { conv_key(89, 52, 32, 512, 256, 0, 0), 18 }, + { conv_key(89, 52, 32, 512, 512, 0, 0), 18 }, + { conv_key(89, 60, 34, 512, 128, 0, 0), 17 }, + { conv_key(89, 60, 34, 1024, 128, 0, 0), 14 }, + { conv_key(89, 60, 34, 1024, 256, 0, 0), 14 }, + { conv_key(89, 80, 45, 128, 256, 0, 0), 8 }, + { conv_key(89, 80, 45, 256, 128, 0, 0), 7 }, + { conv_key(89, 80, 45, 256, 512, 0, 0), 29 }, + { conv_key(89, 80, 45, 256, 768, 0, 0), 17 }, + { conv_key(89, 80, 45, 384, 384, 0, 0), 14 }, + { conv_key(89, 80, 45, 512, 256, 0, 0), 14 }, + { conv_key(89, 80, 45, 512, 512, 0, 0), 14 }, + { conv_key(89, 80, 45, 768, 768, 0, 0), 14 }, + { conv_key(89, 80, 45, 1536, 256, 0, 0), 14 }, + { conv_key(89, 80, 48, 128, 256, 0, 0), 17 }, + { conv_key(89, 80, 48, 256, 128, 0, 0), 7 }, + { conv_key(89, 80, 48, 512, 256, 0, 0), 14 }, + { conv_key(89, 80, 48, 512, 512, 0, 0), 15 }, + { conv_key(89, 104, 60, 192, 256, 0, 0), 11 }, + { conv_key(89, 104, 60, 192, 384, 0, 0), 11 }, + { conv_key(89, 104, 60, 256, 192, 0, 0), 14 }, + { conv_key(89, 104, 60, 256, 256, 0, 0), 14 }, + { conv_key(89, 104, 60, 256, 448, 0, 0), 14 }, + { conv_key(89, 104, 60, 256, 512, 0, 0), 14 }, + { conv_key(89, 104, 60, 384, 192, 0, 0), 5 }, + { conv_key(89, 104, 60, 512, 192, 0, 0), 14 }, + { conv_key(89, 104, 60, 512, 512, 0, 0), 14 }, + { conv_key(89, 104, 60, 512, 1024, 0, 0), 14 }, + { conv_key(89, 104, 60, 512, 1536, 0, 0), 9 }, + { conv_key(89, 104, 60, 512, 2048, 0, 0), 9 }, + { conv_key(89, 120, 68, 128, 256, 0, 0), 17 }, + { conv_key(89, 120, 68, 256, 128, 0, 0), 14 }, + { conv_key(89, 120, 68, 256, 512, 0, 0), 14 }, + { conv_key(89, 120, 68, 256, 768, 0, 0), 15 }, + { conv_key(89, 120, 68, 384, 384, 0, 0), 14 }, + { conv_key(89, 120, 68, 512, 128, 0, 0), 14 }, + { conv_key(89, 120, 68, 512, 256, 0, 0), 9 }, + { conv_key(89, 120, 68, 512, 512, 0, 0), 9 }, + { conv_key(89, 120, 68, 768, 768, 0, 0), 14 }, + { conv_key(89, 120, 68, 1024, 256, 0, 0), 9 }, + { conv_key(89, 120, 68, 1536, 256, 0, 0), 9 }, + { conv_key(89, 160, 90, 192, 256, 0, 0), 6 }, + { conv_key(89, 160, 90, 192, 384, 0, 0), 14 }, + { conv_key(89, 160, 90, 256, 192, 0, 0), 14 }, + { conv_key(89, 160, 90, 256, 256, 0, 0), 2 }, + { conv_key(89, 160, 90, 256, 448, 0, 0), 14 }, + { conv_key(89, 160, 90, 256, 512, 0, 0), 9 }, + { conv_key(89, 160, 90, 384, 192, 0, 0), 2 }, + { conv_key(89, 160, 90, 512, 192, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 512, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 1024, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 1536, 0, 0), 10 }, + { conv_key(89, 160, 90, 512, 2048, 0, 0), 10 }, + { conv_key(89, 240, 135, 128, 256, 0, 0), 9 }, + { conv_key(89, 240, 135, 256, 128, 0, 0), 14 }, + { conv_key(89, 240, 135, 256, 512, 0, 0), 14 }, + { conv_key(89, 240, 135, 256, 768, 0, 0), 9 }, + { conv_key(89, 240, 135, 384, 384, 0, 0), 14 }, + { conv_key(89, 240, 135, 512, 256, 0, 0), 2 }, + { conv_key(89, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(89, 240, 135, 768, 768, 0, 0), 14 }, + { conv_key(89, 240, 135, 1536, 256, 0, 0), 14 }, + { conv_key(89, 240, 136, 128, 256, 0, 0), 9 }, + { conv_key(89, 240, 136, 192, 256, 0, 0), 12 }, + { conv_key(89, 240, 136, 192, 384, 0, 0), 14 }, + { conv_key(89, 240, 136, 256, 128, 0, 0), 14 }, + { conv_key(89, 240, 136, 256, 192, 0, 0), 14 }, + { conv_key(89, 240, 136, 256, 256, 0, 0), 9 }, + { conv_key(89, 240, 136, 256, 448, 0, 0), 14 }, + { conv_key(89, 240, 136, 256, 512, 0, 0), 9 }, + { conv_key(89, 240, 136, 384, 192, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 192, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 512, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 1024, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 1536, 0, 0), 9 }, + { conv_key(89, 240, 136, 512, 2048, 0, 0), 10 }, + { conv_key(89, 480, 270, 192, 256, 0, 0), 17 }, + { conv_key(89, 480, 270, 192, 384, 0, 0), 17 }, + { conv_key(89, 480, 270, 256, 192, 0, 0), 16 }, + { conv_key(89, 480, 270, 256, 256, 0, 0), 1 }, + { conv_key(89, 480, 270, 256, 448, 0, 0), 1 }, + { conv_key(89, 480, 270, 256, 512, 0, 0), 1 }, + { conv_key(89, 480, 270, 384, 192, 0, 0), 16 }, + { conv_key(89, 480, 270, 512, 192, 0, 0), 16 }, + { conv_key(89, 480, 270, 512, 512, 0, 0), 9 }, + { conv_key(89, 480, 270, 512, 1024, 0, 0), 9 }, + { conv_key(89, 480, 270, 512, 1536, 0, 0), 9 }, + { conv_key(89, 480, 270, 512, 2048, 0, 0), 9 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 20, 12, 512, 128, 0, 0), 8 }, + { conv_key(90, 20, 12, 1024, 128, 0, 0), 8 }, + { conv_key(90, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(90, 26, 15, 256, 128, 0, 0), 8 }, + { conv_key(90, 26, 15, 256, 512, 0, 0), 8 }, + { conv_key(90, 26, 15, 256, 768, 0, 0), 8 }, + { conv_key(90, 26, 15, 384, 384, 0, 0), 8 }, + { conv_key(90, 26, 15, 512, 256, 0, 0), 8 }, + { conv_key(90, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(90, 26, 15, 768, 768, 0, 0), 8 }, + { conv_key(90, 28, 16, 128, 256, 0, 0), 8 }, + { conv_key(90, 28, 16, 256, 128, 0, 0), 8 }, + { conv_key(90, 28, 16, 512, 256, 0, 0), 8 }, + { conv_key(90, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(90, 30, 17, 512, 128, 0, 0), 8 }, + { conv_key(90, 30, 17, 1024, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 512, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 1024, 256, 0, 0), 29 }, + { conv_key(90, 52, 30, 128, 256, 0, 0), 8 }, + { conv_key(90, 52, 30, 192, 256, 0, 0), 8 }, + { conv_key(90, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 128, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 192, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 256, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 448, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 768, 0, 0), 8 }, + { conv_key(90, 52, 30, 384, 192, 0, 0), 29 }, + { conv_key(90, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 192, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 256, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 1024, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 1536, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 2048, 0, 0), 29 }, + { conv_key(90, 52, 30, 768, 768, 0, 0), 30 }, + { conv_key(90, 52, 32, 128, 256, 0, 0), 8 }, + { conv_key(90, 52, 32, 256, 128, 0, 0), 8 }, + { conv_key(90, 52, 32, 512, 256, 0, 0), 29 }, + { conv_key(90, 52, 32, 512, 512, 0, 0), 29 }, + { conv_key(90, 60, 34, 512, 128, 0, 0), 29 }, + { conv_key(90, 60, 34, 1024, 128, 0, 0), 29 }, + { conv_key(90, 60, 34, 1024, 256, 0, 0), 14 }, + { conv_key(90, 80, 45, 128, 256, 0, 0), 8 }, + { conv_key(90, 80, 45, 256, 128, 0, 0), 29 }, + { conv_key(90, 80, 45, 256, 512, 0, 0), 29 }, + { conv_key(90, 80, 45, 256, 768, 0, 0), 29 }, + { conv_key(90, 80, 45, 384, 384, 0, 0), 27 }, + { conv_key(90, 80, 45, 512, 256, 0, 0), 14 }, + { conv_key(90, 80, 45, 512, 512, 0, 0), 30 }, + { conv_key(90, 80, 45, 768, 768, 0, 0), 33 }, + { conv_key(90, 80, 45, 1536, 256, 0, 0), 46 }, + { conv_key(90, 80, 48, 128, 256, 0, 0), 8 }, + { conv_key(90, 80, 48, 256, 128, 0, 0), 29 }, + { conv_key(90, 80, 48, 512, 256, 0, 0), 14 }, + { conv_key(90, 80, 48, 512, 512, 0, 0), 30 }, + { conv_key(90, 104, 60, 192, 256, 0, 0), 30 }, + { conv_key(90, 104, 60, 192, 384, 0, 0), 30 }, + { conv_key(90, 104, 60, 256, 192, 0, 0), 30 }, + { conv_key(90, 104, 60, 256, 256, 0, 0), 30 }, + { conv_key(90, 104, 60, 256, 448, 0, 0), 30 }, + { conv_key(90, 104, 60, 256, 512, 0, 0), 30 }, + { conv_key(90, 104, 60, 384, 192, 0, 0), 32 }, + { conv_key(90, 104, 60, 512, 192, 0, 0), 32 }, + { conv_key(90, 104, 60, 512, 512, 0, 0), 32 }, + { conv_key(90, 104, 60, 512, 1024, 0, 0), 32 }, + { conv_key(90, 104, 60, 512, 1536, 0, 0), 32 }, + { conv_key(90, 104, 60, 512, 2048, 0, 0), 32 }, + { conv_key(90, 120, 68, 128, 256, 0, 0), 29 }, + { conv_key(90, 120, 68, 256, 128, 0, 0), 29 }, + { conv_key(90, 120, 68, 256, 512, 0, 0), 30 }, + { conv_key(90, 120, 68, 256, 768, 0, 0), 30 }, + { conv_key(90, 120, 68, 384, 384, 0, 0), 32 }, + { conv_key(90, 120, 68, 512, 128, 0, 0), 32 }, + { conv_key(90, 120, 68, 512, 256, 0, 0), 32 }, + { conv_key(90, 120, 68, 512, 512, 0, 0), 32 }, + { conv_key(90, 120, 68, 768, 768, 0, 0), 30 }, + { conv_key(90, 120, 68, 1024, 256, 0, 0), 36 }, + { conv_key(90, 120, 68, 1536, 256, 0, 0), 46 }, + { conv_key(90, 160, 90, 192, 256, 0, 0), 28 }, + { conv_key(90, 160, 90, 192, 384, 0, 0), 34 }, + { conv_key(90, 160, 90, 256, 192, 0, 0), 34 }, + { conv_key(90, 160, 90, 256, 256, 0, 0), 34 }, + { conv_key(90, 160, 90, 256, 448, 0, 0), 34 }, + { conv_key(90, 160, 90, 256, 512, 0, 0), 34 }, + { conv_key(90, 160, 90, 384, 192, 0, 0), 14 }, + { conv_key(90, 160, 90, 512, 192, 0, 0), 36 }, + { conv_key(90, 160, 90, 512, 512, 0, 0), 36 }, + { conv_key(90, 160, 90, 512, 1024, 0, 0), 36 }, + { conv_key(90, 160, 90, 512, 1536, 0, 0), 36 }, + { conv_key(90, 160, 90, 512, 2048, 0, 0), 37 }, + { conv_key(90, 240, 135, 128, 256, 0, 0), 35 }, + { conv_key(90, 240, 135, 256, 128, 0, 0), 37 }, + { conv_key(90, 240, 135, 256, 512, 0, 0), 37 }, + { conv_key(90, 240, 135, 256, 768, 0, 0), 33 }, + { conv_key(90, 240, 135, 384, 384, 0, 0), 35 }, + { conv_key(90, 240, 135, 512, 256, 0, 0), 36 }, + { conv_key(90, 240, 135, 512, 512, 0, 0), 36 }, + { conv_key(90, 240, 135, 768, 768, 0, 0), 37 }, + { conv_key(90, 240, 135, 1536, 256, 0, 0), 41 }, + { conv_key(90, 240, 136, 128, 256, 0, 0), 35 }, + { conv_key(90, 240, 136, 192, 256, 0, 0), 11 }, + { conv_key(90, 240, 136, 192, 384, 0, 0), 37 }, + { conv_key(90, 240, 136, 256, 128, 0, 0), 34 }, + { conv_key(90, 240, 136, 256, 192, 0, 0), 37 }, + { conv_key(90, 240, 136, 256, 256, 0, 0), 37 }, + { conv_key(90, 240, 136, 256, 448, 0, 0), 33 }, + { conv_key(90, 240, 136, 256, 512, 0, 0), 37 }, + { conv_key(90, 240, 136, 384, 192, 0, 0), 35 }, + { conv_key(90, 240, 136, 512, 192, 0, 0), 36 }, + { conv_key(90, 240, 136, 512, 256, 0, 0), 36 }, + { conv_key(90, 240, 136, 512, 512, 0, 0), 36 }, + { conv_key(90, 240, 136, 512, 1024, 0, 0), 36 }, + { conv_key(90, 240, 136, 512, 1536, 0, 0), 36 }, + { conv_key(90, 240, 136, 512, 2048, 0, 0), 37 }, + { conv_key(90, 480, 270, 192, 256, 0, 0), 37 }, + { conv_key(90, 480, 270, 192, 384, 0, 0), 37 }, + { conv_key(90, 480, 270, 256, 192, 0, 0), 37 }, + { conv_key(90, 480, 270, 256, 256, 0, 0), 33 }, + { conv_key(90, 480, 270, 256, 448, 0, 0), 33 }, + { conv_key(90, 480, 270, 256, 512, 0, 0), 37 }, + { conv_key(90, 480, 270, 384, 192, 0, 0), 35 }, + { conv_key(90, 480, 270, 512, 192, 0, 0), 36 }, + { conv_key(90, 480, 270, 512, 512, 0, 0), 36 }, + { conv_key(90, 480, 270, 512, 1024, 0, 0), 32 }, + { conv_key(90, 480, 270, 512, 1536, 0, 0), 36 }, + { conv_key(90, 480, 270, 512, 2048, 0, 0), 37 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 20, 12, 512, 128, 0, 0), 8 }, + { conv_key(100, 20, 12, 1024, 128, 0, 0), 8 }, + { conv_key(100, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(100, 26, 15, 256, 128, 0, 0), 26 }, + { conv_key(100, 26, 15, 256, 512, 0, 0), 8 }, + { conv_key(100, 26, 15, 256, 768, 0, 0), 8 }, + { conv_key(100, 26, 15, 384, 384, 0, 0), 19 }, + { conv_key(100, 26, 15, 512, 256, 0, 0), 8 }, + { conv_key(100, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(100, 26, 15, 768, 768, 0, 0), 8 }, + { conv_key(100, 28, 16, 128, 256, 0, 0), 18 }, + { conv_key(100, 28, 16, 256, 128, 0, 0), 18 }, + { conv_key(100, 28, 16, 512, 256, 0, 0), 29 }, + { conv_key(100, 28, 16, 512, 512, 0, 0), 19 }, + { conv_key(100, 30, 17, 512, 128, 0, 0), 8 }, + { conv_key(100, 30, 17, 1024, 128, 0, 0), 82 }, + { conv_key(100, 40, 24, 512, 128, 0, 0), 53 }, + { conv_key(100, 40, 24, 1024, 256, 0, 0), 58 }, + { conv_key(100, 52, 30, 128, 256, 0, 0), 28 }, + { conv_key(100, 52, 30, 192, 256, 0, 0), 7 }, + { conv_key(100, 52, 30, 192, 384, 0, 0), 19 }, + { conv_key(100, 52, 30, 256, 128, 0, 0), 29 }, + { conv_key(100, 52, 30, 256, 192, 0, 0), 8 }, + { conv_key(100, 52, 30, 256, 256, 0, 0), 8 }, + { conv_key(100, 52, 30, 256, 448, 0, 0), 8 }, + { conv_key(100, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(100, 52, 30, 256, 768, 0, 0), 8 }, + { conv_key(100, 52, 30, 384, 192, 0, 0), 25 }, + { conv_key(100, 52, 30, 384, 384, 0, 0), 28 }, + { conv_key(100, 52, 30, 512, 192, 0, 0), 5 }, + { conv_key(100, 52, 30, 512, 256, 0, 0), 17 }, + { conv_key(100, 52, 30, 512, 512, 0, 0), 28 }, + { conv_key(100, 52, 30, 512, 1024, 0, 0), 87 }, + { conv_key(100, 52, 30, 512, 1536, 0, 0), 58 }, + { conv_key(100, 52, 30, 512, 2048, 0, 0), 42 }, + { conv_key(100, 52, 30, 768, 768, 0, 0), 58 }, + { conv_key(100, 52, 32, 128, 256, 0, 0), 28 }, + { conv_key(100, 52, 32, 256, 128, 0, 0), 17 }, + { conv_key(100, 52, 32, 512, 256, 0, 0), 8 }, + { conv_key(100, 52, 32, 512, 512, 0, 0), 28 }, + { conv_key(100, 60, 34, 512, 128, 0, 0), 63 }, + { conv_key(100, 60, 34, 1024, 128, 0, 0), 92 }, + { conv_key(100, 60, 34, 1024, 256, 0, 0), 58 }, + { conv_key(100, 80, 45, 128, 256, 0, 0), 8 }, + { conv_key(100, 80, 45, 256, 128, 0, 0), 7 }, + { conv_key(100, 80, 45, 256, 512, 0, 0), 28 }, + { conv_key(100, 80, 45, 256, 768, 0, 0), 82 }, + { conv_key(100, 80, 45, 384, 384, 0, 0), 63 }, + { conv_key(100, 80, 45, 512, 256, 0, 0), 27 }, + { conv_key(100, 80, 45, 512, 512, 0, 0), 87 }, + { conv_key(100, 80, 45, 768, 768, 0, 0), 68 }, + { conv_key(100, 80, 45, 1536, 256, 0, 0), 46 }, + { conv_key(100, 80, 48, 128, 256, 0, 0), 17 }, + { conv_key(100, 80, 48, 256, 128, 0, 0), 5 }, + { conv_key(100, 80, 48, 512, 256, 0, 0), 27 }, + { conv_key(100, 80, 48, 512, 512, 0, 0), 87 }, + { conv_key(100, 104, 60, 192, 256, 0, 0), 8 }, + { conv_key(100, 104, 60, 192, 384, 0, 0), 8 }, + { conv_key(100, 104, 60, 256, 192, 0, 0), 27 }, + { conv_key(100, 104, 60, 256, 256, 0, 0), 27 }, + { conv_key(100, 104, 60, 256, 448, 0, 0), 87 }, + { conv_key(100, 104, 60, 256, 512, 0, 0), 87 }, + { conv_key(100, 104, 60, 384, 192, 0, 0), 24 }, + { conv_key(100, 104, 60, 512, 192, 0, 0), 29 }, + { conv_key(100, 104, 60, 512, 512, 0, 0), 63 }, + { conv_key(100, 104, 60, 512, 1024, 0, 0), 46 }, + { conv_key(100, 104, 60, 512, 1536, 0, 0), 40 }, + { conv_key(100, 104, 60, 512, 2048, 0, 0), 40 }, + { conv_key(100, 120, 68, 128, 256, 0, 0), 29 }, + { conv_key(100, 120, 68, 256, 128, 0, 0), 13 }, + { conv_key(100, 120, 68, 256, 512, 0, 0), 63 }, + { conv_key(100, 120, 68, 256, 768, 0, 0), 58 }, + { conv_key(100, 120, 68, 384, 384, 0, 0), 59 }, + { conv_key(100, 120, 68, 512, 128, 0, 0), 58 }, + { conv_key(100, 120, 68, 512, 256, 0, 0), 87 }, + { conv_key(100, 120, 68, 512, 512, 0, 0), 68 }, + { conv_key(100, 120, 68, 768, 768, 0, 0), 70 }, + { conv_key(100, 120, 68, 1024, 256, 0, 0), 63 }, + { conv_key(100, 120, 68, 1536, 256, 0, 0), 76 }, + { conv_key(100, 160, 90, 192, 256, 0, 0), 92 }, + { conv_key(100, 160, 90, 192, 384, 0, 0), 63 }, + { conv_key(100, 160, 90, 256, 192, 0, 0), 87 }, + { conv_key(100, 160, 90, 256, 256, 0, 0), 58 }, + { conv_key(100, 160, 90, 256, 448, 0, 0), 69 }, + { conv_key(100, 160, 90, 256, 512, 0, 0), 63 }, + { conv_key(100, 160, 90, 384, 192, 0, 0), 68 }, + { conv_key(100, 160, 90, 512, 192, 0, 0), 63 }, + { conv_key(100, 160, 90, 512, 512, 0, 0), 50 }, + { conv_key(100, 160, 90, 512, 1024, 0, 0), 71 }, + { conv_key(100, 160, 90, 512, 1536, 0, 0), 46 }, + { conv_key(100, 160, 90, 512, 2048, 0, 0), 47 }, + { conv_key(100, 240, 135, 128, 256, 0, 0), 58 }, + { conv_key(100, 240, 135, 256, 128, 0, 0), 92 }, + { conv_key(100, 240, 135, 256, 512, 0, 0), 75 }, + { conv_key(100, 240, 135, 256, 768, 0, 0), 69 }, + { conv_key(100, 240, 135, 384, 384, 0, 0), 77 }, + { conv_key(100, 240, 135, 512, 256, 0, 0), 76 }, + { conv_key(100, 240, 135, 512, 512, 0, 0), 76 }, + { conv_key(100, 240, 135, 768, 768, 0, 0), 77 }, + { conv_key(100, 240, 135, 1536, 256, 0, 0), 75 }, + { conv_key(100, 240, 136, 128, 256, 0, 0), 87 }, + { conv_key(100, 240, 136, 192, 256, 0, 0), 75 }, + { conv_key(100, 240, 136, 192, 384, 0, 0), 75 }, + { conv_key(100, 240, 136, 256, 128, 0, 0), 63 }, + { conv_key(100, 240, 136, 256, 192, 0, 0), 63 }, + { conv_key(100, 240, 136, 256, 256, 0, 0), 63 }, + { conv_key(100, 240, 136, 256, 448, 0, 0), 75 }, + { conv_key(100, 240, 136, 256, 512, 0, 0), 75 }, + { conv_key(100, 240, 136, 384, 192, 0, 0), 76 }, + { conv_key(100, 240, 136, 512, 192, 0, 0), 76 }, + { conv_key(100, 240, 136, 512, 256, 0, 0), 76 }, + { conv_key(100, 240, 136, 512, 512, 0, 0), 76 }, + { conv_key(100, 240, 136, 512, 1024, 0, 0), 68 }, + { conv_key(100, 240, 136, 512, 1536, 0, 0), 75 }, + { conv_key(100, 240, 136, 512, 2048, 0, 0), 68 }, + { conv_key(100, 480, 270, 192, 256, 0, 0), 75 }, + { conv_key(100, 480, 270, 192, 384, 0, 0), 75 }, + { conv_key(100, 480, 270, 256, 192, 0, 0), 75 }, + { conv_key(100, 480, 270, 256, 256, 0, 0), 75 }, + { conv_key(100, 480, 270, 256, 448, 0, 0), 75 }, + { conv_key(100, 480, 270, 256, 512, 0, 0), 75 }, + { conv_key(100, 480, 270, 384, 192, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 192, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 512, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 1024, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 1536, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 2048, 0, 0), 68 }, +#endif +}; + +at::Tensor conv1x1_bias(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + return out + bias.reshape({ 1, -1, 1, 1 }); + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass(out_buf, feature, weight, bias); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS, HINT_MAP_BIAS_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut.cu new file mode 100644 index 0000000..9d706e8 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut.cu @@ -0,0 +1,247 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_SHORTCUT_NAME = "HINT_MAP_BIAS_SHORTCUT"; +std::unordered_map HINT_MAP_BIAS_SHORTCUT = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 7, 4, 128, 64, 0, 0), 19 }, { conv_key(80, 7, 4, 128, 128, 0, 0), 8 }, + { conv_key(80, 13, 8, 128, 64, 0, 0), 8 }, { conv_key(80, 13, 8, 128, 128, 0, 0), 19 }, + { conv_key(80, 14, 8, 128, 64, 0, 0), 8 }, { conv_key(80, 14, 8, 128, 128, 0, 0), 7 }, + { conv_key(80, 14, 8, 256, 256, 0, 0), 8 }, { conv_key(80, 20, 12, 128, 64, 0, 0), 8 }, + { conv_key(80, 20, 12, 128, 128, 0, 0), 19 }, { conv_key(80, 26, 15, 256, 128, 0, 0), 19 }, + { conv_key(80, 26, 15, 384, 192, 0, 0), 8 }, { conv_key(80, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(80, 26, 15, 768, 768, 0, 0), 8 }, { conv_key(80, 26, 16, 128, 64, 0, 0), 8 }, + { conv_key(80, 26, 16, 128, 128, 0, 0), 8 }, { conv_key(80, 26, 16, 256, 256, 0, 0), 8 }, + { conv_key(80, 28, 16, 128, 64, 0, 0), 5 }, { conv_key(80, 28, 16, 128, 128, 0, 0), 29 }, + { conv_key(80, 28, 16, 256, 256, 0, 0), 8 }, { conv_key(80, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(80, 30, 17, 128, 64, 0, 0), 8 }, { conv_key(80, 30, 17, 128, 128, 0, 0), 19 }, + { conv_key(80, 40, 24, 128, 64, 0, 0), 19 }, { conv_key(80, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(80, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(80, 52, 30, 192, 192, 0, 0), 19 }, + { conv_key(80, 52, 30, 256, 128, 0, 0), 19 }, { conv_key(80, 52, 30, 256, 256, 0, 0), 19 }, + { conv_key(80, 52, 30, 384, 192, 0, 0), 29 }, { conv_key(80, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 256, 0, 0), 18 }, { conv_key(80, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(80, 52, 30, 768, 768, 0, 0), 14 }, { conv_key(80, 52, 32, 128, 64, 0, 0), 19 }, + { conv_key(80, 52, 32, 128, 128, 0, 0), 8 }, { conv_key(80, 52, 32, 256, 256, 0, 0), 8 }, + { conv_key(80, 52, 32, 512, 512, 0, 0), 29 }, { conv_key(80, 60, 34, 128, 64, 0, 0), 7 }, + { conv_key(80, 60, 34, 128, 128, 0, 0), 19 }, { conv_key(80, 60, 34, 256, 256, 0, 0), 29 }, + { conv_key(80, 80, 45, 256, 128, 0, 0), 14 }, { conv_key(80, 80, 45, 384, 192, 0, 0), 24 }, + { conv_key(80, 80, 45, 512, 512, 0, 0), 29 }, { conv_key(80, 80, 45, 768, 768, 0, 0), 9 }, + { conv_key(80, 80, 48, 128, 64, 0, 0), 29 }, { conv_key(80, 80, 48, 128, 128, 0, 0), 18 }, + { conv_key(80, 80, 48, 256, 256, 0, 0), 14 }, { conv_key(80, 80, 48, 512, 512, 0, 0), 29 }, + { conv_key(80, 104, 60, 192, 192, 0, 0), 11 }, { conv_key(80, 104, 60, 256, 128, 0, 0), 14 }, + { conv_key(80, 104, 60, 256, 256, 0, 0), 14 }, { conv_key(80, 104, 60, 384, 384, 0, 0), 14 }, + { conv_key(80, 104, 60, 512, 256, 0, 0), 14 }, { conv_key(80, 104, 60, 512, 512, 0, 0), 10 }, + { conv_key(80, 120, 68, 128, 64, 0, 0), 7 }, { conv_key(80, 120, 68, 128, 128, 0, 0), 14 }, + { conv_key(80, 120, 68, 256, 128, 0, 0), 5 }, { conv_key(80, 120, 68, 256, 256, 0, 0), 9 }, + { conv_key(80, 120, 68, 384, 192, 0, 0), 9 }, { conv_key(80, 120, 68, 512, 512, 0, 0), 14 }, + { conv_key(80, 120, 68, 768, 768, 0, 0), 14 }, { conv_key(80, 160, 90, 192, 192, 0, 0), 11 }, + { conv_key(80, 160, 90, 256, 128, 0, 0), 14 }, { conv_key(80, 160, 90, 256, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 384, 384, 0, 0), 14 }, { conv_key(80, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 512, 0, 0), 14 }, { conv_key(80, 240, 135, 256, 128, 0, 0), 14 }, + { conv_key(80, 240, 135, 384, 192, 0, 0), 14 }, { conv_key(80, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(80, 240, 135, 768, 768, 0, 0), 14 }, { conv_key(80, 240, 136, 128, 64, 0, 0), 2 }, + { conv_key(80, 240, 136, 128, 128, 0, 0), 2 }, { conv_key(80, 240, 136, 192, 192, 0, 0), 11 }, + { conv_key(80, 240, 136, 256, 128, 0, 0), 14 }, { conv_key(80, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 384, 384, 0, 0), 14 }, { conv_key(80, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 512, 0, 0), 14 }, { conv_key(80, 480, 270, 192, 192, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 128, 0, 0), 14 }, { conv_key(80, 480, 270, 256, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 384, 384, 0, 0), 14 }, { conv_key(80, 480, 270, 512, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 512, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 7, 4, 128, 64, 0, 0), 17 }, { conv_key(89, 7, 4, 128, 128, 0, 0), 29 }, + { conv_key(89, 13, 8, 128, 64, 0, 0), 29 }, { conv_key(89, 13, 8, 128, 128, 0, 0), 19 }, + { conv_key(89, 14, 8, 128, 64, 0, 0), 17 }, { conv_key(89, 14, 8, 128, 128, 0, 0), 19 }, + { conv_key(89, 14, 8, 256, 256, 0, 0), 8 }, { conv_key(89, 20, 12, 128, 64, 0, 0), 29 }, + { conv_key(89, 20, 12, 128, 128, 0, 0), 19 }, { conv_key(89, 26, 15, 256, 128, 0, 0), 19 }, + { conv_key(89, 26, 15, 384, 192, 0, 0), 18 }, { conv_key(89, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(89, 26, 15, 768, 768, 0, 0), 8 }, { conv_key(89, 26, 16, 128, 64, 0, 0), 19 }, + { conv_key(89, 26, 16, 128, 128, 0, 0), 8 }, { conv_key(89, 26, 16, 256, 256, 0, 0), 8 }, + { conv_key(89, 28, 16, 128, 64, 0, 0), 8 }, { conv_key(89, 28, 16, 128, 128, 0, 0), 19 }, + { conv_key(89, 28, 16, 256, 256, 0, 0), 19 }, { conv_key(89, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(89, 30, 17, 128, 64, 0, 0), 5 }, { conv_key(89, 30, 17, 128, 128, 0, 0), 7 }, + { conv_key(89, 40, 24, 128, 64, 0, 0), 29 }, { conv_key(89, 40, 24, 128, 128, 0, 0), 7 }, + { conv_key(89, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(89, 52, 30, 192, 192, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 128, 0, 0), 8 }, { conv_key(89, 52, 30, 256, 256, 0, 0), 8 }, + { conv_key(89, 52, 30, 384, 192, 0, 0), 29 }, { conv_key(89, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(89, 52, 30, 512, 256, 0, 0), 18 }, { conv_key(89, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(89, 52, 30, 768, 768, 0, 0), 14 }, { conv_key(89, 52, 32, 128, 64, 0, 0), 29 }, + { conv_key(89, 52, 32, 128, 128, 0, 0), 8 }, { conv_key(89, 52, 32, 256, 256, 0, 0), 8 }, + { conv_key(89, 52, 32, 512, 512, 0, 0), 18 }, { conv_key(89, 60, 34, 128, 64, 0, 0), 17 }, + { conv_key(89, 60, 34, 128, 128, 0, 0), 19 }, { conv_key(89, 60, 34, 256, 256, 0, 0), 18 }, + { conv_key(89, 80, 45, 256, 128, 0, 0), 7 }, { conv_key(89, 80, 45, 384, 192, 0, 0), 7 }, + { conv_key(89, 80, 45, 512, 512, 0, 0), 15 }, { conv_key(89, 80, 45, 768, 768, 0, 0), 14 }, + { conv_key(89, 80, 48, 128, 64, 0, 0), 8 }, { conv_key(89, 80, 48, 128, 128, 0, 0), 19 }, + { conv_key(89, 80, 48, 256, 256, 0, 0), 17 }, { conv_key(89, 80, 48, 512, 512, 0, 0), 15 }, + { conv_key(89, 104, 60, 192, 192, 0, 0), 7 }, { conv_key(89, 104, 60, 256, 128, 0, 0), 5 }, + { conv_key(89, 104, 60, 256, 256, 0, 0), 14 }, { conv_key(89, 104, 60, 384, 384, 0, 0), 14 }, + { conv_key(89, 104, 60, 512, 256, 0, 0), 14 }, { conv_key(89, 104, 60, 512, 512, 0, 0), 14 }, + { conv_key(89, 120, 68, 128, 64, 0, 0), 7 }, { conv_key(89, 120, 68, 128, 128, 0, 0), 7 }, + { conv_key(89, 120, 68, 256, 128, 0, 0), 5 }, { conv_key(89, 120, 68, 256, 256, 0, 0), 15 }, + { conv_key(89, 120, 68, 384, 192, 0, 0), 14 }, { conv_key(89, 120, 68, 512, 512, 0, 0), 9 }, + { conv_key(89, 120, 68, 768, 768, 0, 0), 14 }, { conv_key(89, 160, 90, 192, 192, 0, 0), 14 }, + { conv_key(89, 160, 90, 256, 128, 0, 0), 14 }, { conv_key(89, 160, 90, 256, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 384, 384, 0, 0), 14 }, { conv_key(89, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 512, 0, 0), 9 }, { conv_key(89, 240, 135, 256, 128, 0, 0), 14 }, + { conv_key(89, 240, 135, 384, 192, 0, 0), 14 }, { conv_key(89, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(89, 240, 135, 768, 768, 0, 0), 14 }, { conv_key(89, 240, 136, 128, 64, 0, 0), 5 }, + { conv_key(89, 240, 136, 128, 128, 0, 0), 9 }, { conv_key(89, 240, 136, 192, 192, 0, 0), 14 }, + { conv_key(89, 240, 136, 256, 128, 0, 0), 14 }, { conv_key(89, 240, 136, 256, 256, 0, 0), 9 }, + { conv_key(89, 240, 136, 384, 384, 0, 0), 9 }, { conv_key(89, 240, 136, 512, 256, 0, 0), 2 }, + { conv_key(89, 240, 136, 512, 512, 0, 0), 14 }, { conv_key(89, 480, 270, 192, 192, 0, 0), 5 }, + { conv_key(89, 480, 270, 256, 128, 0, 0), 7 }, { conv_key(89, 480, 270, 256, 256, 0, 0), 1 }, + { conv_key(89, 480, 270, 384, 384, 0, 0), 9 }, { conv_key(89, 480, 270, 512, 256, 0, 0), 10 }, + { conv_key(89, 480, 270, 512, 512, 0, 0), 10 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 7, 4, 128, 64, 0, 0), 8 }, { conv_key(90, 7, 4, 128, 128, 0, 0), 8 }, + { conv_key(90, 13, 8, 128, 64, 0, 0), 8 }, { conv_key(90, 13, 8, 128, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 128, 64, 0, 0), 8 }, { conv_key(90, 14, 8, 128, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 256, 256, 0, 0), 8 }, { conv_key(90, 20, 12, 128, 64, 0, 0), 8 }, + { conv_key(90, 20, 12, 128, 128, 0, 0), 8 }, { conv_key(90, 26, 15, 256, 128, 0, 0), 8 }, + { conv_key(90, 26, 15, 384, 192, 0, 0), 8 }, { conv_key(90, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(90, 26, 15, 768, 768, 0, 0), 8 }, { conv_key(90, 26, 16, 128, 64, 0, 0), 8 }, + { conv_key(90, 26, 16, 128, 128, 0, 0), 8 }, { conv_key(90, 26, 16, 256, 256, 0, 0), 8 }, + { conv_key(90, 28, 16, 128, 64, 0, 0), 8 }, { conv_key(90, 28, 16, 128, 128, 0, 0), 8 }, + { conv_key(90, 28, 16, 256, 256, 0, 0), 8 }, { conv_key(90, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(90, 30, 17, 128, 64, 0, 0), 8 }, { conv_key(90, 30, 17, 128, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 128, 64, 0, 0), 8 }, { conv_key(90, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(90, 52, 30, 192, 192, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 128, 0, 0), 8 }, { conv_key(90, 52, 30, 256, 256, 0, 0), 8 }, + { conv_key(90, 52, 30, 384, 192, 0, 0), 29 }, { conv_key(90, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 256, 0, 0), 29 }, { conv_key(90, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(90, 52, 30, 768, 768, 0, 0), 30 }, { conv_key(90, 52, 32, 128, 64, 0, 0), 8 }, + { conv_key(90, 52, 32, 128, 128, 0, 0), 8 }, { conv_key(90, 52, 32, 256, 256, 0, 0), 8 }, + { conv_key(90, 52, 32, 512, 512, 0, 0), 29 }, { conv_key(90, 60, 34, 128, 64, 0, 0), 8 }, + { conv_key(90, 60, 34, 128, 128, 0, 0), 8 }, { conv_key(90, 60, 34, 256, 256, 0, 0), 8 }, + { conv_key(90, 80, 45, 256, 128, 0, 0), 29 }, { conv_key(90, 80, 45, 384, 192, 0, 0), 31 }, + { conv_key(90, 80, 45, 512, 512, 0, 0), 30 }, { conv_key(90, 80, 45, 768, 768, 0, 0), 32 }, + { conv_key(90, 80, 48, 128, 64, 0, 0), 8 }, { conv_key(90, 80, 48, 128, 128, 0, 0), 8 }, + { conv_key(90, 80, 48, 256, 256, 0, 0), 29 }, { conv_key(90, 80, 48, 512, 512, 0, 0), 30 }, + { conv_key(90, 104, 60, 192, 192, 0, 0), 30 }, { conv_key(90, 104, 60, 256, 128, 0, 0), 30 }, + { conv_key(90, 104, 60, 256, 256, 0, 0), 30 }, { conv_key(90, 104, 60, 384, 384, 0, 0), 32 }, + { conv_key(90, 104, 60, 512, 256, 0, 0), 32 }, { conv_key(90, 104, 60, 512, 512, 0, 0), 32 }, + { conv_key(90, 120, 68, 128, 64, 0, 0), 29 }, { conv_key(90, 120, 68, 128, 128, 0, 0), 29 }, + { conv_key(90, 120, 68, 256, 128, 0, 0), 30 }, { conv_key(90, 120, 68, 256, 256, 0, 0), 30 }, + { conv_key(90, 120, 68, 384, 192, 0, 0), 29 }, { conv_key(90, 120, 68, 512, 512, 0, 0), 32 }, + { conv_key(90, 120, 68, 768, 768, 0, 0), 30 }, { conv_key(90, 160, 90, 192, 192, 0, 0), 28 }, + { conv_key(90, 160, 90, 256, 128, 0, 0), 34 }, { conv_key(90, 160, 90, 256, 256, 0, 0), 34 }, + { conv_key(90, 160, 90, 384, 384, 0, 0), 36 }, { conv_key(90, 160, 90, 512, 256, 0, 0), 36 }, + { conv_key(90, 160, 90, 512, 512, 0, 0), 32 }, { conv_key(90, 240, 135, 256, 128, 0, 0), 34 }, + { conv_key(90, 240, 135, 384, 192, 0, 0), 35 }, { conv_key(90, 240, 135, 512, 512, 0, 0), 37 }, + { conv_key(90, 240, 135, 768, 768, 0, 0), 37 }, { conv_key(90, 240, 136, 128, 64, 0, 0), 11 }, + { conv_key(90, 240, 136, 128, 128, 0, 0), 27 }, { conv_key(90, 240, 136, 192, 192, 0, 0), 34 }, + { conv_key(90, 240, 136, 256, 128, 0, 0), 34 }, { conv_key(90, 240, 136, 256, 256, 0, 0), 30 }, + { conv_key(90, 240, 136, 384, 384, 0, 0), 31 }, { conv_key(90, 240, 136, 512, 256, 0, 0), 32 }, + { conv_key(90, 240, 136, 512, 512, 0, 0), 32 }, { conv_key(90, 480, 270, 192, 192, 0, 0), 30 }, + { conv_key(90, 480, 270, 256, 128, 0, 0), 30 }, { conv_key(90, 480, 270, 256, 256, 0, 0), 30 }, + { conv_key(90, 480, 270, 384, 384, 0, 0), 35 }, { conv_key(90, 480, 270, 512, 256, 0, 0), 35 }, + { conv_key(90, 480, 270, 512, 512, 0, 0), 37 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 7, 4, 128, 64, 0, 0), 23 }, + { conv_key(100, 7, 4, 128, 128, 0, 0), 6 }, + { conv_key(100, 13, 8, 128, 64, 0, 0), 28 }, + { conv_key(100, 13, 8, 128, 128, 0, 0), 8 }, + { conv_key(100, 14, 8, 128, 64, 0, 0), 7 }, + { conv_key(100, 14, 8, 128, 128, 0, 0), 29 }, + { conv_key(100, 14, 8, 256, 256, 0, 0), 7 }, + { conv_key(100, 20, 12, 128, 64, 0, 0), 18 }, + { conv_key(100, 20, 12, 128, 128, 0, 0), 7 }, + { conv_key(100, 26, 15, 256, 128, 0, 0), 18 }, + { conv_key(100, 26, 15, 384, 192, 0, 0), 19 }, + { conv_key(100, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(100, 26, 15, 768, 768, 0, 0), 8 }, + { conv_key(100, 26, 16, 128, 64, 0, 0), 26 }, + { conv_key(100, 26, 16, 128, 128, 0, 0), 19 }, + { conv_key(100, 26, 16, 256, 256, 0, 0), 18 }, + { conv_key(100, 28, 16, 128, 64, 0, 0), 13 }, + { conv_key(100, 28, 16, 128, 128, 0, 0), 19 }, + { conv_key(100, 28, 16, 256, 256, 0, 0), 19 }, + { conv_key(100, 28, 16, 512, 512, 0, 0), 19 }, + { conv_key(100, 30, 17, 128, 64, 0, 0), 19 }, + { conv_key(100, 30, 17, 128, 128, 0, 0), 29 }, + { conv_key(100, 40, 24, 128, 64, 0, 0), 29 }, + { conv_key(100, 40, 24, 128, 128, 0, 0), 29 }, + { conv_key(100, 40, 24, 256, 256, 0, 0), 17 }, + { conv_key(100, 52, 30, 192, 192, 0, 0), 28 }, + { conv_key(100, 52, 30, 256, 128, 0, 0), 7 }, + { conv_key(100, 52, 30, 256, 256, 0, 0), 18 }, + { conv_key(100, 52, 30, 384, 192, 0, 0), 18 }, + { conv_key(100, 52, 30, 384, 384, 0, 0), 8 }, + { conv_key(100, 52, 30, 512, 256, 0, 0), 29 }, + { conv_key(100, 52, 30, 512, 512, 0, 0), 53 }, + { conv_key(100, 52, 30, 768, 768, 0, 0), 58 }, + { conv_key(100, 52, 32, 128, 64, 0, 0), 17 }, + { conv_key(100, 52, 32, 128, 128, 0, 0), 7 }, + { conv_key(100, 52, 32, 256, 256, 0, 0), 18 }, + { conv_key(100, 52, 32, 512, 512, 0, 0), 53 }, + { conv_key(100, 60, 34, 128, 64, 0, 0), 19 }, + { conv_key(100, 60, 34, 128, 128, 0, 0), 7 }, + { conv_key(100, 60, 34, 256, 256, 0, 0), 17 }, + { conv_key(100, 80, 45, 256, 128, 0, 0), 18 }, + { conv_key(100, 80, 45, 384, 192, 0, 0), 58 }, + { conv_key(100, 80, 45, 512, 512, 0, 0), 53 }, + { conv_key(100, 80, 45, 768, 768, 0, 0), 70 }, + { conv_key(100, 80, 48, 128, 64, 0, 0), 8 }, + { conv_key(100, 80, 48, 128, 128, 0, 0), 7 }, + { conv_key(100, 80, 48, 256, 256, 0, 0), 28 }, + { conv_key(100, 80, 48, 512, 512, 0, 0), 58 }, + { conv_key(100, 104, 60, 192, 192, 0, 0), 8 }, + { conv_key(100, 104, 60, 256, 128, 0, 0), 29 }, + { conv_key(100, 104, 60, 256, 256, 0, 0), 29 }, + { conv_key(100, 104, 60, 384, 384, 0, 0), 82 }, + { conv_key(100, 104, 60, 512, 256, 0, 0), 87 }, + { conv_key(100, 104, 60, 512, 512, 0, 0), 68 }, + { conv_key(100, 120, 68, 128, 64, 0, 0), 18 }, + { conv_key(100, 120, 68, 128, 128, 0, 0), 26 }, + { conv_key(100, 120, 68, 256, 128, 0, 0), 29 }, + { conv_key(100, 120, 68, 256, 256, 0, 0), 29 }, + { conv_key(100, 120, 68, 384, 192, 0, 0), 58 }, + { conv_key(100, 120, 68, 512, 512, 0, 0), 92 }, + { conv_key(100, 120, 68, 768, 768, 0, 0), 69 }, + { conv_key(100, 160, 90, 192, 192, 0, 0), 87 }, + { conv_key(100, 160, 90, 256, 128, 0, 0), 63 }, + { conv_key(100, 160, 90, 256, 256, 0, 0), 92 }, + { conv_key(100, 160, 90, 384, 384, 0, 0), 68 }, + { conv_key(100, 160, 90, 512, 256, 0, 0), 75 }, + { conv_key(100, 160, 90, 512, 512, 0, 0), 76 }, + { conv_key(100, 240, 135, 256, 128, 0, 0), 75 }, + { conv_key(100, 240, 135, 384, 192, 0, 0), 75 }, + { conv_key(100, 240, 135, 512, 512, 0, 0), 76 }, + { conv_key(100, 240, 135, 768, 768, 0, 0), 77 }, + { conv_key(100, 240, 136, 128, 64, 0, 0), 58 }, + { conv_key(100, 240, 136, 128, 128, 0, 0), 82 }, + { conv_key(100, 240, 136, 192, 192, 0, 0), 75 }, + { conv_key(100, 240, 136, 256, 128, 0, 0), 75 }, + { conv_key(100, 240, 136, 256, 256, 0, 0), 75 }, + { conv_key(100, 240, 136, 384, 384, 0, 0), 68 }, + { conv_key(100, 240, 136, 512, 256, 0, 0), 76 }, + { conv_key(100, 240, 136, 512, 512, 0, 0), 76 }, + { conv_key(100, 480, 270, 192, 192, 0, 0), 75 }, + { conv_key(100, 480, 270, 256, 128, 0, 0), 92 }, + { conv_key(100, 480, 270, 256, 256, 0, 0), 75 }, + { conv_key(100, 480, 270, 384, 384, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 256, 0, 0), 75 }, + { conv_key(100, 480, 270, 512, 512, 0, 0), 75 }, +#endif +}; + +at::Tensor conv1x1_bias_shortcut(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const at::Tensor& shortcut, at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + return out + bias.reshape({ 1, -1, 1, 1 }) + shortcut; + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass(out_buf, feature, weight, bias, shortcut); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS_SHORTCUT, + HINT_MAP_BIAS_SHORTCUT_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut2.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut2.cu new file mode 100644 index 0000000..3f12b41 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut2.cu @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_SHORTCUT2_NAME = "HINT_MAP_BIAS_SHORTCUT2"; +std::unordered_map HINT_MAP_BIAS_SHORTCUT2 = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 7, 4, 128, 128, 0, 0), 19 }, { conv_key(80, 13, 8, 128, 128, 0, 0), 8 }, + { conv_key(80, 14, 8, 128, 128, 0, 0), 8 }, { conv_key(80, 20, 12, 128, 128, 0, 0), 7 }, + { conv_key(80, 26, 16, 128, 128, 0, 0), 7 }, { conv_key(80, 28, 16, 128, 128, 0, 0), 29 }, + { conv_key(80, 30, 17, 128, 128, 0, 0), 8 }, { conv_key(80, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(80, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(80, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(80, 52, 32, 128, 128, 0, 0), 19 }, { conv_key(80, 60, 34, 128, 128, 0, 0), 8 }, + { conv_key(80, 60, 34, 256, 256, 0, 0), 29 }, { conv_key(80, 80, 45, 512, 512, 0, 0), 29 }, + { conv_key(80, 80, 48, 128, 128, 0, 0), 29 }, { conv_key(80, 80, 48, 256, 256, 0, 0), 14 }, + { conv_key(80, 104, 60, 384, 384, 0, 0), 14 }, { conv_key(80, 120, 68, 128, 128, 0, 0), 7 }, + { conv_key(80, 120, 68, 256, 256, 0, 0), 14 }, { conv_key(80, 120, 68, 512, 512, 0, 0), 14 }, + { conv_key(80, 160, 90, 384, 384, 0, 0), 14 }, { conv_key(80, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(80, 240, 136, 128, 128, 0, 0), 2 }, { conv_key(80, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 384, 384, 0, 0), 14 }, { conv_key(80, 480, 270, 384, 384, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 7, 4, 128, 128, 0, 0), 19 }, { conv_key(89, 13, 8, 128, 128, 0, 0), 8 }, + { conv_key(89, 14, 8, 128, 128, 0, 0), 7 }, { conv_key(89, 20, 12, 128, 128, 0, 0), 7 }, + { conv_key(89, 26, 16, 128, 128, 0, 0), 19 }, { conv_key(89, 28, 16, 128, 128, 0, 0), 19 }, + { conv_key(89, 30, 17, 128, 128, 0, 0), 7 }, { conv_key(89, 40, 24, 128, 128, 0, 0), 19 }, + { conv_key(89, 40, 24, 256, 256, 0, 0), 19 }, { conv_key(89, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(89, 52, 32, 128, 128, 0, 0), 19 }, { conv_key(89, 60, 34, 128, 128, 0, 0), 8 }, + { conv_key(89, 60, 34, 256, 256, 0, 0), 8 }, { conv_key(89, 80, 45, 512, 512, 0, 0), 16 }, + { conv_key(89, 80, 48, 128, 128, 0, 0), 19 }, { conv_key(89, 80, 48, 256, 256, 0, 0), 7 }, + { conv_key(89, 104, 60, 384, 384, 0, 0), 14 }, { conv_key(89, 120, 68, 128, 128, 0, 0), 7 }, + { conv_key(89, 120, 68, 256, 256, 0, 0), 14 }, { conv_key(89, 120, 68, 512, 512, 0, 0), 14 }, + { conv_key(89, 160, 90, 384, 384, 0, 0), 14 }, { conv_key(89, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(89, 240, 136, 128, 128, 0, 0), 2 }, { conv_key(89, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(89, 240, 136, 384, 384, 0, 0), 14 }, { conv_key(89, 480, 270, 384, 384, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 7, 4, 128, 128, 0, 0), 8 }, { conv_key(90, 13, 8, 128, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 128, 128, 0, 0), 8 }, { conv_key(90, 20, 12, 128, 128, 0, 0), 8 }, + { conv_key(90, 26, 16, 128, 128, 0, 0), 8 }, { conv_key(90, 28, 16, 128, 128, 0, 0), 8 }, + { conv_key(90, 30, 17, 128, 128, 0, 0), 8 }, { conv_key(90, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(90, 52, 30, 384, 384, 0, 0), 29 }, + { conv_key(90, 52, 32, 128, 128, 0, 0), 8 }, { conv_key(90, 60, 34, 128, 128, 0, 0), 8 }, + { conv_key(90, 60, 34, 256, 256, 0, 0), 8 }, { conv_key(90, 80, 45, 512, 512, 0, 0), 30 }, + { conv_key(90, 80, 48, 128, 128, 0, 0), 8 }, { conv_key(90, 80, 48, 256, 256, 0, 0), 29 }, + { conv_key(90, 104, 60, 384, 384, 0, 0), 34 }, { conv_key(90, 120, 68, 128, 128, 0, 0), 29 }, + { conv_key(90, 120, 68, 256, 256, 0, 0), 30 }, { conv_key(90, 120, 68, 512, 512, 0, 0), 32 }, + { conv_key(90, 160, 90, 384, 384, 0, 0), 31 }, { conv_key(90, 240, 135, 512, 512, 0, 0), 40 }, + { conv_key(90, 240, 136, 128, 128, 0, 0), 11 }, { conv_key(90, 240, 136, 256, 256, 0, 0), 30 }, + { conv_key(90, 240, 136, 384, 384, 0, 0), 31 }, { conv_key(90, 480, 270, 384, 384, 0, 0), 35 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 7, 4, 128, 128, 0, 0), 25 }, + { conv_key(100, 13, 8, 128, 128, 0, 0), 25 }, + { conv_key(100, 14, 8, 128, 128, 0, 0), 6 }, + { conv_key(100, 20, 12, 128, 128, 0, 0), 7 }, + { conv_key(100, 26, 16, 128, 128, 0, 0), 17 }, + { conv_key(100, 28, 16, 128, 128, 0, 0), 17 }, + { conv_key(100, 30, 17, 128, 128, 0, 0), 6 }, + { conv_key(100, 40, 24, 128, 128, 0, 0), 17 }, + { conv_key(100, 40, 24, 256, 256, 0, 0), 58 }, + { conv_key(100, 52, 30, 384, 384, 0, 0), 8 }, + { conv_key(100, 52, 32, 128, 128, 0, 0), 7 }, + { conv_key(100, 60, 34, 128, 128, 0, 0), 7 }, + { conv_key(100, 60, 34, 256, 256, 0, 0), 53 }, + { conv_key(100, 80, 45, 512, 512, 0, 0), 88 }, + { conv_key(100, 80, 48, 128, 128, 0, 0), 19 }, + { conv_key(100, 80, 48, 256, 256, 0, 0), 63 }, + { conv_key(100, 104, 60, 384, 384, 0, 0), 87 }, + { conv_key(100, 120, 68, 128, 128, 0, 0), 8 }, + { conv_key(100, 120, 68, 256, 256, 0, 0), 83 }, + { conv_key(100, 120, 68, 512, 512, 0, 0), 47 }, + { conv_key(100, 160, 90, 384, 384, 0, 0), 68 }, + { conv_key(100, 240, 135, 512, 512, 0, 0), 46 }, + { conv_key(100, 240, 136, 128, 128, 0, 0), 87 }, + { conv_key(100, 240, 136, 256, 256, 0, 0), 77 }, + { conv_key(100, 240, 136, 384, 384, 0, 0), 68 }, + { conv_key(100, 480, 270, 384, 384, 0, 0), 68 }, +#endif +}; + +at::Tensor conv1x1_bias_shortcut2(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const at::Tensor& shortcut1, + const at::Tensor& shortcut2, at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + return out + bias.reshape({ 1, -1, 1, 1 }) + shortcut1 + shortcut2; + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass(out_buf, feature, weight, bias, + shortcut1, shortcut2); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS_SHORTCUT2, + HINT_MAP_BIAS_SHORTCUT2_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut_with_quant.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut_with_quant.cu new file mode 100644 index 0000000..38d1abf --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_shortcut_with_quant.cu @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_SHORTCUT_WITH_QUANT_NAME = "HINT_MAP_BIAS_SHORTCUT_WITH_QUANT"; +std::unordered_map HINT_MAP_BIAS_SHORTCUT_WITH_QUANT = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 52, 30, 256, 128, 0, 0), 8 }, { conv_key(80, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(80, 104, 60, 256, 128, 0, 0), 14 }, { conv_key(80, 104, 60, 512, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 256, 128, 0, 0), 14 }, { conv_key(80, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 512, 0, 0), 14 }, { conv_key(80, 240, 136, 256, 128, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 256, 0, 0), 14 }, { conv_key(80, 240, 136, 512, 512, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 128, 0, 0), 14 }, { conv_key(80, 480, 270, 512, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 512, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 52, 30, 256, 128, 0, 0), 19 }, { conv_key(89, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(89, 104, 60, 256, 128, 0, 0), 5 }, { conv_key(89, 104, 60, 512, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 256, 128, 0, 0), 14 }, { conv_key(89, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 512, 0, 0), 14 }, { conv_key(89, 240, 136, 256, 128, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 256, 0, 0), 2 }, { conv_key(89, 240, 136, 512, 512, 0, 0), 2 }, + { conv_key(89, 480, 270, 256, 128, 0, 0), 7 }, { conv_key(89, 480, 270, 512, 256, 0, 0), 10 }, + { conv_key(89, 480, 270, 512, 512, 0, 0), 9 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 52, 30, 256, 128, 0, 0), 8 }, { conv_key(90, 52, 30, 512, 256, 0, 0), 29 }, + { conv_key(90, 104, 60, 256, 128, 0, 0), 30 }, { conv_key(90, 104, 60, 512, 256, 0, 0), 32 }, + { conv_key(90, 160, 90, 256, 128, 0, 0), 34 }, { conv_key(90, 160, 90, 512, 256, 0, 0), 36 }, + { conv_key(90, 160, 90, 512, 512, 0, 0), 36 }, { conv_key(90, 240, 136, 256, 128, 0, 0), 33 }, + { conv_key(90, 240, 136, 512, 256, 0, 0), 30 }, { conv_key(90, 240, 136, 512, 512, 0, 0), 46 }, + { conv_key(90, 480, 270, 256, 128, 0, 0), 30 }, { conv_key(90, 480, 270, 512, 256, 0, 0), 37 }, + { conv_key(90, 480, 270, 512, 512, 0, 0), 46 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 52, 30, 256, 128, 0, 0), 8 }, + { conv_key(100, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(100, 104, 60, 256, 128, 0, 0), 29 }, + { conv_key(100, 104, 60, 512, 256, 0, 0), 82 }, + { conv_key(100, 160, 90, 256, 128, 0, 0), 63 }, + { conv_key(100, 160, 90, 512, 256, 0, 0), 75 }, + { conv_key(100, 160, 90, 512, 512, 0, 0), 75 }, + { conv_key(100, 240, 136, 256, 128, 0, 0), 63 }, + { conv_key(100, 240, 136, 512, 256, 0, 0), 75 }, + { conv_key(100, 240, 136, 512, 512, 0, 0), 76 }, + { conv_key(100, 480, 270, 256, 128, 0, 0), 92 }, + { conv_key(100, 480, 270, 512, 256, 0, 0), 92 }, + { conv_key(100, 480, 270, 512, 512, 0, 0), 75 }, +#endif +}; + +at::Tensor conv1x1_bias_shortcut_with_quant(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& bias, + const at::Tensor& shortcut, const at::Tensor& quant, + at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + return (out + bias.reshape({ 1, -1, 1, 1 }) + shortcut) * quant; + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass(out_buf, feature, weight, bias, + shortcut, at::nullopt, quant); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS_SHORTCUT_WITH_QUANT, + HINT_MAP_BIAS_SHORTCUT_WITH_QUANT_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_with_quant.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias_with_quant.cu new file mode 100644 index 0000000..614a507 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_with_quant.cu @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_WITH_QUANT_NAME = "HINT_MAP_BIAS_WITH_QUANT"; +std::unordered_map HINT_MAP_BIAS_WITH_QUANT = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 52, 30, 256, 256, 0, 0), 19 }, { conv_key(80, 104, 60, 256, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 256, 256, 0, 0), 14 }, { conv_key(80, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 256, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 52, 30, 256, 256, 0, 0), 8 }, { conv_key(89, 104, 60, 256, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 256, 256, 0, 0), 14 }, { conv_key(89, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(89, 480, 270, 256, 256, 0, 0), 1 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 52, 30, 256, 256, 0, 0), 8 }, { conv_key(90, 104, 60, 256, 256, 0, 0), 30 }, + { conv_key(90, 160, 90, 256, 256, 0, 0), 34 }, { conv_key(90, 240, 136, 256, 256, 0, 0), 37 }, + { conv_key(90, 480, 270, 256, 256, 0, 0), 37 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 52, 30, 256, 256, 0, 0), 19 }, + { conv_key(100, 104, 60, 256, 256, 0, 0), 63 }, + { conv_key(100, 160, 90, 256, 256, 0, 0), 92 }, + { conv_key(100, 240, 136, 256, 256, 0, 0), 63 }, + { conv_key(100, 480, 270, 256, 256, 0, 0), 75 }, +#endif +}; + +at::Tensor conv1x1_bias_with_quant(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const at::Tensor& quant, at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + return (out + bias.reshape({ 1, -1, 1, 1 })) * quant; + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass(out_buf, feature, weight, bias, + at::nullopt, at::nullopt, quant); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS_WITH_QUANT, + HINT_MAP_BIAS_WITH_QUANT_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu.cu new file mode 100644 index 0000000..e25c7b5 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu.cu @@ -0,0 +1,248 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_WSILU_NAME = "HINT_MAP_BIAS_WSILU"; +std::unordered_map HINT_MAP_BIAS_WSILU = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 7, 4, 64, 128, 0, 0), 8 }, { conv_key(80, 7, 4, 128, 128, 0, 0), 7 }, + { conv_key(80, 13, 8, 64, 128, 0, 0), 8 }, { conv_key(80, 13, 8, 128, 128, 0, 0), 19 }, + { conv_key(80, 14, 8, 64, 128, 0, 0), 7 }, { conv_key(80, 14, 8, 128, 128, 0, 0), 19 }, + { conv_key(80, 14, 8, 256, 256, 0, 0), 8 }, { conv_key(80, 20, 12, 64, 128, 0, 0), 19 }, + { conv_key(80, 20, 12, 128, 128, 0, 0), 8 }, { conv_key(80, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(80, 26, 15, 192, 384, 0, 0), 8 }, { conv_key(80, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(80, 26, 15, 768, 768, 0, 0), 8 }, { conv_key(80, 26, 16, 64, 128, 0, 0), 8 }, + { conv_key(80, 26, 16, 128, 128, 0, 0), 7 }, { conv_key(80, 26, 16, 256, 256, 0, 0), 19 }, + { conv_key(80, 28, 16, 64, 128, 0, 0), 19 }, { conv_key(80, 28, 16, 128, 128, 0, 0), 19 }, + { conv_key(80, 28, 16, 256, 256, 0, 0), 8 }, { conv_key(80, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(80, 30, 17, 64, 128, 0, 0), 8 }, { conv_key(80, 30, 17, 128, 128, 0, 0), 8 }, + { conv_key(80, 40, 24, 64, 128, 0, 0), 8 }, { conv_key(80, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(80, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(80, 52, 30, 128, 256, 0, 0), 8 }, + { conv_key(80, 52, 30, 192, 192, 0, 0), 8 }, { conv_key(80, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(80, 52, 30, 256, 256, 0, 0), 19 }, { conv_key(80, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(80, 52, 30, 384, 384, 0, 0), 29 }, { conv_key(80, 52, 30, 512, 512, 0, 0), 18 }, + { conv_key(80, 52, 30, 768, 768, 0, 0), 14 }, { conv_key(80, 52, 32, 64, 128, 0, 0), 19 }, + { conv_key(80, 52, 32, 128, 128, 0, 0), 8 }, { conv_key(80, 52, 32, 256, 256, 0, 0), 19 }, + { conv_key(80, 52, 32, 512, 512, 0, 0), 29 }, { conv_key(80, 60, 34, 64, 128, 0, 0), 19 }, + { conv_key(80, 60, 34, 128, 128, 0, 0), 8 }, { conv_key(80, 60, 34, 256, 256, 0, 0), 29 }, + { conv_key(80, 80, 45, 128, 256, 0, 0), 29 }, { conv_key(80, 80, 45, 192, 384, 0, 0), 8 }, + { conv_key(80, 80, 45, 512, 512, 0, 0), 29 }, { conv_key(80, 80, 45, 768, 768, 0, 0), 9 }, + { conv_key(80, 80, 48, 64, 128, 0, 0), 8 }, { conv_key(80, 80, 48, 128, 128, 0, 0), 7 }, + { conv_key(80, 80, 48, 256, 256, 0, 0), 29 }, { conv_key(80, 80, 48, 512, 512, 0, 0), 29 }, + { conv_key(80, 104, 60, 128, 256, 0, 0), 29 }, { conv_key(80, 104, 60, 192, 192, 0, 0), 29 }, + { conv_key(80, 104, 60, 256, 256, 0, 0), 14 }, { conv_key(80, 104, 60, 256, 512, 0, 0), 14 }, + { conv_key(80, 104, 60, 384, 384, 0, 0), 14 }, { conv_key(80, 104, 60, 512, 512, 0, 0), 14 }, + { conv_key(80, 120, 68, 64, 128, 0, 0), 8 }, { conv_key(80, 120, 68, 128, 128, 0, 0), 7 }, + { conv_key(80, 120, 68, 128, 256, 0, 0), 14 }, { conv_key(80, 120, 68, 192, 384, 0, 0), 25 }, + { conv_key(80, 120, 68, 256, 256, 0, 0), 14 }, { conv_key(80, 120, 68, 512, 512, 0, 0), 14 }, + { conv_key(80, 120, 68, 768, 768, 0, 0), 14 }, { conv_key(80, 160, 90, 128, 256, 0, 0), 5 }, + { conv_key(80, 160, 90, 192, 192, 0, 0), 11 }, { conv_key(80, 160, 90, 256, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 256, 512, 0, 0), 14 }, { conv_key(80, 160, 90, 384, 384, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 512, 0, 0), 14 }, { conv_key(80, 240, 135, 128, 256, 0, 0), 15 }, + { conv_key(80, 240, 135, 192, 384, 0, 0), 11 }, { conv_key(80, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(80, 240, 135, 768, 768, 0, 0), 14 }, { conv_key(80, 240, 136, 64, 128, 0, 0), 7 }, + { conv_key(80, 240, 136, 128, 128, 0, 0), 2 }, { conv_key(80, 240, 136, 128, 256, 0, 0), 2 }, + { conv_key(80, 240, 136, 192, 192, 0, 0), 11 }, { conv_key(80, 240, 136, 256, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 256, 512, 0, 0), 14 }, { conv_key(80, 240, 136, 384, 384, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 512, 0, 0), 14 }, { conv_key(80, 480, 270, 128, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 192, 192, 0, 0), 14 }, { conv_key(80, 480, 270, 256, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 256, 512, 0, 0), 14 }, { conv_key(80, 480, 270, 384, 384, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 512, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 7, 4, 64, 128, 0, 0), 19 }, { conv_key(89, 7, 4, 128, 128, 0, 0), 19 }, + { conv_key(89, 13, 8, 64, 128, 0, 0), 7 }, { conv_key(89, 13, 8, 128, 128, 0, 0), 19 }, + { conv_key(89, 14, 8, 64, 128, 0, 0), 7 }, { conv_key(89, 14, 8, 128, 128, 0, 0), 19 }, + { conv_key(89, 14, 8, 256, 256, 0, 0), 8 }, { conv_key(89, 20, 12, 64, 128, 0, 0), 8 }, + { conv_key(89, 20, 12, 128, 128, 0, 0), 8 }, { conv_key(89, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(89, 26, 15, 192, 384, 0, 0), 19 }, { conv_key(89, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(89, 26, 15, 768, 768, 0, 0), 8 }, { conv_key(89, 26, 16, 64, 128, 0, 0), 8 }, + { conv_key(89, 26, 16, 128, 128, 0, 0), 7 }, { conv_key(89, 26, 16, 256, 256, 0, 0), 19 }, + { conv_key(89, 28, 16, 64, 128, 0, 0), 8 }, { conv_key(89, 28, 16, 128, 128, 0, 0), 7 }, + { conv_key(89, 28, 16, 256, 256, 0, 0), 19 }, { conv_key(89, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(89, 30, 17, 64, 128, 0, 0), 19 }, { conv_key(89, 30, 17, 128, 128, 0, 0), 19 }, + { conv_key(89, 40, 24, 64, 128, 0, 0), 8 }, { conv_key(89, 40, 24, 128, 128, 0, 0), 19 }, + { conv_key(89, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(89, 52, 30, 128, 256, 0, 0), 8 }, + { conv_key(89, 52, 30, 192, 192, 0, 0), 8 }, { conv_key(89, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(89, 52, 30, 256, 256, 0, 0), 8 }, { conv_key(89, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(89, 52, 30, 384, 384, 0, 0), 29 }, { conv_key(89, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(89, 52, 30, 768, 768, 0, 0), 14 }, { conv_key(89, 52, 32, 64, 128, 0, 0), 19 }, + { conv_key(89, 52, 32, 128, 128, 0, 0), 7 }, { conv_key(89, 52, 32, 256, 256, 0, 0), 8 }, + { conv_key(89, 52, 32, 512, 512, 0, 0), 29 }, { conv_key(89, 60, 34, 64, 128, 0, 0), 19 }, + { conv_key(89, 60, 34, 128, 128, 0, 0), 19 }, { conv_key(89, 60, 34, 256, 256, 0, 0), 29 }, + { conv_key(89, 80, 45, 128, 256, 0, 0), 8 }, { conv_key(89, 80, 45, 192, 384, 0, 0), 17 }, + { conv_key(89, 80, 45, 512, 512, 0, 0), 14 }, { conv_key(89, 80, 45, 768, 768, 0, 0), 14 }, + { conv_key(89, 80, 48, 64, 128, 0, 0), 19 }, { conv_key(89, 80, 48, 128, 128, 0, 0), 19 }, + { conv_key(89, 80, 48, 256, 256, 0, 0), 7 }, { conv_key(89, 80, 48, 512, 512, 0, 0), 14 }, + { conv_key(89, 104, 60, 128, 256, 0, 0), 17 }, { conv_key(89, 104, 60, 192, 192, 0, 0), 7 }, + { conv_key(89, 104, 60, 256, 256, 0, 0), 14 }, { conv_key(89, 104, 60, 256, 512, 0, 0), 14 }, + { conv_key(89, 104, 60, 384, 384, 0, 0), 5 }, { conv_key(89, 104, 60, 512, 512, 0, 0), 10 }, + { conv_key(89, 120, 68, 64, 128, 0, 0), 19 }, { conv_key(89, 120, 68, 128, 128, 0, 0), 7 }, + { conv_key(89, 120, 68, 128, 256, 0, 0), 7 }, { conv_key(89, 120, 68, 192, 384, 0, 0), 14 }, + { conv_key(89, 120, 68, 256, 256, 0, 0), 5 }, { conv_key(89, 120, 68, 512, 512, 0, 0), 9 }, + { conv_key(89, 120, 68, 768, 768, 0, 0), 14 }, { conv_key(89, 160, 90, 128, 256, 0, 0), 11 }, + { conv_key(89, 160, 90, 192, 192, 0, 0), 6 }, { conv_key(89, 160, 90, 256, 256, 0, 0), 9 }, + { conv_key(89, 160, 90, 256, 512, 0, 0), 9 }, { conv_key(89, 160, 90, 384, 384, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 512, 0, 0), 9 }, { conv_key(89, 240, 135, 128, 256, 0, 0), 14 }, + { conv_key(89, 240, 135, 192, 384, 0, 0), 14 }, { conv_key(89, 240, 135, 512, 512, 0, 0), 14 }, + { conv_key(89, 240, 135, 768, 768, 0, 0), 14 }, { conv_key(89, 240, 136, 64, 128, 0, 0), 7 }, + { conv_key(89, 240, 136, 128, 128, 0, 0), 9 }, { conv_key(89, 240, 136, 128, 256, 0, 0), 9 }, + { conv_key(89, 240, 136, 192, 192, 0, 0), 14 }, { conv_key(89, 240, 136, 256, 256, 0, 0), 9 }, + { conv_key(89, 240, 136, 256, 512, 0, 0), 9 }, { conv_key(89, 240, 136, 384, 384, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 512, 0, 0), 14 }, { conv_key(89, 480, 270, 128, 256, 0, 0), 5 }, + { conv_key(89, 480, 270, 192, 192, 0, 0), 7 }, { conv_key(89, 480, 270, 256, 256, 0, 0), 14 }, + { conv_key(89, 480, 270, 256, 512, 0, 0), 14 }, { conv_key(89, 480, 270, 384, 384, 0, 0), 14 }, + { conv_key(89, 480, 270, 512, 512, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 7, 4, 64, 128, 0, 0), 8 }, { conv_key(90, 7, 4, 128, 128, 0, 0), 8 }, + { conv_key(90, 13, 8, 64, 128, 0, 0), 8 }, { conv_key(90, 13, 8, 128, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 64, 128, 0, 0), 8 }, { conv_key(90, 14, 8, 128, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 256, 256, 0, 0), 8 }, { conv_key(90, 20, 12, 64, 128, 0, 0), 8 }, + { conv_key(90, 20, 12, 128, 128, 0, 0), 8 }, { conv_key(90, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(90, 26, 15, 192, 384, 0, 0), 8 }, { conv_key(90, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(90, 26, 15, 768, 768, 0, 0), 8 }, { conv_key(90, 26, 16, 64, 128, 0, 0), 8 }, + { conv_key(90, 26, 16, 128, 128, 0, 0), 8 }, { conv_key(90, 26, 16, 256, 256, 0, 0), 8 }, + { conv_key(90, 28, 16, 64, 128, 0, 0), 8 }, { conv_key(90, 28, 16, 128, 128, 0, 0), 8 }, + { conv_key(90, 28, 16, 256, 256, 0, 0), 8 }, { conv_key(90, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(90, 30, 17, 64, 128, 0, 0), 8 }, { conv_key(90, 30, 17, 128, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 64, 128, 0, 0), 8 }, { conv_key(90, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 256, 256, 0, 0), 8 }, { conv_key(90, 52, 30, 128, 256, 0, 0), 8 }, + { conv_key(90, 52, 30, 192, 192, 0, 0), 8 }, { conv_key(90, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(90, 52, 30, 256, 256, 0, 0), 8 }, { conv_key(90, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(90, 52, 30, 384, 384, 0, 0), 29 }, { conv_key(90, 52, 30, 512, 512, 0, 0), 29 }, + { conv_key(90, 52, 30, 768, 768, 0, 0), 30 }, { conv_key(90, 52, 32, 64, 128, 0, 0), 8 }, + { conv_key(90, 52, 32, 128, 128, 0, 0), 8 }, { conv_key(90, 52, 32, 256, 256, 0, 0), 8 }, + { conv_key(90, 52, 32, 512, 512, 0, 0), 29 }, { conv_key(90, 60, 34, 64, 128, 0, 0), 8 }, + { conv_key(90, 60, 34, 128, 128, 0, 0), 8 }, { conv_key(90, 60, 34, 256, 256, 0, 0), 8 }, + { conv_key(90, 80, 45, 128, 256, 0, 0), 8 }, { conv_key(90, 80, 45, 192, 384, 0, 0), 29 }, + { conv_key(90, 80, 45, 512, 512, 0, 0), 30 }, { conv_key(90, 80, 45, 768, 768, 0, 0), 33 }, + { conv_key(90, 80, 48, 64, 128, 0, 0), 8 }, { conv_key(90, 80, 48, 128, 128, 0, 0), 8 }, + { conv_key(90, 80, 48, 256, 256, 0, 0), 29 }, { conv_key(90, 80, 48, 512, 512, 0, 0), 30 }, + { conv_key(90, 104, 60, 128, 256, 0, 0), 29 }, { conv_key(90, 104, 60, 192, 192, 0, 0), 30 }, + { conv_key(90, 104, 60, 256, 256, 0, 0), 30 }, { conv_key(90, 104, 60, 256, 512, 0, 0), 30 }, + { conv_key(90, 104, 60, 384, 384, 0, 0), 29 }, { conv_key(90, 104, 60, 512, 512, 0, 0), 32 }, + { conv_key(90, 120, 68, 64, 128, 0, 0), 8 }, { conv_key(90, 120, 68, 128, 128, 0, 0), 29 }, + { conv_key(90, 120, 68, 128, 256, 0, 0), 29 }, { conv_key(90, 120, 68, 192, 384, 0, 0), 30 }, + { conv_key(90, 120, 68, 256, 256, 0, 0), 30 }, { conv_key(90, 120, 68, 512, 512, 0, 0), 32 }, + { conv_key(90, 120, 68, 768, 768, 0, 0), 30 }, { conv_key(90, 160, 90, 128, 256, 0, 0), 29 }, + { conv_key(90, 160, 90, 192, 192, 0, 0), 28 }, { conv_key(90, 160, 90, 256, 256, 0, 0), 34 }, + { conv_key(90, 160, 90, 256, 512, 0, 0), 34 }, { conv_key(90, 160, 90, 384, 384, 0, 0), 14 }, + { conv_key(90, 160, 90, 512, 512, 0, 0), 36 }, { conv_key(90, 240, 135, 128, 256, 0, 0), 27 }, + { conv_key(90, 240, 135, 192, 384, 0, 0), 11 }, { conv_key(90, 240, 135, 512, 512, 0, 0), 36 }, + { conv_key(90, 240, 135, 768, 768, 0, 0), 37 }, { conv_key(90, 240, 136, 64, 128, 0, 0), 28 }, + { conv_key(90, 240, 136, 128, 128, 0, 0), 27 }, { conv_key(90, 240, 136, 128, 256, 0, 0), 14 }, + { conv_key(90, 240, 136, 192, 192, 0, 0), 11 }, { conv_key(90, 240, 136, 256, 256, 0, 0), 34 }, + { conv_key(90, 240, 136, 256, 512, 0, 0), 33 }, { conv_key(90, 240, 136, 384, 384, 0, 0), 35 }, + { conv_key(90, 240, 136, 512, 512, 0, 0), 36 }, { conv_key(90, 480, 270, 128, 256, 0, 0), 35 }, + { conv_key(90, 480, 270, 192, 192, 0, 0), 37 }, { conv_key(90, 480, 270, 256, 256, 0, 0), 37 }, + { conv_key(90, 480, 270, 256, 512, 0, 0), 37 }, { conv_key(90, 480, 270, 384, 384, 0, 0), 35 }, + { conv_key(90, 480, 270, 512, 512, 0, 0), 36 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 7, 4, 64, 128, 0, 0), 19 }, + { conv_key(100, 7, 4, 128, 128, 0, 0), 18 }, + { conv_key(100, 13, 8, 64, 128, 0, 0), 8 }, + { conv_key(100, 13, 8, 128, 128, 0, 0), 6 }, + { conv_key(100, 14, 8, 64, 128, 0, 0), 7 }, + { conv_key(100, 14, 8, 128, 128, 0, 0), 8 }, + { conv_key(100, 14, 8, 256, 256, 0, 0), 7 }, + { conv_key(100, 20, 12, 64, 128, 0, 0), 7 }, + { conv_key(100, 20, 12, 128, 128, 0, 0), 7 }, + { conv_key(100, 26, 15, 128, 256, 0, 0), 8 }, + { conv_key(100, 26, 15, 192, 384, 0, 0), 8 }, + { conv_key(100, 26, 15, 512, 512, 0, 0), 8 }, + { conv_key(100, 26, 15, 768, 768, 0, 0), 8 }, + { conv_key(100, 26, 16, 64, 128, 0, 0), 19 }, + { conv_key(100, 26, 16, 128, 128, 0, 0), 7 }, + { conv_key(100, 26, 16, 256, 256, 0, 0), 29 }, + { conv_key(100, 28, 16, 64, 128, 0, 0), 19 }, + { conv_key(100, 28, 16, 128, 128, 0, 0), 6 }, + { conv_key(100, 28, 16, 256, 256, 0, 0), 8 }, + { conv_key(100, 28, 16, 512, 512, 0, 0), 8 }, + { conv_key(100, 30, 17, 64, 128, 0, 0), 18 }, + { conv_key(100, 30, 17, 128, 128, 0, 0), 19 }, + { conv_key(100, 40, 24, 64, 128, 0, 0), 19 }, + { conv_key(100, 40, 24, 128, 128, 0, 0), 19 }, + { conv_key(100, 40, 24, 256, 256, 0, 0), 29 }, + { conv_key(100, 52, 30, 128, 256, 0, 0), 8 }, + { conv_key(100, 52, 30, 192, 192, 0, 0), 18 }, + { conv_key(100, 52, 30, 192, 384, 0, 0), 8 }, + { conv_key(100, 52, 30, 256, 256, 0, 0), 8 }, + { conv_key(100, 52, 30, 256, 512, 0, 0), 8 }, + { conv_key(100, 52, 30, 384, 384, 0, 0), 8 }, + { conv_key(100, 52, 30, 512, 512, 0, 0), 58 }, + { conv_key(100, 52, 30, 768, 768, 0, 0), 58 }, + { conv_key(100, 52, 32, 64, 128, 0, 0), 19 }, + { conv_key(100, 52, 32, 128, 128, 0, 0), 8 }, + { conv_key(100, 52, 32, 256, 256, 0, 0), 8 }, + { conv_key(100, 52, 32, 512, 512, 0, 0), 53 }, + { conv_key(100, 60, 34, 64, 128, 0, 0), 8 }, + { conv_key(100, 60, 34, 128, 128, 0, 0), 18 }, + { conv_key(100, 60, 34, 256, 256, 0, 0), 19 }, + { conv_key(100, 80, 45, 128, 256, 0, 0), 8 }, + { conv_key(100, 80, 45, 192, 384, 0, 0), 82 }, + { conv_key(100, 80, 45, 512, 512, 0, 0), 46 }, + { conv_key(100, 80, 45, 768, 768, 0, 0), 39 }, + { conv_key(100, 80, 48, 64, 128, 0, 0), 19 }, + { conv_key(100, 80, 48, 128, 128, 0, 0), 18 }, + { conv_key(100, 80, 48, 256, 256, 0, 0), 8 }, + { conv_key(100, 80, 48, 512, 512, 0, 0), 84 }, + { conv_key(100, 104, 60, 128, 256, 0, 0), 8 }, + { conv_key(100, 104, 60, 192, 192, 0, 0), 8 }, + { conv_key(100, 104, 60, 256, 256, 0, 0), 58 }, + { conv_key(100, 104, 60, 256, 512, 0, 0), 58 }, + { conv_key(100, 104, 60, 384, 384, 0, 0), 87 }, + { conv_key(100, 104, 60, 512, 512, 0, 0), 39 }, + { conv_key(100, 120, 68, 64, 128, 0, 0), 8 }, + { conv_key(100, 120, 68, 128, 128, 0, 0), 29 }, + { conv_key(100, 120, 68, 128, 256, 0, 0), 8 }, + { conv_key(100, 120, 68, 192, 384, 0, 0), 87 }, + { conv_key(100, 120, 68, 256, 256, 0, 0), 58 }, + { conv_key(100, 120, 68, 512, 512, 0, 0), 87 }, + { conv_key(100, 120, 68, 768, 768, 0, 0), 46 }, + { conv_key(100, 160, 90, 128, 256, 0, 0), 87 }, + { conv_key(100, 160, 90, 192, 192, 0, 0), 75 }, + { conv_key(100, 160, 90, 256, 256, 0, 0), 46 }, + { conv_key(100, 160, 90, 256, 512, 0, 0), 68 }, + { conv_key(100, 160, 90, 384, 384, 0, 0), 68 }, + { conv_key(100, 160, 90, 512, 512, 0, 0), 46 }, + { conv_key(100, 240, 135, 128, 256, 0, 0), 68 }, + { conv_key(100, 240, 135, 192, 384, 0, 0), 46 }, + { conv_key(100, 240, 135, 512, 512, 0, 0), 46 }, + { conv_key(100, 240, 135, 768, 768, 0, 0), 75 }, + { conv_key(100, 240, 136, 64, 128, 0, 0), 28 }, + { conv_key(100, 240, 136, 128, 128, 0, 0), 87 }, + { conv_key(100, 240, 136, 128, 256, 0, 0), 68 }, + { conv_key(100, 240, 136, 192, 192, 0, 0), 46 }, + { conv_key(100, 240, 136, 256, 256, 0, 0), 46 }, + { conv_key(100, 240, 136, 256, 512, 0, 0), 46 }, + { conv_key(100, 240, 136, 384, 384, 0, 0), 68 }, + { conv_key(100, 240, 136, 512, 512, 0, 0), 46 }, + { conv_key(100, 480, 270, 128, 256, 0, 0), 58 }, + { conv_key(100, 480, 270, 192, 192, 0, 0), 46 }, + { conv_key(100, 480, 270, 256, 256, 0, 0), 87 }, + { conv_key(100, 480, 270, 256, 512, 0, 0), 75 }, + { conv_key(100, 480, 270, 384, 384, 0, 0), 68 }, + { conv_key(100, 480, 270, 512, 512, 0, 0), 46 }, +#endif +}; + +at::Tensor conv1x1_bias_wsilu(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + out = out + bias.reshape({ 1, -1, 1, 1 }); + return out * at::sigmoid(out * 4.f); + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass(out_buf, feature, weight, bias); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS_WSILU, HINT_MAP_BIAS_WSILU_NAME, + C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add.cu b/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add.cu new file mode 100644 index 0000000..92bbfae --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add.cu @@ -0,0 +1,390 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv1x1_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_BIAS_WSILU_CHUNK_ADD_NAME = "HINT_MAP_BIAS_WSILU_CHUNK_ADD"; +std::unordered_map HINT_MAP_BIAS_WSILU_CHUNK_ADD = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 7, 4, 256, 128, 0, 0), 8 }, + { conv_key(80, 7, 4, 512, 128, 0, 0), 19 }, + { conv_key(80, 13, 8, 256, 128, 0, 0), 19 }, + { conv_key(80, 13, 8, 512, 128, 0, 0), 19 }, + { conv_key(80, 14, 8, 256, 128, 0, 0), 19 }, + { conv_key(80, 14, 8, 512, 128, 0, 0), 19 }, + { conv_key(80, 14, 8, 1024, 256, 0, 0), 8 }, + { conv_key(80, 20, 12, 256, 128, 0, 0), 19 }, + { conv_key(80, 20, 12, 512, 128, 0, 0), 19 }, + { conv_key(80, 26, 15, 512, 256, 0, 0), 8 }, + { conv_key(80, 26, 15, 768, 384, 0, 0), 8 }, + { conv_key(80, 26, 15, 2048, 512, 0, 0), 29 }, + { conv_key(80, 26, 15, 3072, 768, 0, 0), 14 }, + { conv_key(80, 26, 16, 256, 128, 0, 0), 8 }, + { conv_key(80, 26, 16, 512, 128, 0, 0), 8 }, + { conv_key(80, 26, 16, 1024, 256, 0, 0), 29 }, + { conv_key(80, 28, 16, 256, 128, 0, 0), 8 }, + { conv_key(80, 28, 16, 512, 128, 0, 0), 7 }, + { conv_key(80, 28, 16, 1024, 256, 0, 0), 29 }, + { conv_key(80, 28, 16, 2048, 512, 0, 0), 29 }, + { conv_key(80, 30, 17, 256, 128, 0, 0), 19 }, + { conv_key(80, 30, 17, 512, 128, 0, 0), 8 }, + { conv_key(80, 40, 24, 256, 128, 0, 0), 19 }, + { conv_key(80, 40, 24, 512, 128, 0, 0), 8 }, + { conv_key(80, 40, 24, 1024, 256, 0, 0), 29 }, + { conv_key(80, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(80, 52, 30, 768, 192, 0, 0), 7 }, + { conv_key(80, 52, 30, 768, 384, 0, 0), 29 }, + { conv_key(80, 52, 30, 1024, 256, 0, 0), 29 }, + { conv_key(80, 52, 30, 1024, 512, 0, 0), 15 }, + { conv_key(80, 52, 30, 1536, 384, 0, 0), 14 }, + { conv_key(80, 52, 30, 2048, 512, 0, 0), 14 }, + { conv_key(80, 52, 30, 3072, 768, 0, 0), 14 }, + { conv_key(80, 52, 32, 256, 128, 0, 0), 8 }, + { conv_key(80, 52, 32, 512, 128, 0, 0), 18 }, + { conv_key(80, 52, 32, 1024, 256, 0, 0), 14 }, + { conv_key(80, 52, 32, 2048, 512, 0, 0), 14 }, + { conv_key(80, 60, 34, 256, 128, 0, 0), 29 }, + { conv_key(80, 60, 34, 512, 128, 0, 0), 7 }, + { conv_key(80, 60, 34, 1024, 256, 0, 0), 14 }, + { conv_key(80, 80, 45, 512, 256, 0, 0), 29 }, + { conv_key(80, 80, 45, 768, 384, 0, 0), 11 }, + { conv_key(80, 80, 45, 2048, 512, 0, 0), 14 }, + { conv_key(80, 80, 45, 3072, 768, 0, 0), 14 }, + { conv_key(80, 80, 48, 256, 128, 0, 0), 7 }, + { conv_key(80, 80, 48, 512, 128, 0, 0), 7 }, + { conv_key(80, 80, 48, 1024, 256, 0, 0), 14 }, + { conv_key(80, 80, 48, 2048, 512, 0, 0), 14 }, + { conv_key(80, 104, 60, 512, 256, 0, 0), 14 }, + { conv_key(80, 104, 60, 768, 192, 0, 0), 14 }, + { conv_key(80, 104, 60, 1024, 256, 0, 0), 14 }, + { conv_key(80, 104, 60, 1024, 512, 0, 0), 14 }, + { conv_key(80, 104, 60, 1536, 384, 0, 0), 14 }, + { conv_key(80, 104, 60, 2048, 512, 0, 0), 14 }, + { conv_key(80, 120, 68, 256, 128, 0, 0), 7 }, + { conv_key(80, 120, 68, 512, 128, 0, 0), 14 }, + { conv_key(80, 120, 68, 512, 256, 0, 0), 14 }, + { conv_key(80, 120, 68, 768, 384, 0, 0), 14 }, + { conv_key(80, 120, 68, 1024, 256, 0, 0), 14 }, + { conv_key(80, 120, 68, 2048, 512, 0, 0), 14 }, + { conv_key(80, 120, 68, 3072, 768, 0, 0), 14 }, + { conv_key(80, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 768, 192, 0, 0), 14 }, + { conv_key(80, 160, 90, 1024, 256, 0, 0), 14 }, + { conv_key(80, 160, 90, 1024, 512, 0, 0), 14 }, + { conv_key(80, 160, 90, 1536, 384, 0, 0), 14 }, + { conv_key(80, 160, 90, 2048, 512, 0, 0), 14 }, + { conv_key(80, 240, 135, 512, 256, 0, 0), 14 }, + { conv_key(80, 240, 135, 768, 384, 0, 0), 14 }, + { conv_key(80, 240, 135, 2048, 512, 0, 0), 14 }, + { conv_key(80, 240, 135, 3072, 768, 0, 0), 14 }, + { conv_key(80, 240, 136, 256, 128, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 128, 0, 0), 14 }, + { conv_key(80, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 768, 192, 0, 0), 14 }, + { conv_key(80, 240, 136, 1024, 256, 0, 0), 14 }, + { conv_key(80, 240, 136, 1024, 512, 0, 0), 14 }, + { conv_key(80, 240, 136, 1536, 384, 0, 0), 14 }, + { conv_key(80, 240, 136, 2048, 512, 0, 0), 14 }, + { conv_key(80, 480, 270, 512, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 768, 192, 0, 0), 14 }, + { conv_key(80, 480, 270, 1024, 256, 0, 0), 14 }, + { conv_key(80, 480, 270, 1024, 512, 0, 0), 14 }, + { conv_key(80, 480, 270, 1536, 384, 0, 0), 14 }, + { conv_key(80, 480, 270, 2048, 512, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 7, 4, 256, 128, 0, 0), 8 }, + { conv_key(89, 7, 4, 512, 128, 0, 0), 19 }, + { conv_key(89, 13, 8, 256, 128, 0, 0), 19 }, + { conv_key(89, 13, 8, 512, 128, 0, 0), 8 }, + { conv_key(89, 14, 8, 256, 128, 0, 0), 8 }, + { conv_key(89, 14, 8, 512, 128, 0, 0), 19 }, + { conv_key(89, 14, 8, 1024, 256, 0, 0), 8 }, + { conv_key(89, 20, 12, 256, 128, 0, 0), 7 }, + { conv_key(89, 20, 12, 512, 128, 0, 0), 18 }, + { conv_key(89, 26, 15, 512, 256, 0, 0), 19 }, + { conv_key(89, 26, 15, 768, 384, 0, 0), 8 }, + { conv_key(89, 26, 15, 2048, 512, 0, 0), 29 }, + { conv_key(89, 26, 15, 3072, 768, 0, 0), 14 }, + { conv_key(89, 26, 16, 256, 128, 0, 0), 8 }, + { conv_key(89, 26, 16, 512, 128, 0, 0), 8 }, + { conv_key(89, 26, 16, 1024, 256, 0, 0), 8 }, + { conv_key(89, 28, 16, 256, 128, 0, 0), 19 }, + { conv_key(89, 28, 16, 512, 128, 0, 0), 8 }, + { conv_key(89, 28, 16, 1024, 256, 0, 0), 8 }, + { conv_key(89, 28, 16, 2048, 512, 0, 0), 18 }, + { conv_key(89, 30, 17, 256, 128, 0, 0), 8 }, + { conv_key(89, 30, 17, 512, 128, 0, 0), 8 }, + { conv_key(89, 40, 24, 256, 128, 0, 0), 8 }, + { conv_key(89, 40, 24, 512, 128, 0, 0), 8 }, + { conv_key(89, 40, 24, 1024, 256, 0, 0), 18 }, + { conv_key(89, 52, 30, 512, 256, 0, 0), 18 }, + { conv_key(89, 52, 30, 768, 192, 0, 0), 7 }, + { conv_key(89, 52, 30, 768, 384, 0, 0), 7 }, + { conv_key(89, 52, 30, 1024, 256, 0, 0), 5 }, + { conv_key(89, 52, 30, 1024, 512, 0, 0), 14 }, + { conv_key(89, 52, 30, 1536, 384, 0, 0), 14 }, + { conv_key(89, 52, 30, 2048, 512, 0, 0), 9 }, + { conv_key(89, 52, 30, 3072, 768, 0, 0), 14 }, + { conv_key(89, 52, 32, 256, 128, 0, 0), 8 }, + { conv_key(89, 52, 32, 512, 128, 0, 0), 7 }, + { conv_key(89, 52, 32, 1024, 256, 0, 0), 5 }, + { conv_key(89, 52, 32, 2048, 512, 0, 0), 14 }, + { conv_key(89, 60, 34, 256, 128, 0, 0), 19 }, + { conv_key(89, 60, 34, 512, 128, 0, 0), 7 }, + { conv_key(89, 60, 34, 1024, 256, 0, 0), 5 }, + { conv_key(89, 80, 45, 512, 256, 0, 0), 5 }, + { conv_key(89, 80, 45, 768, 384, 0, 0), 14 }, + { conv_key(89, 80, 45, 2048, 512, 0, 0), 14 }, + { conv_key(89, 80, 45, 3072, 768, 0, 0), 14 }, + { conv_key(89, 80, 48, 256, 128, 0, 0), 7 }, + { conv_key(89, 80, 48, 512, 128, 0, 0), 5 }, + { conv_key(89, 80, 48, 1024, 256, 0, 0), 10 }, + { conv_key(89, 80, 48, 2048, 512, 0, 0), 9 }, + { conv_key(89, 104, 60, 512, 256, 0, 0), 9 }, + { conv_key(89, 104, 60, 768, 192, 0, 0), 14 }, + { conv_key(89, 104, 60, 1024, 256, 0, 0), 14 }, + { conv_key(89, 104, 60, 1024, 512, 0, 0), 9 }, + { conv_key(89, 104, 60, 1536, 384, 0, 0), 14 }, + { conv_key(89, 104, 60, 2048, 512, 0, 0), 14 }, + { conv_key(89, 120, 68, 256, 128, 0, 0), 5 }, + { conv_key(89, 120, 68, 512, 128, 0, 0), 2 }, + { conv_key(89, 120, 68, 512, 256, 0, 0), 10 }, + { conv_key(89, 120, 68, 768, 384, 0, 0), 14 }, + { conv_key(89, 120, 68, 1024, 256, 0, 0), 14 }, + { conv_key(89, 120, 68, 2048, 512, 0, 0), 14 }, + { conv_key(89, 120, 68, 3072, 768, 0, 0), 14 }, + { conv_key(89, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 768, 192, 0, 0), 14 }, + { conv_key(89, 160, 90, 1024, 256, 0, 0), 14 }, + { conv_key(89, 160, 90, 1024, 512, 0, 0), 14 }, + { conv_key(89, 160, 90, 1536, 384, 0, 0), 14 }, + { conv_key(89, 160, 90, 2048, 512, 0, 0), 14 }, + { conv_key(89, 240, 135, 512, 256, 0, 0), 14 }, + { conv_key(89, 240, 135, 768, 384, 0, 0), 14 }, + { conv_key(89, 240, 135, 2048, 512, 0, 0), 14 }, + { conv_key(89, 240, 135, 3072, 768, 0, 0), 9 }, + { conv_key(89, 240, 136, 256, 128, 0, 0), 14 }, + { conv_key(89, 240, 136, 512, 128, 0, 0), 2 }, + { conv_key(89, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(89, 240, 136, 768, 192, 0, 0), 14 }, + { conv_key(89, 240, 136, 1024, 256, 0, 0), 14 }, + { conv_key(89, 240, 136, 1024, 512, 0, 0), 14 }, + { conv_key(89, 240, 136, 1536, 384, 0, 0), 14 }, + { conv_key(89, 240, 136, 2048, 512, 0, 0), 14 }, + { conv_key(89, 480, 270, 512, 256, 0, 0), 14 }, + { conv_key(89, 480, 270, 768, 192, 0, 0), 14 }, + { conv_key(89, 480, 270, 1024, 256, 0, 0), 14 }, + { conv_key(89, 480, 270, 1024, 512, 0, 0), 9 }, + { conv_key(89, 480, 270, 1536, 384, 0, 0), 14 }, + { conv_key(89, 480, 270, 2048, 512, 0, 0), 9 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 7, 4, 256, 128, 0, 0), 8 }, + { conv_key(90, 7, 4, 512, 128, 0, 0), 8 }, + { conv_key(90, 13, 8, 256, 128, 0, 0), 8 }, + { conv_key(90, 13, 8, 512, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 256, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 512, 128, 0, 0), 8 }, + { conv_key(90, 14, 8, 1024, 256, 0, 0), 8 }, + { conv_key(90, 20, 12, 256, 128, 0, 0), 8 }, + { conv_key(90, 20, 12, 512, 128, 0, 0), 8 }, + { conv_key(90, 26, 15, 512, 256, 0, 0), 8 }, + { conv_key(90, 26, 15, 768, 384, 0, 0), 8 }, + { conv_key(90, 26, 15, 2048, 512, 0, 0), 29 }, + { conv_key(90, 26, 15, 3072, 768, 0, 0), 27 }, + { conv_key(90, 26, 16, 256, 128, 0, 0), 8 }, + { conv_key(90, 26, 16, 512, 128, 0, 0), 8 }, + { conv_key(90, 26, 16, 1024, 256, 0, 0), 8 }, + { conv_key(90, 28, 16, 256, 128, 0, 0), 8 }, + { conv_key(90, 28, 16, 512, 128, 0, 0), 8 }, + { conv_key(90, 28, 16, 1024, 256, 0, 0), 8 }, + { conv_key(90, 28, 16, 2048, 512, 0, 0), 29 }, + { conv_key(90, 30, 17, 256, 128, 0, 0), 8 }, + { conv_key(90, 30, 17, 512, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 256, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 512, 128, 0, 0), 8 }, + { conv_key(90, 40, 24, 1024, 256, 0, 0), 29 }, + { conv_key(90, 52, 30, 512, 256, 0, 0), 29 }, + { conv_key(90, 52, 30, 768, 192, 0, 0), 29 }, + { conv_key(90, 52, 30, 768, 384, 0, 0), 29 }, + { conv_key(90, 52, 30, 1024, 256, 0, 0), 29 }, + { conv_key(90, 52, 30, 1024, 512, 0, 0), 29 }, + { conv_key(90, 52, 30, 1536, 384, 0, 0), 29 }, + { conv_key(90, 52, 30, 2048, 512, 0, 0), 14 }, + { conv_key(90, 52, 30, 3072, 768, 0, 0), 27 }, + { conv_key(90, 52, 32, 256, 128, 0, 0), 8 }, + { conv_key(90, 52, 32, 512, 128, 0, 0), 29 }, + { conv_key(90, 52, 32, 1024, 256, 0, 0), 29 }, + { conv_key(90, 52, 32, 2048, 512, 0, 0), 14 }, + { conv_key(90, 60, 34, 256, 128, 0, 0), 8 }, + { conv_key(90, 60, 34, 512, 128, 0, 0), 29 }, + { conv_key(90, 60, 34, 1024, 256, 0, 0), 29 }, + { conv_key(90, 80, 45, 512, 256, 0, 0), 29 }, + { conv_key(90, 80, 45, 768, 384, 0, 0), 29 }, + { conv_key(90, 80, 45, 2048, 512, 0, 0), 14 }, + { conv_key(90, 80, 45, 3072, 768, 0, 0), 27 }, + { conv_key(90, 80, 48, 256, 128, 0, 0), 29 }, + { conv_key(90, 80, 48, 512, 128, 0, 0), 29 }, + { conv_key(90, 80, 48, 1024, 256, 0, 0), 14 }, + { conv_key(90, 80, 48, 2048, 512, 0, 0), 14 }, + { conv_key(90, 104, 60, 512, 256, 0, 0), 29 }, + { conv_key(90, 104, 60, 768, 192, 0, 0), 14 }, + { conv_key(90, 104, 60, 1024, 256, 0, 0), 14 }, + { conv_key(90, 104, 60, 1024, 512, 0, 0), 14 }, + { conv_key(90, 104, 60, 1536, 384, 0, 0), 14 }, + { conv_key(90, 104, 60, 2048, 512, 0, 0), 14 }, + { conv_key(90, 120, 68, 256, 128, 0, 0), 29 }, + { conv_key(90, 120, 68, 512, 128, 0, 0), 14 }, + { conv_key(90, 120, 68, 512, 256, 0, 0), 14 }, + { conv_key(90, 120, 68, 768, 384, 0, 0), 14 }, + { conv_key(90, 120, 68, 1024, 256, 0, 0), 30 }, + { conv_key(90, 120, 68, 2048, 512, 0, 0), 27 }, + { conv_key(90, 120, 68, 3072, 768, 0, 0), 27 }, + { conv_key(90, 160, 90, 512, 256, 0, 0), 14 }, + { conv_key(90, 160, 90, 768, 192, 0, 0), 14 }, + { conv_key(90, 160, 90, 1024, 256, 0, 0), 14 }, + { conv_key(90, 160, 90, 1024, 512, 0, 0), 27 }, + { conv_key(90, 160, 90, 1536, 384, 0, 0), 14 }, + { conv_key(90, 160, 90, 2048, 512, 0, 0), 27 }, + { conv_key(90, 240, 135, 512, 256, 0, 0), 14 }, + { conv_key(90, 240, 135, 768, 384, 0, 0), 27 }, + { conv_key(90, 240, 135, 2048, 512, 0, 0), 27 }, + { conv_key(90, 240, 135, 3072, 768, 0, 0), 31 }, + { conv_key(90, 240, 136, 256, 128, 0, 0), 27 }, + { conv_key(90, 240, 136, 512, 128, 0, 0), 31 }, + { conv_key(90, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(90, 240, 136, 768, 192, 0, 0), 14 }, + { conv_key(90, 240, 136, 1024, 256, 0, 0), 14 }, + { conv_key(90, 240, 136, 1024, 512, 0, 0), 27 }, + { conv_key(90, 240, 136, 1536, 384, 0, 0), 27 }, + { conv_key(90, 240, 136, 2048, 512, 0, 0), 14 }, + { conv_key(90, 480, 270, 512, 256, 0, 0), 31 }, + { conv_key(90, 480, 270, 768, 192, 0, 0), 27 }, + { conv_key(90, 480, 270, 1024, 256, 0, 0), 31 }, + { conv_key(90, 480, 270, 1024, 512, 0, 0), 31 }, + { conv_key(90, 480, 270, 1536, 384, 0, 0), 31 }, + { conv_key(90, 480, 270, 2048, 512, 0, 0), 31 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 7, 4, 256, 128, 0, 0), 8 }, + { conv_key(100, 7, 4, 512, 128, 0, 0), 7 }, + { conv_key(100, 13, 8, 256, 128, 0, 0), 18 }, + { conv_key(100, 13, 8, 512, 128, 0, 0), 19 }, + { conv_key(100, 14, 8, 256, 128, 0, 0), 8 }, + { conv_key(100, 14, 8, 512, 128, 0, 0), 7 }, + { conv_key(100, 14, 8, 1024, 256, 0, 0), 19 }, + { conv_key(100, 20, 12, 256, 128, 0, 0), 8 }, + { conv_key(100, 20, 12, 512, 128, 0, 0), 28 }, + { conv_key(100, 26, 15, 512, 256, 0, 0), 8 }, + { conv_key(100, 26, 15, 768, 384, 0, 0), 8 }, + { conv_key(100, 26, 15, 2048, 512, 0, 0), 8 }, + { conv_key(100, 26, 15, 3072, 768, 0, 0), 8 }, + { conv_key(100, 26, 16, 256, 128, 0, 0), 19 }, + { conv_key(100, 26, 16, 512, 128, 0, 0), 19 }, + { conv_key(100, 26, 16, 1024, 256, 0, 0), 29 }, + { conv_key(100, 28, 16, 256, 128, 0, 0), 7 }, + { conv_key(100, 28, 16, 512, 128, 0, 0), 19 }, + { conv_key(100, 28, 16, 1024, 256, 0, 0), 8 }, + { conv_key(100, 28, 16, 2048, 512, 0, 0), 8 }, + { conv_key(100, 30, 17, 256, 128, 0, 0), 8 }, + { conv_key(100, 30, 17, 512, 128, 0, 0), 19 }, + { conv_key(100, 40, 24, 256, 128, 0, 0), 7 }, + { conv_key(100, 40, 24, 512, 128, 0, 0), 8 }, + { conv_key(100, 40, 24, 1024, 256, 0, 0), 8 }, + { conv_key(100, 52, 30, 512, 256, 0, 0), 8 }, + { conv_key(100, 52, 30, 768, 192, 0, 0), 29 }, + { conv_key(100, 52, 30, 768, 384, 0, 0), 8 }, + { conv_key(100, 52, 30, 1024, 256, 0, 0), 29 }, + { conv_key(100, 52, 30, 1024, 512, 0, 0), 29 }, + { conv_key(100, 52, 30, 1536, 384, 0, 0), 29 }, + { conv_key(100, 52, 30, 2048, 512, 0, 0), 29 }, + { conv_key(100, 52, 30, 3072, 768, 0, 0), 29 }, + { conv_key(100, 52, 32, 256, 128, 0, 0), 8 }, + { conv_key(100, 52, 32, 512, 128, 0, 0), 8 }, + { conv_key(100, 52, 32, 1024, 256, 0, 0), 29 }, + { conv_key(100, 52, 32, 2048, 512, 0, 0), 29 }, + { conv_key(100, 60, 34, 256, 128, 0, 0), 7 }, + { conv_key(100, 60, 34, 512, 128, 0, 0), 8 }, + { conv_key(100, 60, 34, 1024, 256, 0, 0), 29 }, + { conv_key(100, 80, 45, 512, 256, 0, 0), 29 }, + { conv_key(100, 80, 45, 768, 384, 0, 0), 29 }, + { conv_key(100, 80, 45, 2048, 512, 0, 0), 29 }, + { conv_key(100, 80, 45, 3072, 768, 0, 0), 14 }, + { conv_key(100, 80, 48, 256, 128, 0, 0), 29 }, + { conv_key(100, 80, 48, 512, 128, 0, 0), 29 }, + { conv_key(100, 80, 48, 1024, 256, 0, 0), 27 }, + { conv_key(100, 80, 48, 2048, 512, 0, 0), 29 }, + { conv_key(100, 104, 60, 512, 256, 0, 0), 29 }, + { conv_key(100, 104, 60, 768, 192, 0, 0), 27 }, + { conv_key(100, 104, 60, 1024, 256, 0, 0), 14 }, + { conv_key(100, 104, 60, 1024, 512, 0, 0), 14 }, + { conv_key(100, 104, 60, 1536, 384, 0, 0), 14 }, + { conv_key(100, 104, 60, 2048, 512, 0, 0), 14 }, + { conv_key(100, 120, 68, 256, 128, 0, 0), 29 }, + { conv_key(100, 120, 68, 512, 128, 0, 0), 27 }, + { conv_key(100, 120, 68, 512, 256, 0, 0), 27 }, + { conv_key(100, 120, 68, 768, 384, 0, 0), 14 }, + { conv_key(100, 120, 68, 1024, 256, 0, 0), 29 }, + { conv_key(100, 120, 68, 2048, 512, 0, 0), 14 }, + { conv_key(100, 120, 68, 3072, 768, 0, 0), 14 }, + { conv_key(100, 160, 90, 512, 256, 0, 0), 29 }, + { conv_key(100, 160, 90, 768, 192, 0, 0), 14 }, + { conv_key(100, 160, 90, 1024, 256, 0, 0), 14 }, + { conv_key(100, 160, 90, 1024, 512, 0, 0), 14 }, + { conv_key(100, 160, 90, 1536, 384, 0, 0), 14 }, + { conv_key(100, 160, 90, 2048, 512, 0, 0), 14 }, + { conv_key(100, 240, 135, 512, 256, 0, 0), 14 }, + { conv_key(100, 240, 135, 768, 384, 0, 0), 14 }, + { conv_key(100, 240, 135, 2048, 512, 0, 0), 14 }, + { conv_key(100, 240, 135, 3072, 768, 0, 0), 14 }, + { conv_key(100, 240, 136, 256, 128, 0, 0), 29 }, + { conv_key(100, 240, 136, 512, 128, 0, 0), 14 }, + { conv_key(100, 240, 136, 512, 256, 0, 0), 14 }, + { conv_key(100, 240, 136, 768, 192, 0, 0), 14 }, + { conv_key(100, 240, 136, 1024, 256, 0, 0), 14 }, + { conv_key(100, 240, 136, 1024, 512, 0, 0), 14 }, + { conv_key(100, 240, 136, 1536, 384, 0, 0), 14 }, + { conv_key(100, 240, 136, 2048, 512, 0, 0), 14 }, + { conv_key(100, 480, 270, 512, 256, 0, 0), 14 }, + { conv_key(100, 480, 270, 768, 192, 0, 0), 14 }, + { conv_key(100, 480, 270, 1024, 256, 0, 0), 14 }, + { conv_key(100, 480, 270, 1024, 512, 0, 0), 14 }, + { conv_key(100, 480, 270, 1536, 384, 0, 0), 14 }, + { conv_key(100, 480, 270, 2048, 512, 0, 0), 14 }, +#endif +}; + +at::Tensor conv1x1_bias_wsilu_chunk_add(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& bias, + const at::Tensor& weight0, const at::Tensor& weight1, + const at::Tensor& weight2, const at::Tensor& weight3, + const at::Tensor& bias0, const at::Tensor& bias1, + const at::Tensor& bias2, const at::Tensor& bias3, + at::Tensor& out_buf) +{ + if (sm < 75) { + auto out = at::conv2d(feature, weight); + out = out + bias.reshape({ 1, -1, 1, 1 }); + out = out * at::sigmoid(out * 4.f); + auto x1 = out.index({ at::indexing::Slice(), at::indexing::Slice(0, at::nullopt, 4), + at::indexing::Slice(), at::indexing::Slice() }); + auto x2 = out.index({ at::indexing::Slice(), at::indexing::Slice(1, at::nullopt, 4), + at::indexing::Slice(), at::indexing::Slice() }); + auto x3 = out.index({ at::indexing::Slice(), at::indexing::Slice(2, at::nullopt, 4), + at::indexing::Slice(), at::indexing::Slice() }); + auto x4 = out.index({ at::indexing::Slice(), at::indexing::Slice(3, at::nullopt, 4), + at::indexing::Slice(), at::indexing::Slice() }); + return x1 + x2 + x3 + x4; + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv1x1_bias_generic_cutlass( + out_buf, feature, weight, bias, at::nullopt, at::nullopt, at::nullopt, weight0, weight1, + weight2, weight3, bias0, bias1, bias2, bias3); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_BIAS_WSILU_CHUNK_ADD, + HINT_MAP_BIAS_WSILU_CHUNK_ADD_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add_kernel.h b/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add_kernel.h new file mode 100644 index 0000000..2081c09 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_bias_wsilu_chunk_add_kernel.h @@ -0,0 +1,170 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// clang-format off +#include +#include +#include +// clang-format on + +#include "cutlass_kernel.h" +#include "../common_cu.h" +#include "sm90_quad_gemm/sm90_builder_epilogue.h" +#include "sm90_quad_gemm/sm90_builder_mainloop.h" +#include "sm90_quad_gemm/sm90_gemm_tma_warpspecialized_cooperative_quad.h" + +#if CURRENT_DEVICE_SM == 90 +template +at::Tensor +conv1x1_bias_wsilu_chunk_add_generic_cutlass3(at::Tensor& out_buf, const at::Tensor& feature, + const at::Tensor& weight0, const at::Tensor& weight1, + const at::Tensor& weight2, const at::Tensor& weight3, + const at::Tensor& bias0, const at::Tensor& bias1, + const at::Tensor& bias2, const at::Tensor& bias3) +{ + if constexpr (std::is_same_v, cute::_256>) { + std::cerr << "conv1x1_bias_wsilu_chunk_add_generic_cutlass3: The second value of " + "Sm::TileShape cannot be cute::_256!" + << std::endl; + return at::Tensor(); + } + + using ElementA = cutlass::half_t; + using ElementB = cutlass::half_t; + using ElementC = cutlass::half_t; + using ElementD = cutlass::half_t; + using ElementCompute = cutlass::half_t; + + using LayoutA = cutlass::layout::RowMajor; + using LayoutB = cutlass::layout::ColumnMajor; + using LayoutC = cutlass::layout::RowMajor; + + constexpr int AlignmentA = 128 / cutlass::sizeof_bits_v; + constexpr int AlignmentB = 128 / cutlass::sizeof_bits_v; + constexpr int AlignmentC = 128 / cutlass::sizeof_bits_v; + constexpr int AlignmentD = 128 / cutlass::sizeof_bits_v; + static constexpr auto RoundStyle = cutlass::FloatRoundStyle::round_to_nearest; + + using SmArch = typename Sm::SmArch; + using TileShape = typename Sm::TileShape; + using ClusterShape = typename Sm::ClusterShape; + using EpilogueTileType = cutlass::epilogue::collective::EpilogueTileAuto; + using EpilogueSchedule = typename Sm::EpilogueSchedule; + using KernelSchedule = typename Sm::KernelSchedule; + + using FinalEVT = cutlass::epilogue::fusion::Sm90EVT< + cutlass::epilogue::fusion::Sm90Compute, // wsilu + cutlass::epilogue::fusion::Sm90EVT< + cutlass::epilogue::fusion::Sm90Compute, // plus + cutlass::epilogue::fusion::Sm90RowBroadcast<0, TileShape, ElementC, ElementCompute>, // bias + cutlass::epilogue::fusion::Sm90AccFetch // acc + >>; + + using CollectiveEpilogue = typename QuadCollectiveBuilderEpilogue< + SmArch, cutlass::arch::OpClassTensorOp, TileShape, ClusterShape, EpilogueTileType, + ElementCompute, ElementCompute, ElementC, LayoutC, AlignmentC, ElementD, LayoutC, + AlignmentD, EpilogueSchedule, FinalEVT>::CollectiveOp; + + using CollectiveMainloop = typename QuadCollectiveBuilderMainloop< + SmArch, cutlass::arch::OpClassTensorOp, ElementA, LayoutA, AlignmentA, ElementB, LayoutB, + AlignmentB, ElementCompute, TileShape, ClusterShape, + cutlass::gemm::collective::StageCount<2>, KernelSchedule>::CollectiveOp; + + using GemmKernel = QuadGemmUniversal, // Indicates ProblemShape + CollectiveMainloop, CollectiveEpilogue>; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + + const int B = feature.size(0); + const int C1 = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight0.size(0); + const int C1_ = weight0.size(1); + const int KH_ = weight0.size(2); + const int KW_ = weight0.size(3); + assert(C1 == C1_ && KH_ == 1 && KW_ == 1); + assert(weight0.sizes() == weight1.sizes()); + assert(weight0.sizes() == weight2.sizes()); + assert(weight0.sizes() == weight3.sizes()); + assert(bias0.sizes() == bias1.sizes()); + assert(bias0.sizes() == bias2.sizes()); + assert(bias0.sizes() == bias3.sizes()); + const int M = H * W; + const int N = C2; + const int K = C1; + const typename GemmKernel::ProblemShape problem_size{ M, N, K, 1 }; + + // Note: It is assumed that the 4 weights are interleaved splits of a contiguous weight. + typename Gemm::Arguments args{ + cutlass::gemm::GemmUniversalMode::kGemm, + problem_size, + { static_cast(feature.data_ptr()), + cute::Stride{ feature.stride(3), cute::_1{}, 0 }, + static_cast(weight0.data_ptr()), static_cast(weight1.data_ptr()), + static_cast(weight2.data_ptr()), static_cast(weight3.data_ptr()), + cute::Stride{ weight0.stride(3) * 4, cute::_1{}, 0 } }, + { {}, + {}, + {}, + {}, // epilogue arguments, updated later + nullptr, + cute::Stride{ 0, cute::_1{}, 0 }, + static_cast(out_buf.data_ptr()), + cute::Stride{ out_buf.stride(3), cute::_1{}, 0 } }, + }; + + args.epilogue.thread0 = { + { + { static_cast(bias0.data_ptr()) }, // bias + {}, // acc + {} // plus + }, + {} // WSiLU + }; + args.epilogue.thread1 = { + { + { static_cast(bias1.data_ptr()) }, // bias + {}, // acc + {} // plus + }, + {} // WSiLU + }; + args.epilogue.thread2 = { + { + { static_cast(bias2.data_ptr()) }, // bias + {}, // acc + {} // plus + }, + {} // WSiLU + }; + args.epilogue.thread3 = { + { + { static_cast(bias3.data_ptr()) }, // bias + {}, // acc + {} // plus + }, + {} // WSiLU + }; + + args.scheduler.max_swizzle_size = 1; + args.scheduler.raster_order = + cutlass::gemm::kernel::detail::PersistentTileSchedulerSm90Params::RasterOrderOptions::Heuristic; + + Gemm gemm_op; + cutlass::Status status = gemm_op.can_implement(args); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM cannot implement: " << cutlass::cutlassGetStatusString(status) << std::endl; + return at::Tensor(); + } + + auto stream = at::cuda::getCurrentCUDAStream(); + status = gemm_op(args, nullptr, stream, /* cuda_adapter */ nullptr, /* launch_with_pdl */ true); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM failed: " << cutlass::cutlassGetStatusString(status) << std::endl; + return at::Tensor(); + } + + return out_buf; +} +#endif diff --git a/src/layers/extensions/inference/cutlass/conv1x1_kernel.h b/src/layers/extensions/inference/cutlass/conv1x1_kernel.h new file mode 100644 index 0000000..893c7c1 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv1x1_kernel.h @@ -0,0 +1,435 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +#include +#include +#include +#include +// clang-format on + +#include "conv1x1_bias_wsilu_chunk_add_kernel.h" +#include "cutlass_epilogue.h" +#include "cutlass_kernel.h" +#include "../common_cu.h" +#include "../cutlass_helper_gemm.h" +#include "../def_cutlass.h" + +template +at::Tensor conv1x1_bias_generic_cutlass2(at::Tensor& out_buf, const at::Tensor& feature, + const at::Tensor& weight, const at::optional& bias, + const at::optional& shortcut1, + const at::optional& shortcut2, + const at::optional& quant) +{ + constexpr int NumAdditionalInput = NumShortcuts + (WithQuant ? 1 : 0); + static_assert(NumAdditionalInput <= 2); + using EpilogueOp = + LinearCombination, + 128 / cutlass::sizeof_bits_v>; + + using Gemm = CustomGemmUniversalWithBroadcast< + cutlass::half_t, cutlass::layout::RowMajor, cutlass::half_t, cutlass::layout::ColumnMajor, + cutlass::half_t, cutlass::layout::RowMajor, cutlass::half_t, cutlass::arch::OpClassTensorOp, + typename Sm::SmArch, typename Sm::ShapeThreadBlock, typename Sm::ShapeWarp, typename Sm::ShapeOp, + EpilogueOp, cutlass::gemm::threadblock::GemmIdentityThreadblockSwizzle<8>, Sm::Stages>; + + const int B = feature.size(0); + const int C1 = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1_ = weight.size(1); + const int KH_ = weight.size(2); + const int KW_ = weight.size(3); + assert(C1 == C1_ && KH_ == 1 && KW_ == 1); + const int M = H * W; + const int N = C2; + const int K = C1; + const cutlass::gemm::GemmCoord problem_size(M, N, K); + + void* additional_input1_ptr = nullptr; + void* additional_input2_ptr = nullptr; + int additional_input1_stride = 0; + int additional_input2_stride = 0; + if constexpr (NumAdditionalInput == 1) { + if constexpr (WithQuant) { + additional_input1_ptr = quant.value().data_ptr(); + additional_input1_stride = 0; + } else { + additional_input1_ptr = shortcut1.value().data_ptr(); + additional_input1_stride = shortcut1.value().stride(3); + } + } + if constexpr (NumAdditionalInput == 2) { + additional_input1_ptr = shortcut1.value().data_ptr(); + additional_input1_stride = shortcut1.value().stride(3); + if constexpr (WithQuant) { + additional_input2_ptr = quant.value().data_ptr(); + additional_input2_stride = 0; + } else { + additional_input2_ptr = shortcut2.value().data_ptr(); + additional_input2_stride = shortcut2.value().stride(3); + } + } + + // Note: the following tensors may be part of a pre-allocated tensor of shape [B, C1 + C2, H, W], channels_last. + typename Gemm::Arguments args; + if constexpr (NumAdditionalInput < 2) { + args = { + cutlass::gemm::GemmUniversalMode::kGemm, + problem_size, + 1, // int batch_count + {}, // args for epilogue + feature.data_ptr(), + weight.data_ptr(), + additional_input1_ptr, + ChunkAdd ? nullptr : out_buf.data_ptr(), + WithBias ? bias.value().data_ptr() : nullptr, + ChunkAdd ? out_buf.data_ptr() : nullptr, // pointer of 2nd output + 0, // int64_t batch_stride_A + 0, // int64_t batch_stride_B + 0, // int64_t batch_stride_C (shortcut) + 0, // int64_t batch_stride_D + 0, // int64_t batch_stride_Vector (bias) + 0, // int64_t batch_stride_Tensor (2nd output) + feature.stride(3), // typename LayoutA::Stride::Index lda + weight.stride(3), // typename LayoutB::Stride::Index ldb + additional_input1_stride, + ChunkAdd ? 0 : out_buf.stride(3), // typename LayoutC::Stride::Index ldd + 0, // typename LayoutC::Stride::Index ldr (bias) + ChunkAdd ? out_buf.stride(3) * 4 : 0 // typename LayoutC::Stride::Index ldt (2nd output) + }; + } else if constexpr (NumAdditionalInput == 2) { + args = { + cutlass::gemm::GemmUniversalMode::kGemm, + problem_size, + 1, // int batch_count + {}, // args for epilogue + feature.data_ptr(), + weight.data_ptr(), + additional_input1_ptr, + additional_input2_ptr, + ChunkAdd ? nullptr : out_buf.data_ptr(), + WithBias ? bias.value().data_ptr() : nullptr, + ChunkAdd ? out_buf.data_ptr() : nullptr, // pointer of 2nd output + 0, // int64_t batch_stride_A + 0, // int64_t batch_stride_B + 0, // int64_t batch_stride_C1 (shortcut1) + 0, // int64_t batch_stride_C2 (shortcut2) + 0, // int64_t batch_stride_D + 0, // int64_t batch_stride_Vector (bias) + 0, // int64_t batch_stride_Tensor (2nd output) + feature.stride(3), // typename LayoutA::Stride::Index lda + weight.stride(3), // typename LayoutB::Stride::Index ldb + additional_input1_stride, + additional_input2_stride, + ChunkAdd ? 0 : out_buf.stride(3), // typename LayoutC::Stride::Index ldd + 0, // typename LayoutC::Stride::Index ldr (bias) + ChunkAdd ? out_buf.stride(3) : 0 // typename LayoutC::Stride::Index ldt (2nd output) + }; + } else { + assert(false); + } + + Gemm gemm_op; + cutlass::Status status = gemm_op.can_implement(args); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM cannot implement: " << cutlass::cutlassGetStatusString(status) << std::endl; + return at::Tensor(); + } + + auto stream = at::cuda::getCurrentCUDAStream(); + status = gemm_op(args, nullptr, stream); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM failed: " << cutlass::cutlassGetStatusString(status) << std::endl; + return at::Tensor(); + } + + return out_buf; +} + +#if CURRENT_DEVICE_SM == 90 || CURRENT_DEVICE_SM == 100 +template +at::Tensor conv1x1_bias_generic_cutlass3(at::Tensor& out_buf, const at::Tensor& feature, + const at::Tensor& weight, const at::optional& bias, + const at::optional& shortcut1, + const at::optional& shortcut2, + const at::optional& quant) +{ + static_assert(!ChunkAdd); + using ElementA = cutlass::half_t; + using ElementB = cutlass::half_t; + using ElementC = cutlass::half_t; + using ElementD = cutlass::half_t; + using ElementCompute = cutlass::half_t; + + using LayoutA = cutlass::layout::RowMajor; + using LayoutB = cutlass::layout::ColumnMajor; + using LayoutC = cutlass::layout::RowMajor; + + static constexpr int AlignmentA = 128 / cutlass::sizeof_bits_v; + static constexpr int AlignmentB = 128 / cutlass::sizeof_bits_v; + static constexpr int AlignmentC = 128 / cutlass::sizeof_bits_v; + static constexpr int AlignmentD = 128 / cutlass::sizeof_bits_v; + static constexpr auto RoundStyle = cutlass::FloatRoundStyle::round_to_nearest; + + using SmArch = typename Sm::SmArch; + using TileShape = typename Sm::TileShape; + using ClusterShape = typename Sm::ClusterShape; + using EpilogueTileType = cutlass::epilogue::collective::EpilogueTileAuto; + using EpilogueSchedule = typename Sm::EpilogueSchedule; + using KernelSchedule = typename Sm::KernelSchedule; + + using GmemStrideTypeC = cutlass::detail::TagToStrideC_t; + using EpilogueDescriptor = std::conditional_t< + std::is_same_v, + cutlass::epilogue::collective::detail::EpilogueDescriptor, + cutlass::epilogue::collective::detail::Sm100EpilogueDescriptor< + cutlass::arch::OpClassTensorOp, TileShape, EpilogueTileType, ElementCompute, ElementC, + ElementD, EpilogueSchedule, GmemStrideTypeC, GmemStrideTypeC, false, false>>; + using AuxLoadDescriptor = std::conditional_t< + std::is_same_v, + cutlass::epilogue::collective::detail::AuxLoadDescriptor, + cutlass::epilogue::collective::detail::Sm100AuxLoadDescriptor>; + using AuxLoad = cutlass::epilogue::fusion::Sm90AuxLoad< + AuxLoadDescriptor::Stages, typename AuxLoadDescriptor::EpilogueTile, + typename AuxLoadDescriptor::Element, typename AuxLoadDescriptor::Stride, + typename AuxLoadDescriptor::SmemLayoutAtom, typename AuxLoadDescriptor::CopyOpS2R>; + + using AccEVT = cutlass::epilogue::fusion::Sm90AccFetch; + + using BiasEVT = std::conditional_t< + WithBias, + cutlass::epilogue::fusion::Sm90EVT< + cutlass::epilogue::fusion::Sm90Compute, // plus + cutlass::epilogue::fusion::Sm90RowBroadcast<0, TileShape, ElementC, ElementCompute>, // bias + AccEVT // acc + >, + AccEVT>; + + using Shortcut1EVT = std::conditional_t< + NumShortcuts >= 1, + cutlass::epilogue::fusion::Sm90EVT< + cutlass::epilogue::fusion::Sm90Compute, // plus + cutlass::epilogue::fusion::Sm90SrcFetch, // shortcut1 + BiasEVT // acc + bias + >, + BiasEVT>; + + using Shortcut2EVT = std::conditional_t< + NumShortcuts == 2, + cutlass::epilogue::fusion::Sm90EVT< + cutlass::epilogue::fusion::Sm90Compute, // plus + AuxLoad, // shortcut2 + Shortcut1EVT // acc + bias + shortcut1 + >, + Shortcut1EVT>; + + using QuantEVT = std::conditional_t< + WithQuant, + cutlass::epilogue::fusion::Sm90EVT< + cutlass::epilogue::fusion::Sm90Compute, // multiply + cutlass::epilogue::fusion::Sm90RowBroadcast<0, TileShape, ElementC, ElementCompute>, // quant + Shortcut2EVT // acc + bias + shortcut1 + shortcut2 + >, + Shortcut2EVT>; + + using FinalEVT = std::conditional_t< + WSiLU, + cutlass::epilogue::fusion::Sm90EVT, // wsilu + QuantEVT // previous + >, + QuantEVT>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + SmArch, cutlass::arch::OpClassTensorOp, TileShape, ClusterShape, EpilogueTileType, + ElementCompute, ElementCompute, ElementC, LayoutC, AlignmentC, ElementD, LayoutC, + AlignmentD, EpilogueSchedule, FinalEVT>::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + SmArch, cutlass::arch::OpClassTensorOp, ElementA, LayoutA, AlignmentA, ElementB, LayoutB, + AlignmentB, ElementCompute, TileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout( + sizeof(typename CollectiveEpilogue::SharedStorage))>, + KernelSchedule>::CollectiveOp; + + using GemmKernel = + cutlass::gemm::kernel::GemmUniversal, // Indicates ProblemShape + CollectiveMainloop, CollectiveEpilogue>; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + + const int B = feature.size(0); + const int C1 = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1_ = weight.size(1); + const int KH_ = weight.size(2); + const int KW_ = weight.size(3); + assert(C1 == C1_ && KH_ == 1 && KW_ == 1); + const int M = H * W; + const int N = C2; + const int K = C1; + const typename GemmKernel::ProblemShape problem_size{ M, N, K, 1 }; + + // Note: the following tensors may be part of a pre-allocated tensor of shape [B, C1 + C2, H, W], channels_last. + typename Gemm::Arguments args{ + cutlass::gemm::GemmUniversalMode::kGemm, + problem_size, + { static_cast(feature.data_ptr()), + cute::Stride{ feature.stride(3), cute::_1{}, 0 }, + static_cast(weight.data_ptr()), + cute::Stride{ weight.stride(3), cute::_1{}, 0 } }, + { {}, // epilogue arguments, updated later + shortcut1.has_value() ? static_cast(shortcut1.value().data_ptr()) : nullptr, + cute::Stride{ + shortcut1.has_value() ? shortcut1.value().stride(3) : 0, cute::_1{}, 0 }, + static_cast(out_buf.data_ptr()), + cute::Stride{ out_buf.stride(3), cute::_1{}, 0 } }, + }; + + typename AccEVT::Arguments acc_args = {}; + typename BiasEVT::Arguments bias_args; + + if constexpr (WithBias) { + bias_args = { + { static_cast(bias.value().data_ptr()) }, // bias + acc_args, // acc + {} // plus + }; + } else { + bias_args = acc_args; + } + + typename Shortcut1EVT::Arguments shortcut1_args; + + if constexpr (NumShortcuts >= 1) { + shortcut1_args = { + {}, // shortcut1 + bias_args, // acc + bias + {} // plus + }; + } else { + shortcut1_args = bias_args; + } + + typename Shortcut2EVT::Arguments shortcut2_args; + + if constexpr (NumShortcuts == 2) { + shortcut2_args = { + { + static_cast(shortcut2.value().data_ptr()), // ptr + static_cast(0), // null_default + cute::Stride{ shortcut2.value().stride(3), cute::_1{}, 0 } // stride + }, // shortcut2 + shortcut1_args, // acc + bias + shortcut1 + {} // plus + }; + } else { + shortcut2_args = shortcut1_args; + } + + typename QuantEVT::Arguments quant_args; + + if constexpr (WithQuant) { + quant_args = { + { + static_cast(quant.value().data_ptr()), // ptr + static_cast(1) // null_default + }, // quant + shortcut2_args, // acc + bias + shortcut1 + shortcut2 + {} // multiply + }; + } else { + quant_args = shortcut2_args; + } + + typename FinalEVT::Arguments final_args; + + if constexpr (WSiLU) { + final_args = { + quant_args, // previous + {} // wsilu + }; + } else { + final_args = quant_args; + } + + args.epilogue.thread = final_args; + + args.scheduler.max_swizzle_size = 1; + args.scheduler.raster_order = + cutlass::gemm::kernel::detail::PersistentTileSchedulerSm90Params::RasterOrderOptions::Heuristic; + + Gemm gemm_op; + cutlass::Status status = gemm_op.can_implement(args); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM cannot implement: " << cutlass::cutlassGetStatusString(status) << std::endl; + return at::Tensor(); + } + + auto stream = at::cuda::getCurrentCUDAStream(); + status = gemm_op(args, nullptr, stream, /* cuda_adapter */ nullptr, /* launch_with_pdl */ true); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM failed: " << cutlass::cutlassGetStatusString(status) << std::endl; + return at::Tensor(); + } + + return out_buf; +} +#endif + +template +at::Tensor conv1x1_bias_generic_cutlass(at::Tensor& out_buf, const at::Tensor& feature, + const at::Tensor& weight, + const at::optional& bias = at::nullopt, + const at::optional& shortcut1 = at::nullopt, + const at::optional& shortcut2 = at::nullopt, + const at::optional& quant = at::nullopt, + const at::optional& weight0 = at::nullopt, + const at::optional& weight1 = at::nullopt, + const at::optional& weight2 = at::nullopt, + const at::optional& weight3 = at::nullopt, + const at::optional& bias0 = at::nullopt, + const at::optional& bias1 = at::nullopt, + const at::optional& bias2 = at::nullopt, + const at::optional& bias3 = at::nullopt) +{ + if constexpr (std::is_same_v) { +#if CURRENT_DEVICE_SM == 90 + if constexpr (ChunkAdd) { + return conv1x1_bias_wsilu_chunk_add_generic_cutlass3( + out_buf, feature, weight0.value(), weight1.value(), weight2.value(), + weight3.value(), bias0.value(), bias1.value(), bias2.value(), bias3.value()); + } else { + return conv1x1_bias_generic_cutlass3( + out_buf, feature, weight, bias, shortcut1, shortcut2, quant); + } +#else + return at::Tensor(); +#endif + } else if constexpr (std::is_same_v) { +#if CURRENT_DEVICE_SM == 100 + if constexpr (ChunkAdd) { + return at::Tensor(); + } else { + return conv1x1_bias_generic_cutlass3( + out_buf, feature, weight, bias, shortcut1, shortcut2, quant); + } +#else + return at::Tensor(); +#endif + } else { + return conv1x1_bias_generic_cutlass2( + out_buf, feature, weight, bias, shortcut1, shortcut2, quant); + } +} diff --git a/src/layers/extensions/inference/cutlass/conv_bias.cu b/src/layers/extensions/inference/cutlass/conv_bias.cu new file mode 100644 index 0000000..c784cde --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv_bias.cu @@ -0,0 +1,151 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "conv_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_CONV_BIAS_NAME = "HINT_MAP_CONV_BIAS"; +std::unordered_map HINT_MAP_CONV_BIAS = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 14, 8, 128, 128, 1, 0), 19 }, { conv_key(80, 14, 8, 128, 256, 1, 0), 8 }, + { conv_key(80, 26, 16, 128, 128, 1, 0), 8 }, { conv_key(80, 26, 16, 128, 256, 1, 0), 8 }, + { conv_key(80, 28, 16, 128, 128, 1, 0), 8 }, { conv_key(80, 28, 16, 256, 256, 1, 0), 8 }, + { conv_key(80, 40, 24, 128, 128, 1, 0), 8 }, { conv_key(80, 40, 24, 128, 256, 1, 0), 8 }, + { conv_key(80, 52, 30, 128, 256, 1, 1), 8 }, { conv_key(80, 52, 30, 256, 256, 1, 0), 8 }, + { conv_key(80, 52, 30, 256, 384, 1, 1), 8 }, { conv_key(80, 52, 30, 256, 512, 1, 1), 8 }, + { conv_key(80, 52, 30, 512, 512, 1, 0), 8 }, { conv_key(80, 52, 32, 128, 128, 1, 0), 19 }, + { conv_key(80, 52, 32, 256, 256, 1, 0), 8 }, { conv_key(80, 60, 34, 128, 128, 1, 0), 8 }, + { conv_key(80, 60, 34, 128, 256, 1, 0), 8 }, { conv_key(80, 80, 45, 2048, 256, 0, 1), 14 }, + { conv_key(80, 80, 48, 128, 128, 1, 0), 8 }, { conv_key(80, 80, 48, 256, 256, 1, 0), 8 }, + { conv_key(80, 104, 60, 128, 256, 1, 1), 8 }, { conv_key(80, 104, 60, 256, 256, 1, 0), 8 }, + { conv_key(80, 104, 60, 256, 384, 1, 1), 8 }, { conv_key(80, 104, 60, 256, 512, 1, 1), 8 }, + { conv_key(80, 104, 60, 512, 512, 1, 0), 29 }, { conv_key(80, 120, 68, 128, 128, 1, 0), 8 }, + { conv_key(80, 120, 68, 128, 256, 1, 0), 8 }, { conv_key(80, 120, 68, 256, 256, 1, 0), 29 }, + { conv_key(80, 120, 68, 2048, 256, 0, 1), 9 }, { conv_key(80, 160, 90, 128, 256, 1, 1), 29 }, + { conv_key(80, 160, 90, 256, 256, 1, 0), 14 }, { conv_key(80, 160, 90, 256, 384, 1, 1), 24 }, + { conv_key(80, 160, 90, 256, 512, 1, 1), 24 }, { conv_key(80, 160, 90, 512, 512, 1, 0), 29 }, + { conv_key(80, 240, 135, 2048, 256, 0, 1), 9 }, { conv_key(80, 240, 136, 128, 128, 1, 0), 15 }, + { conv_key(80, 240, 136, 128, 256, 1, 1), 27 }, { conv_key(80, 240, 136, 256, 256, 1, 0), 10 }, + { conv_key(80, 240, 136, 256, 384, 1, 1), 10 }, { conv_key(80, 240, 136, 256, 512, 1, 1), 29 }, + { conv_key(80, 240, 136, 512, 512, 1, 0), 24 }, { conv_key(80, 480, 270, 128, 256, 1, 1), 24 }, + { conv_key(80, 480, 270, 256, 256, 1, 0), 24 }, { conv_key(80, 480, 270, 256, 384, 1, 1), 24 }, + { conv_key(80, 480, 270, 256, 512, 1, 1), 24 }, { conv_key(80, 480, 270, 512, 512, 1, 0), 20 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 14, 8, 128, 128, 1, 0), 8 }, { conv_key(89, 14, 8, 128, 256, 1, 0), 8 }, + { conv_key(89, 26, 16, 128, 128, 1, 0), 8 }, { conv_key(89, 26, 16, 128, 256, 1, 0), 8 }, + { conv_key(89, 28, 16, 128, 128, 1, 0), 8 }, { conv_key(89, 28, 16, 256, 256, 1, 0), 8 }, + { conv_key(89, 40, 24, 128, 128, 1, 0), 8 }, { conv_key(89, 40, 24, 128, 256, 1, 0), 8 }, + { conv_key(89, 52, 30, 128, 256, 1, 1), 8 }, { conv_key(89, 52, 30, 256, 256, 1, 0), 8 }, + { conv_key(89, 52, 30, 256, 384, 1, 1), 8 }, { conv_key(89, 52, 30, 256, 512, 1, 1), 8 }, + { conv_key(89, 52, 30, 512, 512, 1, 0), 8 }, { conv_key(89, 52, 32, 128, 128, 1, 0), 8 }, + { conv_key(89, 52, 32, 256, 256, 1, 0), 8 }, { conv_key(89, 60, 34, 128, 128, 1, 0), 8 }, + { conv_key(89, 60, 34, 128, 256, 1, 0), 8 }, { conv_key(89, 80, 45, 2048, 256, 0, 1), 0 }, + { conv_key(89, 80, 48, 128, 128, 1, 0), 8 }, { conv_key(89, 80, 48, 256, 256, 1, 0), 8 }, + { conv_key(89, 104, 60, 128, 256, 1, 1), 8 }, { conv_key(89, 104, 60, 256, 256, 1, 0), 8 }, + { conv_key(89, 104, 60, 256, 384, 1, 1), 8 }, { conv_key(89, 104, 60, 256, 512, 1, 1), 8 }, + { conv_key(89, 104, 60, 512, 512, 1, 0), 28 }, { conv_key(89, 120, 68, 128, 128, 1, 0), 8 }, + { conv_key(89, 120, 68, 128, 256, 1, 0), 8 }, { conv_key(89, 120, 68, 256, 256, 1, 0), 18 }, + { conv_key(89, 120, 68, 2048, 256, 0, 1), 14 }, { conv_key(89, 160, 90, 128, 256, 1, 1), 8 }, + { conv_key(89, 160, 90, 256, 256, 1, 0), 28 }, { conv_key(89, 160, 90, 256, 384, 1, 1), 29 }, + { conv_key(89, 160, 90, 256, 512, 1, 1), 18 }, { conv_key(89, 160, 90, 512, 512, 1, 0), 14 }, + { conv_key(89, 240, 135, 2048, 256, 0, 1), 10 }, { conv_key(89, 240, 136, 128, 128, 1, 0), 28 }, + { conv_key(89, 240, 136, 128, 256, 1, 1), 18 }, { conv_key(89, 240, 136, 256, 256, 1, 0), 27 }, + { conv_key(89, 240, 136, 256, 384, 1, 1), 27 }, { conv_key(89, 240, 136, 256, 512, 1, 1), 14 }, + { conv_key(89, 240, 136, 512, 512, 1, 0), 10 }, { conv_key(89, 480, 270, 128, 256, 1, 1), 9 }, + { conv_key(89, 480, 270, 256, 256, 1, 0), 14 }, { conv_key(89, 480, 270, 256, 384, 1, 1), 10 }, + { conv_key(89, 480, 270, 256, 512, 1, 1), 9 }, { conv_key(89, 480, 270, 512, 512, 1, 0), 9 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 14, 8, 128, 128, 1, 0), 8 }, { conv_key(90, 14, 8, 128, 256, 1, 0), 8 }, + { conv_key(90, 26, 16, 128, 128, 1, 0), 8 }, { conv_key(90, 26, 16, 128, 256, 1, 0), 8 }, + { conv_key(90, 28, 16, 128, 128, 1, 0), 8 }, { conv_key(90, 28, 16, 256, 256, 1, 0), 8 }, + { conv_key(90, 40, 24, 128, 128, 1, 0), 8 }, { conv_key(90, 40, 24, 128, 256, 1, 0), 8 }, + { conv_key(90, 52, 30, 128, 256, 1, 1), 8 }, { conv_key(90, 52, 30, 256, 256, 1, 0), 8 }, + { conv_key(90, 52, 30, 256, 384, 1, 1), 8 }, { conv_key(90, 52, 30, 256, 512, 1, 1), 8 }, + { conv_key(90, 52, 30, 512, 512, 1, 0), 8 }, { conv_key(90, 52, 32, 128, 128, 1, 0), 8 }, + { conv_key(90, 52, 32, 256, 256, 1, 0), 8 }, { conv_key(90, 60, 34, 128, 128, 1, 0), 8 }, + { conv_key(90, 60, 34, 128, 256, 1, 0), 8 }, { conv_key(90, 80, 45, 2048, 256, 0, 1), 9 }, + { conv_key(90, 80, 48, 128, 128, 1, 0), 8 }, { conv_key(90, 80, 48, 256, 256, 1, 0), 8 }, + { conv_key(90, 104, 60, 128, 256, 1, 1), 8 }, { conv_key(90, 104, 60, 256, 256, 1, 0), 8 }, + { conv_key(90, 104, 60, 256, 384, 1, 1), 8 }, { conv_key(90, 104, 60, 256, 512, 1, 1), 8 }, + { conv_key(90, 104, 60, 512, 512, 1, 0), 29 }, { conv_key(90, 120, 68, 128, 128, 1, 0), 8 }, + { conv_key(90, 120, 68, 128, 256, 1, 0), 8 }, { conv_key(90, 120, 68, 256, 256, 1, 0), 8 }, + { conv_key(90, 120, 68, 2048, 256, 0, 1), 21 }, { conv_key(90, 160, 90, 128, 256, 1, 1), 8 }, + { conv_key(90, 160, 90, 256, 256, 1, 0), 29 }, { conv_key(90, 160, 90, 256, 384, 1, 1), 29 }, + { conv_key(90, 160, 90, 256, 512, 1, 1), 29 }, { conv_key(90, 160, 90, 512, 512, 1, 0), 27 }, + { conv_key(90, 240, 135, 2048, 256, 0, 1), 21 }, { conv_key(90, 240, 136, 128, 128, 1, 0), 29 }, + { conv_key(90, 240, 136, 128, 256, 1, 1), 29 }, { conv_key(90, 240, 136, 256, 256, 1, 0), 27 }, + { conv_key(90, 240, 136, 256, 384, 1, 1), 24 }, { conv_key(90, 240, 136, 256, 512, 1, 1), 24 }, + { conv_key(90, 240, 136, 512, 512, 1, 0), 21 }, { conv_key(90, 480, 270, 128, 256, 1, 1), 27 }, + { conv_key(90, 480, 270, 256, 256, 1, 0), 21 }, { conv_key(90, 480, 270, 256, 384, 1, 1), 21 }, + { conv_key(90, 480, 270, 256, 512, 1, 1), 21 }, { conv_key(90, 480, 270, 512, 512, 1, 0), 20 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 14, 8, 128, 128, 1, 0), 8 }, + { conv_key(100, 14, 8, 128, 256, 1, 0), 8 }, + { conv_key(100, 26, 16, 128, 128, 1, 0), 8 }, + { conv_key(100, 26, 16, 128, 256, 1, 0), 8 }, + { conv_key(100, 28, 16, 128, 128, 1, 0), 8 }, + { conv_key(100, 28, 16, 256, 256, 1, 0), 8 }, + { conv_key(100, 40, 24, 128, 128, 1, 0), 8 }, + { conv_key(100, 40, 24, 128, 256, 1, 0), 8 }, + { conv_key(100, 52, 30, 128, 256, 1, 1), 8 }, + { conv_key(100, 52, 30, 256, 256, 1, 0), 8 }, + { conv_key(100, 52, 30, 256, 384, 1, 1), 8 }, + { conv_key(100, 52, 30, 256, 512, 1, 1), 8 }, + { conv_key(100, 52, 30, 512, 512, 1, 0), 8 }, + { conv_key(100, 52, 32, 128, 128, 1, 0), 19 }, + { conv_key(100, 52, 32, 256, 256, 1, 0), 8 }, + { conv_key(100, 60, 34, 128, 128, 1, 0), 8 }, + { conv_key(100, 60, 34, 128, 256, 1, 0), 8 }, + { conv_key(100, 80, 45, 2048, 256, 0, 1), 29 }, + { conv_key(100, 80, 48, 128, 128, 1, 0), 8 }, + { conv_key(100, 80, 48, 256, 256, 1, 0), 8 }, + { conv_key(100, 104, 60, 128, 256, 1, 1), 8 }, + { conv_key(100, 104, 60, 256, 256, 1, 0), 8 }, + { conv_key(100, 104, 60, 256, 384, 1, 1), 8 }, + { conv_key(100, 104, 60, 256, 512, 1, 1), 8 }, + { conv_key(100, 104, 60, 512, 512, 1, 0), 29 }, + { conv_key(100, 120, 68, 128, 128, 1, 0), 19 }, + { conv_key(100, 120, 68, 128, 256, 1, 0), 8 }, + { conv_key(100, 120, 68, 256, 256, 1, 0), 8 }, + { conv_key(100, 120, 68, 2048, 256, 0, 1), 27 }, + { conv_key(100, 160, 90, 128, 256, 1, 1), 8 }, + { conv_key(100, 160, 90, 256, 256, 1, 0), 29 }, + { conv_key(100, 160, 90, 256, 384, 1, 1), 29 }, + { conv_key(100, 160, 90, 256, 512, 1, 1), 29 }, + { conv_key(100, 160, 90, 512, 512, 1, 0), 27 }, + { conv_key(100, 240, 135, 2048, 256, 0, 1), 14 }, + { conv_key(100, 240, 136, 128, 128, 1, 0), 29 }, + { conv_key(100, 240, 136, 128, 256, 1, 1), 29 }, + { conv_key(100, 240, 136, 256, 256, 1, 0), 27 }, + { conv_key(100, 240, 136, 256, 384, 1, 1), 27 }, + { conv_key(100, 240, 136, 256, 512, 1, 1), 27 }, + { conv_key(100, 240, 136, 512, 512, 1, 0), 21 }, + { conv_key(100, 480, 270, 128, 256, 1, 1), 9 }, + { conv_key(100, 480, 270, 256, 256, 1, 0), 27 }, + { conv_key(100, 480, 270, 256, 384, 1, 1), 29 }, + { conv_key(100, 480, 270, 256, 512, 1, 1), 29 }, + { conv_key(100, 480, 270, 512, 512, 1, 0), 27 }, +#endif +}; + +at::Tensor conv_bias(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const int stride, at::Tensor& out_buf) +{ + const int kernel = weight.size(2); + if (sm < 75) { + auto out = at::conv2d(feature, weight, at::nullopt, stride, (kernel - 1) / 2); + return out + bias.reshape({ 1, -1, 1, 1 }); + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return conv_bias_generic_cutlass(out_buf, feature, weight, bias, stride); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + assert(kernel >= 2 && kernel <= 3 && stride >= 1 && stride <= 2); + return launch_cutlass_helper(sm, launch_cutlass, HINT_MAP_CONV_BIAS, + HINT_MAP_CONV_BIAS_NAME, C2, C1, H, + W, kernel - 2, stride - 1); +} diff --git a/src/layers/extensions/inference/cutlass/conv_kernel.h b/src/layers/extensions/inference/cutlass/conv_kernel.h new file mode 100644 index 0000000..fb10394 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/conv_kernel.h @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +#include +#include +#include +#include +// clang-format on + +#include "cutlass_epilogue.h" +#include "cutlass_kernel.h" +#include "../common_cu.h" +#include "../cutlass_helper_implicit_gemm.h" +#include "../def_cutlass.h" + +template +at::Tensor conv_bias_generic_cutlass(at::Tensor& out_buf, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& bias, const int stride) +{ + using EpilogueOp = + LinearCombination<0, false, false, false, cutlass::half_t, cutlass::half_t, cutlass::half_t, + 128 / cutlass::sizeof_bits_v>; + + using Conv2dFpropKernel = typename CustomDefaultConv2dFpropWithBroadcast< + cutlass::half_t, cutlass::layout::TensorNHWC, cutlass::half_t, cutlass::layout::TensorNHWC, + cutlass::half_t, cutlass::layout::TensorNHWC, cutlass::half_t, cutlass::arch::OpClassTensorOp, + typename Sm::SmArch, typename Sm::ShapeThreadBlock, typename Sm::ShapeWarp, typename Sm::ShapeOp, + EpilogueOp, cutlass::gemm::threadblock::GemmIdentityThreadblockSwizzle<8>, Sm::Stages, + cutlass::arch::OpMultiplyAdd, cutlass::conv::IteratorAlgorithm::kOptimized>::Kernel; + + using ImplicitGemm = CustomImplicitGemmConvolution; + + const int B = feature.size(0); + const int Cin = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int Cout = weight.size(0); + const int Cin_ = weight.size(1); + const int kernel = weight.size(2); + const int kernel_ = weight.size(3); + assert(Cin == Cin_ && kernel == kernel_); + const int pad = (kernel - 1) / 2; + + cutlass::conv::Conv2dProblemSize problem_size({ B, H, W, Cin }, // input + { Cout, kernel, kernel, Cin }, // kernel + { pad, pad, pad, pad }, // pad + { stride, stride }, // stride + { 1, 1 }, // dilation + { B, H / stride, W / stride, Cout }, // out + cutlass::conv::Mode::kCrossCorrelation, + 1 // split_k_slices + ); + + cutlass::TensorRef d_feature( + static_cast(feature.data_ptr()), + cutlass::make_Coord(feature.stride(3), feature.stride(2), feature.stride(0))); + cutlass::TensorRef d_weight( + static_cast(weight.data_ptr()), + cutlass::make_Coord(weight.stride(3), weight.stride(2), weight.stride(0))); + cutlass::TensorRef d_out( + static_cast(out_buf.data_ptr()), + cutlass::make_Coord(out_buf.stride(3), out_buf.stride(2), out_buf.stride(0))); + + typename ImplicitGemm::Arguments args(problem_size, d_feature, d_weight, d_out, d_out, {}, + cutlass::conv::SplitKMode::kSerial, bias.data_ptr(), + nullptr, 0, 0); + + ImplicitGemm implicit_gemm_op; + cutlass::Status status = implicit_gemm_op.can_implement(args); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to configure convolution operation." << std::endl; + return at::Tensor(); + } + + auto stream = at::cuda::getCurrentCUDAStream(); + status = implicit_gemm_op(args, nullptr, stream); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to run convolution operation." << std::endl; + return at::Tensor(); + } + + return out_buf; +} diff --git a/src/layers/extensions/inference/cutlass/cutlass_epilogue.h b/src/layers/extensions/inference/cutlass/cutlass_epilogue.h new file mode 100644 index 0000000..d24ef8e --- /dev/null +++ b/src/layers/extensions/inference/cutlass/cutlass_epilogue.h @@ -0,0 +1,234 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include +#include +#include + +#include "../common_cu.h" +#include "../def_cutlass.h" + +template +__forceinline__ __device__ cutlass::Array +chunk_add(const cutlass::Array& intermediate) +{ + cutlass::Array y; + cutlass::Array z; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N / 4; ++i) { + y[i] = static_cast(intermediate[i * 4 + 0] + intermediate[i * 4 + 1] + + intermediate[i * 4 + 2] + intermediate[i * 4 + 3]); + } + + memcpy(z.data(), y.data(), sizeof(y)); + + return z; +} + +// 0 or 1 additional input. If WithQuant, the addtional input is quant, otherwise, it is shortcut. +template +class LinearCombination { +public: + static bool const kIsSingleSource = true; + + using ElementOutput = ElementC_; + using ElementC = ElementC_; + using ElementAccumulator = ElementAccumulator_; + using ElementCompute = ElementCompute_; + using ElementVector = ElementC_; + static int const kElementsPerAccess = ElementsPerAccess; + static int const kCount = kElementsPerAccess; + + using FragmentAccumulator = cutlass::Array; + using FragmentCompute = cutlass::Array; + using FragmentC = cutlass::Array; + using FragmentOutput = cutlass::Array; + + using ElementZ = ElementC_; + using ElementT = cutlass::int4b_t; + using FragmentZ = cutlass::Array; + using FragmentT = cutlass::Array; + + static bool const kIsHeavy = WSiLU; + static bool const kStoreZ = !ChunkAdd; + static bool const kStoreT = ChunkAdd; + + /// Host-constructable parameters structure + struct Params { + + CUTLASS_HOST_DEVICE + Params() {} + }; + +public: + /// Constructor from Params + CUTLASS_HOST_DEVICE + LinearCombination(Params const&) {} + + /// The "source" tensor corresponds to the residual input + CUTLASS_HOST_DEVICE + bool is_source_needed() const { return NumAdditonalInputs > 0; } + + CUTLASS_HOST_DEVICE + void operator()(FragmentZ& frag_Z, FragmentT& frag_T, FragmentAccumulator const& AB, + FragmentC const& residual, FragmentCompute const& bias) const + { + FragmentCompute tmp_Accum = + cutlass::NumericArrayConverter()(AB); + FragmentCompute tmp_residual = + cutlass::NumericArrayConverter()(residual); + + cutlass::plus plus_op; + FragmentCompute intermediate = plus_op(tmp_Accum, bias); + + if constexpr (WSiLU) { + WSiLUOp wsilu_op; + intermediate = wsilu_op(intermediate); + } + + if constexpr (WithQuant) { + cutlass::multiplies multiply_op; + intermediate = multiply_op(intermediate, tmp_residual); + } else { + intermediate = plus_op(intermediate, tmp_residual); + } + + if constexpr (ChunkAdd) { + frag_T = chunk_add(intermediate); + } else { + cutlass::NumericArrayConverter convert_z; + frag_Z = convert_z(intermediate); + } + } + + CUTLASS_HOST_DEVICE + void operator()(FragmentZ& frag_Z, FragmentT& frag_T, FragmentAccumulator const& AB, + FragmentCompute const& bias) const + { + FragmentCompute tmp_Accum = + cutlass::NumericArrayConverter()(AB); + + cutlass::plus plus_op; + FragmentCompute intermediate = plus_op(tmp_Accum, bias); + + if constexpr (WSiLU) { + WSiLUOp wsilu_op; + intermediate = wsilu_op(intermediate); + } + + if constexpr (ChunkAdd) { + frag_T = chunk_add(intermediate); + } else { + cutlass::NumericArrayConverter convert_z; + frag_Z = convert_z(intermediate); + } + } + + /// Functionally required for serial reduction in the epilogue + /// IMPORTANT: Split-k is supported only when ActivationOp is Identity. + CUTLASS_HOST_DEVICE + void set_k_partition(int, int) {} +}; + +// 2 additional inputs. +// If WithQuant, the second addtional input is quant, otherwise, it is shortcut. +// The first additonal input is always shortcut. +template +class LinearCombination<2, WSiLU, WithQuant, ChunkAdd, ElementC_, ElementAccumulator_, + ElementCompute_, ElementsPerAccess> { +public: + static bool const kIsSingleSource = false; + + using ElementOutput = ElementC_; + using ElementC = ElementC_; + using ElementAccumulator = ElementAccumulator_; + using ElementCompute = ElementCompute_; + using ElementVector = ElementC_; + static int const kElementsPerAccess = ElementsPerAccess; + static int const kCount = kElementsPerAccess; + + using FragmentAccumulator = cutlass::Array; + using FragmentCompute = cutlass::Array; + using FragmentC = cutlass::Array; + using FragmentOutput = cutlass::Array; + + using ElementZ = ElementC_; + using ElementT = cutlass::int4b_t; + using FragmentZ = cutlass::Array; + using FragmentT = cutlass::Array; + + static bool const kIsHeavy = WSiLU; + static bool const kStoreZ = !ChunkAdd; + static bool const kStoreT = ChunkAdd; + + /// Host-constructable parameters structure + struct Params { + + CUTLASS_HOST_DEVICE + Params() {} + }; + +public: + /// Constructor from Params + CUTLASS_HOST_DEVICE + LinearCombination(Params const&) {} + + /// The "source" tensor corresponds to the residual input + CUTLASS_HOST_DEVICE + bool is_source_needed() const { return true; } + + CUTLASS_HOST_DEVICE + void operator()(FragmentZ& frag_Z, FragmentT& frag_T, FragmentAccumulator const& AB, + FragmentC const& residual1, FragmentC const& residual2, + FragmentCompute const& bias) const + { + FragmentCompute tmp_Accum = + cutlass::NumericArrayConverter()(AB); + FragmentCompute tmp_residual1 = + cutlass::NumericArrayConverter()(residual1); + FragmentCompute tmp_residual2 = + cutlass::NumericArrayConverter()(residual2); + + cutlass::plus plus_op; + FragmentCompute intermediate = plus_op(tmp_Accum, bias); + + if constexpr (WSiLU) { + WSiLUOp wsilu_op; + intermediate = wsilu_op(intermediate); + } + + intermediate = plus_op(intermediate, tmp_residual1); + + if constexpr (WithQuant) { + cutlass::multiplies multiply_op; + intermediate = multiply_op(intermediate, tmp_residual2); + } else { + intermediate = plus_op(intermediate, tmp_residual2); + } + + if constexpr (ChunkAdd) { + frag_T = chunk_add(intermediate); + } else { + cutlass::NumericArrayConverter convert_z; + frag_Z = convert_z(intermediate); + } + } + + /// Should never be called + CUTLASS_HOST_DEVICE + void operator()(FragmentZ&, FragmentT&, FragmentAccumulator const&, FragmentCompute const&) const + { + } + + /// Functionally required for serial reduction in the epilogue + /// IMPORTANT: Split-k is supported only when ActivationOp is Identity. + CUTLASS_HOST_DEVICE + void set_k_partition(int, int) {} +}; diff --git a/src/layers/extensions/inference/cutlass/cutlass_helper_d3x3.h b/src/layers/extensions/inference/cutlass/cutlass_helper_d3x3.h new file mode 100644 index 0000000..f49e794 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/cutlass_helper_d3x3.h @@ -0,0 +1,264 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +#include +// clang-format on + +/** + * These 3 classes/structs are rewritten: + * 1. cutlass::conv::kernel::DirectConvolution -> CustomDirectConvolutionKernel + * 2. cutlass::conv::kernel::DefaultDepthwiseDirect2dConvFprop -> CustomDefaultDepthwiseDirect2dConvFprop + * 3. cutlass::conv::device::DirectConvolution -> CustomDirectConvolutionDevice + */ + +/// Original file: cutlass/conv/kernel/direct_convolution.h +/// to add PDL sync points +template +struct CustomDirectConvolutionKernel { + using Base = + cutlass::conv::kernel::DirectConvolution; + using ElementA = typename Base::ElementA; + using LayoutA = typename Base::LayoutA; + using ElementB = typename Base::ElementB; + using LayoutB = typename Base::LayoutB; + using ElementC = typename Base::ElementC; + using LayoutC = typename Base::LayoutC; + using ElementAccumulator = typename Base::ElementAccumulator; + using ElementCompute = typename Base::ElementCompute; + using OperatorClass = typename Base::OperatorClass; + using ArchTag = typename Base::ArchTag; + using ThreadblockShape = typename Base::ThreadblockShape; + using WarpShape = typename Base::WarpShape; + using InstructionShape = typename Base::InstructionShape; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + using EpilogueOutputOp = typename Base::EpilogueOutputOp; + static int const kStages = Base::kStages; + static int const kConvDim = Base::kConvDim; + using WarpMmaOperator = typename Base::WarpMmaOperator; + using ArchMmaOperator = typename Base::ArchMmaOperator; + using MathOperator = typename Base::MathOperator; + + static cutlass::conv::Operator const kConvolutionalOperator = Base::kConvolutionalOperator; + static cutlass::conv::IteratorAlgorithm const kIteratorAlgorithm = Base::kIteratorAlgorithm; + static cutlass::conv::StrideSupport const kStrideSupport = Base::kStrideSupport; + static cutlass::conv::GroupMode const kGroupMode = Base::kGroupMode; + + using Arguments = typename Base::Arguments; + using ReorderKernel = typename Base::ReorderKernel; + using Mma = typename Base::Mma; + using Epilogue = typename Base::Epilogue; + using Params = typename Base::Params; + using SharedStorage = typename Base::SharedStorage; + + using TensorRefC = cutlass::TensorRef; + using ConvProblemSize = ConvProblemSize_; + using ConvOutputIteratorParameter = cutlass::epilogue::threadblock::ConvOutputIteratorParameter< + LayoutC, typename Epilogue::OutputTileIterator::Layout, TensorRefC, ConvOperator, ConvProblemSize>; + + /// Executes one ImplicitGEMM + /// The aim is to add PDL sync point to this function. + CUTLASS_DEVICE + void operator()(Params const& params, SharedStorage& shared_storage) + { + // Compute threadblock location + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord threadblock_tile_idx = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // Early exit if threadblock is out of range + if (params.grid_tiled_shape.m() <= threadblock_tile_idx.m() + || params.grid_tiled_shape.n() <= threadblock_tile_idx.n()) { + cudaGDC(); + return; + } + + // Compute position within threadblock + int thread_idx = threadIdx.x; + int iterator_column_offset = 0; + int filter_row_offset = 0; + if (kGroupMode != cutlass::conv::GroupMode::kNone) { + if (kGroupMode == cutlass::conv::GroupMode::kDepthwise) { + iterator_column_offset += threadblock_tile_idx.n() * Mma::Shape::kN; + } + } + + // Construct iterators to A and B operands + typename Mma::IteratorA iterator_A( + params.iterator_A, params.problem_size, params.ptr_A, thread_idx, + cutlass::MatrixCoord(threadblock_tile_idx.m() + threadblock_tile_idx.k(), + iterator_column_offset)); + + typename Mma::IteratorB iterator_B( + params.iterator_B, params.problem_size, params.ptr_reordered_B, thread_idx, + cutlass::MatrixCoord(filter_row_offset, iterator_column_offset)); + + // Broadcast the warp_id computed by lane 0 to ensure dependent code + // is compiled as warp-uniform. + int warp_idx = __shfl_sync(0xffffffff, threadIdx.x / 32, 0); + int lane_idx = threadIdx.x % 32; + + // + // Main loop + // + + // Construct thread-scoped matrix multiply + Mma mma(shared_storage.main_loop, thread_idx, warp_idx, lane_idx); + + typename Mma::FragmentC accumulators; + + accumulators.clear(); + + // + // Epilogue + // + + EpilogueOutputOp output_op(params.output_op); + + // Compute logical position within grid + threadblock_tile_idx = threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + cutlass::MatrixCoord threadblock_offset(threadblock_tile_idx.m() + threadblock_tile_idx.k(), + threadblock_tile_idx.n() * Mma::Shape::kN); + + // Tile iterator writing to destination tensor + typename Epilogue::OutputTileIterator iterator_D( + params.iterator_D, params.ptr_D, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, threadblock_offset); + + // Tile iterator reading from source accumulator tensor + typename Epilogue::OutputTileIterator iterator_C( + params.iterator_C, params.ptr_C, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, threadblock_offset); + + // Construct the epilogue + Epilogue epilogue(shared_storage.epilogue, thread_idx, warp_idx, lane_idx); + + // Compute threadblock-scoped matrix multiply-add + // Epilogue is fused in the mainloop + cudaGDC(); + mma(params.gemm_k_iterations, accumulators, iterator_A, params.iterator_A, iterator_B, + params.iterator_B, accumulators, epilogue, output_op, iterator_D, iterator_C, + params.split_k_slices); + } +}; + +/// Original file: cutlass/conv/kernel/default_depthwise_fprop.h +/// to invoke CustomDirectConvolutionKernel +template , + int AlignmentB = 128 / cutlass::sizeof_bits_v> +struct CustomDefaultDepthwiseDirect2dConvFprop { + using Base = cutlass::conv::kernel::DefaultDepthwiseDirect2dConvFprop< + ElementA, LayoutA, ElementB, LayoutB, ElementC, LayoutC, ElementAccumulator, OperatorClass, + ArchTag, ThreadblockShape, ThreadBlockOutputShape, FilterShape, WarpShape, InstructionShape, + EpilogueOutputOp, ThreadblockSwizzle, Stages, MathOperatorTag, IteratorAlgorithm, + StrideSupport, StrideShape, DilationShape, AlignmentA, AlignmentB>; + using Kernel = + CustomDirectConvolutionKernel; +}; + +/// Original file: cutlass/conv/device/direct_convolution.h +/// to remove the launch of the ReorderKernel +/// to add "cudaLaunchKernelEx" to run() +template +class CustomDirectConvolutionDevice { +public: + using Base = cutlass::conv::device::DirectConvolution; + using UnderlyingKernel = typename Base::UnderlyingKernel; + using ThreadblockShape = typename Base::ThreadblockShape; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + using Arguments = typename Base::Arguments; + + static cutlass::conv::Operator const kConvolutionalOperator = Base::kConvolutionalOperator; + static cutlass::conv::GroupMode const kGroupMode = Base::kGroupMode; + static int const kWarpCount = Base::kWarpCount; + +private: + typename UnderlyingKernel::Params params_; + +public: + static cutlass::Status can_implement(Arguments const& args) + { + return Base::can_implement(args); + } + + cutlass::Status initialize(Arguments const& args, void* workspace = nullptr, + cudaStream_t stream = nullptr) + { + params_ = typename UnderlyingKernel::Params(args, static_cast(workspace)); + int smem_size = int(sizeof(typename UnderlyingKernel::SharedStorage)); + if (smem_size >= (48 << 10)) { + cudaError_t result = + cudaFuncSetAttribute(cutlass::Kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, smem_size); + if (result != cudaSuccess) { + return cutlass::Status::kErrorInternal; + } + } + return cutlass::Status::kSuccess; + } + + cutlass::Status operator()(Arguments const& args, void* workspace = nullptr, + cudaStream_t stream = nullptr) + { + cutlass::Status status = initialize(args, workspace, stream); + if (status == cutlass::Status::kSuccess) { + status = run(stream); + } + return status; + } + + // Only this function is modified. To remove the launch of ReorderKernel. + cutlass::Status run(cudaStream_t stream = nullptr) + { + // Launch main kernel + ThreadblockSwizzle threadblock_swizzle; + + dim3 grid = threadblock_swizzle.get_grid_shape(params_.grid_tiled_shape); + dim3 block(32 * kWarpCount, 1, 1); + + // Dynamic SMEM size based on input params. + int smem_size = int(params_.get_smem_size()); + + // Make sure we can use that much shared memory. + cudaError_t status = + cudaFuncSetAttribute(cutlass::Kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, smem_size); + if (status != cudaSuccess) { + return cutlass::Status::kErrorInternal; + } + + cutlass::arch::synclog_setup(); + + cudaLaunchConfig_t config; + config.gridDim = grid; + config.blockDim = block; + config.dynamicSmemBytes = smem_size; + config.stream = stream; + auto attr = get_cuda_launch_attribute(); + config.attrs = &attr; + config.numAttrs = 1; + + cudaLaunchKernelEx(&config, &cutlass::Kernel, params_); + + cudaError_t result = cudaGetLastError(); + + return result == cudaSuccess ? cutlass::Status::kSuccess : cutlass::Status::kErrorInternal; + } +}; diff --git a/src/layers/extensions/inference/cutlass/cutlass_kernel.h b/src/layers/extensions/inference/cutlass/cutlass_kernel.h new file mode 100644 index 0000000..333b6e9 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/cutlass_kernel.h @@ -0,0 +1,249 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include + +#include "../common_cu.h" + +struct Sm75 { + using SmArch = cutlass::arch::Sm75; + using ShapeThreadBlock = cutlass::gemm::GemmShape<128, 128, 32>; + using ShapeWarp = cutlass::gemm::GemmShape<64, 64, 32>; + using ShapeOp = cutlass::gemm::GemmShape<16, 8, 8>; + static constexpr int Stages = 2; +}; + +template +__forceinline__ auto launch_cutlass_switcher(const int sm, Func func, const int hint) +{ + assert(sm >= 80); + if constexpr (!Cutlass2Only) { + switch (hint) { +#if CURRENT_DEVICE_SM == 90 + case 30: + return func(Hint30{}); + case 31: + return func(Hint31{}); + case 32: + return func(Hint32{}); + case 33: + return func(Hint33{}); + case 34: + return func(Hint34{}); + case 35: + return func(Hint35{}); + case 36: + return func(Hint36{}); + case 37: + return func(Hint37{}); +#elif CURRENT_DEVICE_SM == 100 + case 38: + return func(Hint38{}); + case 39: + return func(Hint39{}); + case 40: + return func(Hint40{}); + case 41: + return func(Hint41{}); + case 42: + return func(Hint42{}); + case 43: + return func(Hint43{}); + case 44: + return func(Hint44{}); + case 45: + return func(Hint45{}); + case 46: + return func(Hint46{}); + case 47: + return func(Hint47{}); + case 48: + return func(Hint48{}); + case 49: + return func(Hint49{}); + case 50: + return func(Hint50{}); + case 51: + return func(Hint51{}); + case 52: + return func(Hint52{}); + case 53: + return func(Hint53{}); + case 54: + return func(Hint54{}); + case 55: + return func(Hint55{}); + case 56: + return func(Hint56{}); + case 57: + return func(Hint57{}); + case 58: + return func(Hint58{}); + case 59: + return func(Hint59{}); + case 60: + return func(Hint60{}); + case 61: + return func(Hint61{}); + case 62: + return func(Hint62{}); + case 63: + return func(Hint63{}); + case 64: + return func(Hint64{}); + case 65: + return func(Hint65{}); + case 66: + return func(Hint66{}); + case 67: + return func(Hint67{}); + case 68: + return func(Hint68{}); + case 69: + return func(Hint69{}); + case 70: + return func(Hint70{}); + case 71: + return func(Hint71{}); + case 72: + return func(Hint72{}); + case 73: + return func(Hint73{}); + case 74: + return func(Hint74{}); + case 75: + return func(Hint75{}); + case 76: + return func(Hint76{}); + case 77: + return func(Hint77{}); + case 78: + return func(Hint78{}); + case 79: + return func(Hint79{}); + case 80: + return func(Hint80{}); + case 81: + return func(Hint81{}); + case 82: + return func(Hint82{}); + case 83: + return func(Hint83{}); + case 84: + return func(Hint84{}); + case 85: + return func(Hint85{}); + case 86: + return func(Hint86{}); + case 87: + return func(Hint87{}); + case 88: + return func(Hint88{}); + case 89: + return func(Hint89{}); + case 90: + return func(Hint90{}); + case 91: + return func(Hint91{}); + case 92: + return func(Hint92{}); + case 93: + return func(Hint93{}); + case 94: + return func(Hint94{}); + case 95: + return func(Hint95{}); +#endif + } + } + switch (hint) { +#if CURRENT_DEVICE_SM >= 80 + case 0: + return func(Hint0{}); + case 1: + return func(Hint1{}); + case 2: + return func(Hint2{}); + case 3: + return func(Hint3{}); + case 4: + return func(Hint4{}); + case 5: + return func(Hint5{}); + case 6: + return func(Hint6{}); + case 7: + return func(Hint7{}); + case 8: + return func(Hint8{}); + case 9: + return func(Hint9{}); + case 10: + return func(Hint10{}); + case 11: + return func(Hint11{}); + case 12: + return func(Hint12{}); + case 13: + return func(Hint13{}); + case 14: + return func(Hint14{}); + case 15: + return func(Hint15{}); + case 16: + return func(Hint16{}); + case 17: + return func(Hint17{}); + case 18: + return func(Hint18{}); + case 19: + return func(Hint19{}); + case 20: + return func(Hint20{}); + case 21: + return func(Hint21{}); + case 22: + return func(Hint22{}); + case 23: + return func(Hint23{}); + case 24: + return func(Hint24{}); + case 25: + return func(Hint25{}); + case 26: + return func(Hint26{}); + case 27: + return func(Hint27{}); + case 28: + return func(Hint28{}); + case 29: + return func(Hint29{}); +#endif + default: + using Type = decltype(func(Hint0{})); + static_assert(std::is_same_v); + return at::Tensor(); + } +} + +template +__forceinline__ auto +launch_cutlass_helper(const int sm, Func func, std::unordered_map& map, + const std::string& map_name, const int C2, const int C1, const int H, + const int W, const int kernel = 0, const int stride = 0) +{ + if (sm == 75) { + return func(Sm75{}); + } + const uint64_t key = conv_key(sm, W, H, C2, C1, stride, kernel); + int best_hint = -1; + auto it = map.find(key); + if (it == map.end()) { + return launch_cutlass_switcher(sm, func, 14); + } else { + best_hint = it->second; + } + return launch_cutlass_switcher(sm, func, best_hint); +} diff --git a/src/layers/extensions/inference/cutlass/d3x3.cu b/src/layers/extensions/inference/cutlass/d3x3.cu new file mode 100644 index 0000000..19c5f99 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/d3x3.cu @@ -0,0 +1,446 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "d3x3_kernel.h" + +const std::string HINT_MAP_D3x3_NAME = "HINT_MAP_D3x3"; +std::unordered_map HINT_MAP_D3x3 = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 0, 1280, 192, 32, 0, 0), 5 }, + { conv_key(80, 0, 1920, 272, 32, 0, 0), 0 }, + { conv_key(80, 0, 2560, 384, 32, 0, 0), 5 }, + { conv_key(80, 0, 2560, 384, 64, 0, 0), 5 }, + { conv_key(80, 0, 3840, 544, 32, 0, 0), 5 }, + { conv_key(80, 0, 3840, 544, 64, 0, 0), 15 }, + { conv_key(80, 0, 5120, 720, 128, 0, 0), 65555 }, + { conv_key(80, 0, 5120, 720, 192, 0, 0), 65547 }, + { conv_key(80, 0, 5120, 768, 32, 0, 0), 15 }, + { conv_key(80, 0, 5120, 768, 64, 0, 0), 65620 }, + { conv_key(80, 0, 5120, 768, 128, 0, 0), 65556 }, + { conv_key(80, 0, 7680, 1088, 32, 0, 0), 17 }, + { conv_key(80, 0, 7680, 1088, 64, 0, 0), 65574 }, + { conv_key(80, 0, 7680, 1088, 128, 0, 0), 65624 }, + { conv_key(80, 0, 7680, 1088, 192, 0, 0), 65624 }, + { conv_key(80, 0, 10240, 1440, 48, 0, 0), 65604 }, + { conv_key(80, 0, 10240, 1440, 64, 0, 0), 65576 }, + { conv_key(80, 0, 10240, 1440, 96, 0, 0), 65562 }, + { conv_key(80, 0, 10240, 1440, 128, 0, 0), 65560 }, + { conv_key(80, 0, 15360, 2160, 128, 0, 0), 65624 }, + { conv_key(80, 0, 15360, 2160, 192, 0, 0), 65619 }, + { conv_key(80, 0, 15360, 2176, 32, 0, 0), 65663 }, + { conv_key(80, 0, 15360, 2176, 48, 0, 0), 65662 }, + { conv_key(80, 0, 15360, 2176, 64, 0, 0), 65650 }, + { conv_key(80, 0, 15360, 2176, 96, 0, 0), 65636 }, + { conv_key(80, 0, 15360, 2176, 128, 0, 0), 65624 }, + { conv_key(80, 0, 30720, 4320, 48, 0, 0), 65646 }, + { conv_key(80, 0, 30720, 4320, 64, 0, 0), 65637 }, + { conv_key(80, 0, 30720, 4320, 96, 0, 0), 65628 }, + { conv_key(80, 0, 30720, 4320, 128, 0, 0), 65623 }, + { conv_key(80, 7, 4, 64, 64, 0, 0), 5 }, + { conv_key(80, 7, 4, 128, 128, 0, 0), 0 }, + { conv_key(80, 13, 8, 64, 64, 0, 0), 0 }, + { conv_key(80, 13, 8, 128, 128, 0, 0), 0 }, + { conv_key(80, 14, 8, 64, 64, 0, 0), 0 }, + { conv_key(80, 14, 8, 128, 128, 0, 0), 5 }, + { conv_key(80, 14, 8, 256, 256, 0, 0), 0 }, + { conv_key(80, 20, 12, 64, 64, 0, 0), 0 }, + { conv_key(80, 20, 12, 128, 128, 0, 0), 0 }, + { conv_key(80, 26, 15, 128, 128, 0, 0), 0 }, + { conv_key(80, 26, 15, 192, 192, 0, 0), 5 }, + { conv_key(80, 26, 15, 512, 512, 0, 0), 0 }, + { conv_key(80, 26, 15, 768, 768, 0, 0), 5 }, + { conv_key(80, 26, 16, 64, 64, 0, 0), 0 }, + { conv_key(80, 26, 16, 128, 128, 0, 0), 0 }, + { conv_key(80, 26, 16, 256, 256, 0, 0), 5 }, + { conv_key(80, 28, 16, 64, 64, 0, 0), 0 }, + { conv_key(80, 28, 16, 128, 128, 0, 0), 0 }, + { conv_key(80, 28, 16, 256, 256, 0, 0), 5 }, + { conv_key(80, 28, 16, 512, 512, 0, 0), 5 }, + { conv_key(80, 30, 17, 64, 64, 0, 0), 0 }, + { conv_key(80, 30, 17, 128, 128, 0, 0), 0 }, + { conv_key(80, 40, 24, 64, 64, 0, 0), 0 }, + { conv_key(80, 40, 24, 128, 128, 0, 0), 5 }, + { conv_key(80, 40, 24, 256, 256, 0, 0), 5 }, + { conv_key(80, 52, 30, 128, 128, 0, 0), 0 }, + { conv_key(80, 52, 30, 192, 192, 0, 0), 5 }, + { conv_key(80, 52, 30, 256, 256, 0, 0), 2 }, + { conv_key(80, 52, 30, 384, 384, 0, 0), 2 }, + { conv_key(80, 52, 30, 512, 512, 0, 0), 15 }, + { conv_key(80, 52, 30, 768, 768, 0, 0), 65550 }, + { conv_key(80, 52, 32, 64, 64, 0, 0), 0 }, + { conv_key(80, 52, 32, 128, 128, 0, 0), 0 }, + { conv_key(80, 52, 32, 256, 256, 0, 0), 2 }, + { conv_key(80, 52, 32, 512, 512, 0, 0), 2 }, + { conv_key(80, 60, 34, 64, 64, 0, 0), 5 }, + { conv_key(80, 60, 34, 128, 128, 0, 0), 5 }, + { conv_key(80, 60, 34, 256, 256, 0, 0), 15 }, + { conv_key(80, 80, 45, 128, 128, 0, 0), 15 }, + { conv_key(80, 80, 45, 192, 192, 0, 0), 6 }, + { conv_key(80, 80, 45, 512, 512, 0, 0), 65549 }, + { conv_key(80, 80, 45, 768, 768, 0, 0), 65547 }, + { conv_key(80, 80, 48, 64, 64, 0, 0), 5 }, + { conv_key(80, 80, 48, 128, 128, 0, 0), 15 }, + { conv_key(80, 80, 48, 256, 256, 0, 0), 65558 }, + { conv_key(80, 80, 48, 512, 512, 0, 0), 65555 }, + { conv_key(80, 104, 60, 128, 128, 0, 0), 15 }, + { conv_key(80, 104, 60, 192, 192, 0, 0), 65551 }, + { conv_key(80, 104, 60, 256, 256, 0, 0), 65588 }, + { conv_key(80, 104, 60, 384, 384, 0, 0), 65562 }, + { conv_key(80, 104, 60, 512, 512, 0, 0), 65554 }, + { conv_key(80, 120, 68, 64, 64, 0, 0), 15 }, + { conv_key(80, 120, 68, 128, 128, 0, 0), 65602 }, + { conv_key(80, 120, 68, 192, 192, 0, 0), 65646 }, + { conv_key(80, 120, 68, 256, 256, 0, 0), 65572 }, + { conv_key(80, 120, 68, 512, 512, 0, 0), 65624 }, + { conv_key(80, 120, 68, 768, 768, 0, 0), 65624 }, + { conv_key(80, 160, 90, 128, 128, 0, 0), 65596 }, + { conv_key(80, 160, 90, 192, 192, 0, 0), 65600 }, + { conv_key(80, 160, 90, 256, 256, 0, 0), 65576 }, + { conv_key(80, 160, 90, 384, 384, 0, 0), 65628 }, + { conv_key(80, 160, 90, 512, 512, 0, 0), 65623 }, + { conv_key(80, 240, 135, 128, 128, 0, 0), 65663 }, + { conv_key(80, 240, 135, 192, 192, 0, 0), 65664 }, + { conv_key(80, 240, 135, 512, 512, 0, 0), 65624 }, + { conv_key(80, 240, 135, 768, 768, 0, 0), 65619 }, + { conv_key(80, 240, 136, 64, 64, 0, 0), 65662 }, + { conv_key(80, 240, 136, 128, 128, 0, 0), 65663 }, + { conv_key(80, 240, 136, 192, 192, 0, 0), 65663 }, + { conv_key(80, 240, 136, 256, 256, 0, 0), 65647 }, + { conv_key(80, 240, 136, 384, 384, 0, 0), 65636 }, + { conv_key(80, 240, 136, 512, 512, 0, 0), 65624 }, + { conv_key(80, 480, 270, 128, 128, 0, 0), 65662 }, + { conv_key(80, 480, 270, 192, 192, 0, 0), 65646 }, + { conv_key(80, 480, 270, 256, 256, 0, 0), 65637 }, + { conv_key(80, 480, 270, 384, 384, 0, 0), 65627 }, + { conv_key(80, 480, 270, 512, 512, 0, 0), 65623 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 0, 1280, 192, 32, 0, 0), 2 }, + { conv_key(89, 0, 1920, 272, 32, 0, 0), 10 }, + { conv_key(89, 0, 2560, 384, 32, 0, 0), 8 }, + { conv_key(89, 0, 2560, 384, 64, 0, 0), 6 }, + { conv_key(89, 0, 3840, 544, 32, 0, 0), 6 }, + { conv_key(89, 0, 3840, 544, 64, 0, 0), 6 }, + { conv_key(89, 0, 5120, 720, 128, 0, 0), 65551 }, + { conv_key(89, 0, 5120, 720, 192, 0, 0), 65621 }, + { conv_key(89, 0, 5120, 768, 32, 0, 0), 15 }, + { conv_key(89, 0, 5120, 768, 64, 0, 0), 65571 }, + { conv_key(89, 0, 5120, 768, 128, 0, 0), 65551 }, + { conv_key(89, 0, 7680, 1088, 32, 0, 0), 65637 }, + { conv_key(89, 0, 7680, 1088, 64, 0, 0), 65624 }, + { conv_key(89, 0, 7680, 1088, 128, 0, 0), 65618 }, + { conv_key(89, 0, 7680, 1088, 192, 0, 0), 65549 }, + { conv_key(89, 0, 10240, 1440, 48, 0, 0), 65631 }, + { conv_key(89, 0, 10240, 1440, 64, 0, 0), 65626 }, + { conv_key(89, 0, 10240, 1440, 96, 0, 0), 65621 }, + { conv_key(89, 0, 10240, 1440, 128, 0, 0), 65618 }, + { conv_key(89, 0, 15360, 2160, 128, 0, 0), 65559 }, + { conv_key(89, 0, 15360, 2160, 192, 0, 0), 65662 }, + { conv_key(89, 0, 15360, 2176, 32, 0, 0), 65639 }, + { conv_key(89, 0, 15360, 2176, 48, 0, 0), 65631 }, + { conv_key(89, 0, 15360, 2176, 64, 0, 0), 65625 }, + { conv_key(89, 0, 15360, 2176, 96, 0, 0), 65620 }, + { conv_key(89, 0, 15360, 2176, 128, 0, 0), 65618 }, + { conv_key(89, 0, 30720, 4320, 48, 0, 0), 65653 }, + { conv_key(89, 0, 30720, 4320, 64, 0, 0), 65548 }, + { conv_key(89, 0, 30720, 4320, 96, 0, 0), 65544 }, + { conv_key(89, 0, 30720, 4320, 128, 0, 0), 65542 }, + { conv_key(89, 7, 4, 64, 64, 0, 0), 7 }, + { conv_key(89, 7, 4, 128, 128, 0, 0), 11 }, + { conv_key(89, 13, 8, 64, 64, 0, 0), 6 }, + { conv_key(89, 13, 8, 128, 128, 0, 0), 16 }, + { conv_key(89, 14, 8, 64, 64, 0, 0), 11 }, + { conv_key(89, 14, 8, 128, 128, 0, 0), 11 }, + { conv_key(89, 14, 8, 256, 256, 0, 0), 15 }, + { conv_key(89, 20, 12, 64, 64, 0, 0), 6 }, + { conv_key(89, 20, 12, 128, 128, 0, 0), 15 }, + { conv_key(89, 26, 15, 128, 128, 0, 0), 10 }, + { conv_key(89, 26, 15, 192, 192, 0, 0), 12 }, + { conv_key(89, 26, 15, 512, 512, 0, 0), 6 }, + { conv_key(89, 26, 15, 768, 768, 0, 0), 10 }, + { conv_key(89, 26, 16, 64, 64, 0, 0), 16 }, + { conv_key(89, 26, 16, 128, 128, 0, 0), 11 }, + { conv_key(89, 26, 16, 256, 256, 0, 0), 4 }, + { conv_key(89, 28, 16, 64, 64, 0, 0), 15 }, + { conv_key(89, 28, 16, 128, 128, 0, 0), 7 }, + { conv_key(89, 28, 16, 256, 256, 0, 0), 6 }, + { conv_key(89, 28, 16, 512, 512, 0, 0), 7 }, + { conv_key(89, 30, 17, 64, 64, 0, 0), 6 }, + { conv_key(89, 30, 17, 128, 128, 0, 0), 11 }, + { conv_key(89, 40, 24, 64, 64, 0, 0), 20 }, + { conv_key(89, 40, 24, 128, 128, 0, 0), 11 }, + { conv_key(89, 40, 24, 256, 256, 0, 0), 20 }, + { conv_key(89, 52, 30, 128, 128, 0, 0), 15 }, + { conv_key(89, 52, 30, 192, 192, 0, 0), 20 }, + { conv_key(89, 52, 30, 256, 256, 0, 0), 10 }, + { conv_key(89, 52, 30, 384, 384, 0, 0), 15 }, + { conv_key(89, 52, 30, 512, 512, 0, 0), 65618 }, + { conv_key(89, 52, 30, 768, 768, 0, 0), 65545 }, + { conv_key(89, 52, 32, 64, 64, 0, 0), 4 }, + { conv_key(89, 52, 32, 128, 128, 0, 0), 15 }, + { conv_key(89, 52, 32, 256, 256, 0, 0), 10 }, + { conv_key(89, 52, 32, 512, 512, 0, 0), 65618 }, + { conv_key(89, 60, 34, 64, 64, 0, 0), 20 }, + { conv_key(89, 60, 34, 128, 128, 0, 0), 6 }, + { conv_key(89, 60, 34, 256, 256, 0, 0), 20 }, + { conv_key(89, 80, 45, 128, 128, 0, 0), 10 }, + { conv_key(89, 80, 45, 192, 192, 0, 0), 20 }, + { conv_key(89, 80, 45, 512, 512, 0, 0), 65551 }, + { conv_key(89, 80, 45, 768, 768, 0, 0), 65621 }, + { conv_key(89, 80, 48, 64, 64, 0, 0), 15 }, + { conv_key(89, 80, 48, 128, 128, 0, 0), 10 }, + { conv_key(89, 80, 48, 256, 256, 0, 0), 65641 }, + { conv_key(89, 80, 48, 512, 512, 0, 0), 65551 }, + { conv_key(89, 104, 60, 128, 128, 0, 0), 65565 }, + { conv_key(89, 104, 60, 192, 192, 0, 0), 65590 }, + { conv_key(89, 104, 60, 256, 256, 0, 0), 65641 }, + { conv_key(89, 104, 60, 384, 384, 0, 0), 65621 }, + { conv_key(89, 104, 60, 512, 512, 0, 0), 65618 }, + { conv_key(89, 120, 68, 64, 64, 0, 0), 10 }, + { conv_key(89, 120, 68, 128, 128, 0, 0), 65633 }, + { conv_key(89, 120, 68, 192, 192, 0, 0), 65570 }, + { conv_key(89, 120, 68, 256, 256, 0, 0), 65624 }, + { conv_key(89, 120, 68, 512, 512, 0, 0), 65618 }, + { conv_key(89, 120, 68, 768, 768, 0, 0), 65621 }, + { conv_key(89, 160, 90, 128, 128, 0, 0), 65596 }, + { conv_key(89, 160, 90, 192, 192, 0, 0), 65631 }, + { conv_key(89, 160, 90, 256, 256, 0, 0), 65626 }, + { conv_key(89, 160, 90, 384, 384, 0, 0), 65621 }, + { conv_key(89, 160, 90, 512, 512, 0, 0), 65618 }, + { conv_key(89, 240, 135, 128, 128, 0, 0), 65640 }, + { conv_key(89, 240, 135, 192, 192, 0, 0), 65631 }, + { conv_key(89, 240, 135, 512, 512, 0, 0), 65618 }, + { conv_key(89, 240, 135, 768, 768, 0, 0), 65630 }, + { conv_key(89, 240, 136, 64, 64, 0, 0), 65662 }, + { conv_key(89, 240, 136, 128, 128, 0, 0), 65639 }, + { conv_key(89, 240, 136, 192, 192, 0, 0), 65631 }, + { conv_key(89, 240, 136, 256, 256, 0, 0), 65625 }, + { conv_key(89, 240, 136, 384, 384, 0, 0), 65620 }, + { conv_key(89, 240, 136, 512, 512, 0, 0), 65559 }, + { conv_key(89, 480, 270, 128, 128, 0, 0), 65640 }, + { conv_key(89, 480, 270, 192, 192, 0, 0), 65597 }, + { conv_key(89, 480, 270, 256, 256, 0, 0), 65549 }, + { conv_key(89, 480, 270, 384, 384, 0, 0), 65544 }, + { conv_key(89, 480, 270, 512, 512, 0, 0), 65542 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 0, 1280, 192, 32, 0, 0), 10 }, + { conv_key(90, 0, 1920, 272, 32, 0, 0), 6 }, + { conv_key(90, 0, 2560, 384, 32, 0, 0), 0 }, + { conv_key(90, 0, 2560, 384, 64, 0, 0), 0 }, + { conv_key(90, 0, 3840, 544, 32, 0, 0), 0 }, + { conv_key(90, 0, 3840, 544, 64, 0, 0), 65631 }, + { conv_key(90, 0, 5120, 720, 128, 0, 0), 65618 }, + { conv_key(90, 0, 5120, 720, 192, 0, 0), 65621 }, + { conv_key(90, 0, 5120, 768, 32, 0, 0), 65646 }, + { conv_key(90, 0, 5120, 768, 64, 0, 0), 65626 }, + { conv_key(90, 0, 5120, 768, 128, 0, 0), 65618 }, + { conv_key(90, 0, 7680, 1088, 32, 0, 0), 65603 }, + { conv_key(90, 0, 7680, 1088, 64, 0, 0), 65624 }, + { conv_key(90, 0, 7680, 1088, 128, 0, 0), 65558 }, + { conv_key(90, 0, 7680, 1088, 192, 0, 0), 65621 }, + { conv_key(90, 0, 10240, 1440, 48, 0, 0), 65651 }, + { conv_key(90, 0, 10240, 1440, 64, 0, 0), 65641 }, + { conv_key(90, 0, 10240, 1440, 96, 0, 0), 65577 }, + { conv_key(90, 0, 10240, 1440, 128, 0, 0), 65567 }, + { conv_key(90, 0, 15360, 2160, 128, 0, 0), 65634 }, + { conv_key(90, 0, 15360, 2160, 192, 0, 0), 65627 }, + { conv_key(90, 0, 15360, 2176, 32, 0, 0), 65675 }, + { conv_key(90, 0, 15360, 2176, 48, 0, 0), 65653 }, + { conv_key(90, 0, 15360, 2176, 64, 0, 0), 65600 }, + { conv_key(90, 0, 15360, 2176, 96, 0, 0), 65653 }, + { conv_key(90, 0, 15360, 2176, 128, 0, 0), 65634 }, + { conv_key(90, 0, 30720, 4320, 48, 0, 0), 65675 }, + { conv_key(90, 0, 30720, 4320, 64, 0, 0), 65657 }, + { conv_key(90, 0, 30720, 4320, 96, 0, 0), 65641 }, + { conv_key(90, 0, 30720, 4320, 128, 0, 0), 65635 }, + { conv_key(90, 7, 4, 64, 64, 0, 0), 6 }, + { conv_key(90, 7, 4, 128, 128, 0, 0), 2 }, + { conv_key(90, 13, 8, 64, 64, 0, 0), 10 }, + { conv_key(90, 13, 8, 128, 128, 0, 0), 6 }, + { conv_key(90, 14, 8, 64, 64, 0, 0), 5 }, + { conv_key(90, 14, 8, 128, 128, 0, 0), 6 }, + { conv_key(90, 14, 8, 256, 256, 0, 0), 10 }, + { conv_key(90, 20, 12, 64, 64, 0, 0), 6 }, + { conv_key(90, 20, 12, 128, 128, 0, 0), 0 }, + { conv_key(90, 26, 15, 128, 128, 0, 0), 10 }, + { conv_key(90, 26, 15, 192, 192, 0, 0), 6 }, + { conv_key(90, 26, 15, 512, 512, 0, 0), 10 }, + { conv_key(90, 26, 15, 768, 768, 0, 0), 65542 }, + { conv_key(90, 26, 16, 64, 64, 0, 0), 10 }, + { conv_key(90, 26, 16, 128, 128, 0, 0), 10 }, + { conv_key(90, 26, 16, 256, 256, 0, 0), 0 }, + { conv_key(90, 28, 16, 64, 64, 0, 0), 10 }, + { conv_key(90, 28, 16, 128, 128, 0, 0), 10 }, + { conv_key(90, 28, 16, 256, 256, 0, 0), 0 }, + { conv_key(90, 28, 16, 512, 512, 0, 0), 0 }, + { conv_key(90, 30, 17, 64, 64, 0, 0), 10 }, + { conv_key(90, 30, 17, 128, 128, 0, 0), 10 }, + { conv_key(90, 40, 24, 64, 64, 0, 0), 10 }, + { conv_key(90, 40, 24, 128, 128, 0, 0), 10 }, + { conv_key(90, 40, 24, 256, 256, 0, 0), 10 }, + { conv_key(90, 52, 30, 128, 128, 0, 0), 10 }, + { conv_key(90, 52, 30, 192, 192, 0, 0), 65636 }, + { conv_key(90, 52, 30, 256, 256, 0, 0), 65635 }, + { conv_key(90, 52, 30, 384, 384, 0, 0), 65625 }, + { conv_key(90, 52, 30, 512, 512, 0, 0), 65618 }, + { conv_key(90, 52, 30, 768, 768, 0, 0), 65616 }, + { conv_key(90, 52, 32, 64, 64, 0, 0), 0 }, + { conv_key(90, 52, 32, 128, 128, 0, 0), 0 }, + { conv_key(90, 52, 32, 256, 256, 0, 0), 65633 }, + { conv_key(90, 52, 32, 512, 512, 0, 0), 65618 }, + { conv_key(90, 60, 34, 64, 64, 0, 0), 0 }, + { conv_key(90, 60, 34, 128, 128, 0, 0), 0 }, + { conv_key(90, 60, 34, 256, 256, 0, 0), 65631 }, + { conv_key(90, 80, 45, 128, 128, 0, 0), 65644 }, + { conv_key(90, 80, 45, 192, 192, 0, 0), 65626 }, + { conv_key(90, 80, 45, 512, 512, 0, 0), 65618 }, + { conv_key(90, 80, 45, 768, 768, 0, 0), 65621 }, + { conv_key(90, 80, 48, 64, 64, 0, 0), 0 }, + { conv_key(90, 80, 48, 128, 128, 0, 0), 65646 }, + { conv_key(90, 80, 48, 256, 256, 0, 0), 65626 }, + { conv_key(90, 80, 48, 512, 512, 0, 0), 65618 }, + { conv_key(90, 104, 60, 128, 128, 0, 0), 65637 }, + { conv_key(90, 104, 60, 192, 192, 0, 0), 65628 }, + { conv_key(90, 104, 60, 256, 256, 0, 0), 65637 }, + { conv_key(90, 104, 60, 384, 384, 0, 0), 65621 }, + { conv_key(90, 104, 60, 512, 512, 0, 0), 65624 }, + { conv_key(90, 120, 68, 64, 64, 0, 0), 65604 }, + { conv_key(90, 120, 68, 128, 128, 0, 0), 65603 }, + { conv_key(90, 120, 68, 192, 192, 0, 0), 65648 }, + { conv_key(90, 120, 68, 256, 256, 0, 0), 65624 }, + { conv_key(90, 120, 68, 512, 512, 0, 0), 65558 }, + { conv_key(90, 120, 68, 768, 768, 0, 0), 65621 }, + { conv_key(90, 160, 90, 128, 128, 0, 0), 65672 }, + { conv_key(90, 160, 90, 192, 192, 0, 0), 65651 }, + { conv_key(90, 160, 90, 256, 256, 0, 0), 65597 }, + { conv_key(90, 160, 90, 384, 384, 0, 0), 65578 }, + { conv_key(90, 160, 90, 512, 512, 0, 0), 65566 }, + { conv_key(90, 240, 135, 128, 128, 0, 0), 65675 }, + { conv_key(90, 240, 135, 192, 192, 0, 0), 65653 }, + { conv_key(90, 240, 135, 512, 512, 0, 0), 65634 }, + { conv_key(90, 240, 135, 768, 768, 0, 0), 65626 }, + { conv_key(90, 240, 136, 64, 64, 0, 0), 65675 }, + { conv_key(90, 240, 136, 128, 128, 0, 0), 65676 }, + { conv_key(90, 240, 136, 192, 192, 0, 0), 65653 }, + { conv_key(90, 240, 136, 256, 256, 0, 0), 65601 }, + { conv_key(90, 240, 136, 384, 384, 0, 0), 65653 }, + { conv_key(90, 240, 136, 512, 512, 0, 0), 65632 }, + { conv_key(90, 480, 270, 128, 128, 0, 0), 65675 }, + { conv_key(90, 480, 270, 192, 192, 0, 0), 65675 }, + { conv_key(90, 480, 270, 256, 256, 0, 0), 65657 }, + { conv_key(90, 480, 270, 384, 384, 0, 0), 65643 }, + { conv_key(90, 480, 270, 512, 512, 0, 0), 65634 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 0, 1280, 192, 32, 0, 0), 0 }, + { conv_key(100, 0, 1920, 272, 32, 0, 0), 1 }, + { conv_key(100, 0, 2560, 384, 32, 0, 0), 65571 }, + { conv_key(100, 0, 2560, 384, 64, 0, 0), 65553 }, + { conv_key(100, 0, 3840, 544, 32, 0, 0), 65565 }, + { conv_key(100, 0, 3840, 544, 64, 0, 0), 65570 }, + { conv_key(100, 0, 5120, 720, 128, 0, 0), 65566 }, + { conv_key(100, 0, 5120, 720, 192, 0, 0), 65621 }, + { conv_key(100, 0, 5120, 768, 32, 0, 0), 65571 }, + { conv_key(100, 0, 5120, 768, 64, 0, 0), 65628 }, + { conv_key(100, 0, 5120, 768, 128, 0, 0), 65569 }, + { conv_key(100, 0, 7680, 1088, 32, 0, 0), 65647 }, + { conv_key(100, 0, 7680, 1088, 64, 0, 0), 65554 }, + { conv_key(100, 0, 7680, 1088, 128, 0, 0), 65627 }, + { conv_key(100, 0, 7680, 1088, 192, 0, 0), 65554 }, + { conv_key(100, 0, 10240, 1440, 48, 0, 0), 65653 }, + { conv_key(100, 0, 10240, 1440, 64, 0, 0), 65568 }, + { conv_key(100, 0, 10240, 1440, 96, 0, 0), 65635 }, + { conv_key(100, 0, 10240, 1440, 128, 0, 0), 65628 }, + { conv_key(100, 0, 15360, 2160, 128, 0, 0), 65647 }, + { conv_key(100, 0, 15360, 2160, 192, 0, 0), 65635 }, + { conv_key(100, 0, 15360, 2176, 32, 0, 0), 65666 }, + { conv_key(100, 0, 15360, 2176, 48, 0, 0), 65654 }, + { conv_key(100, 0, 15360, 2176, 64, 0, 0), 65647 }, + { conv_key(100, 0, 15360, 2176, 96, 0, 0), 65659 }, + { conv_key(100, 0, 15360, 2176, 128, 0, 0), 65572 }, + { conv_key(100, 0, 30720, 4320, 48, 0, 0), 65684 }, + { conv_key(100, 0, 30720, 4320, 64, 0, 0), 65684 }, + { conv_key(100, 0, 30720, 4320, 96, 0, 0), 65658 }, + { conv_key(100, 0, 30720, 4320, 128, 0, 0), 65647 }, + { conv_key(100, 7, 4, 64, 64, 0, 0), 10 }, + { conv_key(100, 7, 4, 128, 128, 0, 0), 11 }, + { conv_key(100, 13, 8, 64, 64, 0, 0), 3 }, + { conv_key(100, 13, 8, 128, 128, 0, 0), 15 }, + { conv_key(100, 14, 8, 64, 64, 0, 0), 10 }, + { conv_key(100, 14, 8, 128, 128, 0, 0), 3 }, + { conv_key(100, 14, 8, 256, 256, 0, 0), 8 }, + { conv_key(100, 20, 12, 64, 64, 0, 0), 15 }, + { conv_key(100, 20, 12, 128, 128, 0, 0), 1 }, + { conv_key(100, 26, 15, 128, 128, 0, 0), 15 }, + { conv_key(100, 26, 15, 192, 192, 0, 0), 1 }, + { conv_key(100, 26, 15, 512, 512, 0, 0), 5 }, + { conv_key(100, 26, 15, 768, 768, 0, 0), 5 }, + { conv_key(100, 26, 16, 64, 64, 0, 0), 15 }, + { conv_key(100, 26, 16, 128, 128, 0, 0), 15 }, + { conv_key(100, 26, 16, 256, 256, 0, 0), 1 }, + { conv_key(100, 28, 16, 64, 64, 0, 0), 0 }, + { conv_key(100, 28, 16, 128, 128, 0, 0), 15 }, + { conv_key(100, 28, 16, 256, 256, 0, 0), 3 }, + { conv_key(100, 28, 16, 512, 512, 0, 0), 1 }, + { conv_key(100, 30, 17, 64, 64, 0, 0), 5 }, + { conv_key(100, 30, 17, 128, 128, 0, 0), 15 }, + { conv_key(100, 40, 24, 64, 64, 0, 0), 6 }, + { conv_key(100, 40, 24, 128, 128, 0, 0), 4 }, + { conv_key(100, 40, 24, 256, 256, 0, 0), 3 }, + { conv_key(100, 52, 30, 128, 128, 0, 0), 15 }, + { conv_key(100, 52, 30, 192, 192, 0, 0), 15 }, + { conv_key(100, 52, 30, 256, 256, 0, 0), 0 }, + { conv_key(100, 52, 30, 384, 384, 0, 0), 6 }, + { conv_key(100, 52, 30, 512, 512, 0, 0), 65638 }, + { conv_key(100, 52, 30, 768, 768, 0, 0), 65569 }, + { conv_key(100, 52, 32, 64, 64, 0, 0), 6 }, + { conv_key(100, 52, 32, 128, 128, 0, 0), 6 }, + { conv_key(100, 52, 32, 256, 256, 0, 0), 5 }, + { conv_key(100, 52, 32, 512, 512, 0, 0), 65629 }, + { conv_key(100, 60, 34, 64, 64, 0, 0), 6 }, + { conv_key(100, 60, 34, 128, 128, 0, 0), 0 }, + { conv_key(100, 60, 34, 256, 256, 0, 0), 15 }, + { conv_key(100, 80, 45, 128, 128, 0, 0), 5 }, + { conv_key(100, 80, 45, 192, 192, 0, 0), 65570 }, + { conv_key(100, 80, 45, 512, 512, 0, 0), 65566 }, + { conv_key(100, 80, 45, 768, 768, 0, 0), 65560 }, + { conv_key(100, 80, 48, 64, 64, 0, 0), 0 }, + { conv_key(100, 80, 48, 128, 128, 0, 0), 20 }, + { conv_key(100, 80, 48, 256, 256, 0, 0), 65588 }, + { conv_key(100, 80, 48, 512, 512, 0, 0), 65582 }, + { conv_key(100, 104, 60, 128, 128, 0, 0), 65598 }, + { conv_key(100, 104, 60, 192, 192, 0, 0), 65679 }, + { conv_key(100, 104, 60, 256, 256, 0, 0), 65599 }, + { conv_key(100, 104, 60, 384, 384, 0, 0), 65571 }, + { conv_key(100, 104, 60, 512, 512, 0, 0), 65568 }, + { conv_key(100, 120, 68, 64, 64, 0, 0), 5 }, + { conv_key(100, 120, 68, 128, 128, 0, 0), 65581 }, + { conv_key(100, 120, 68, 192, 192, 0, 0), 65607 }, + { conv_key(100, 120, 68, 256, 256, 0, 0), 65686 }, + { conv_key(100, 120, 68, 512, 512, 0, 0), 65570 }, + { conv_key(100, 120, 68, 768, 768, 0, 0), 65559 }, + { conv_key(100, 160, 90, 128, 128, 0, 0), 65601 }, + { conv_key(100, 160, 90, 192, 192, 0, 0), 65602 }, + { conv_key(100, 160, 90, 256, 256, 0, 0), 65602 }, + { conv_key(100, 160, 90, 384, 384, 0, 0), 65596 }, + { conv_key(100, 160, 90, 512, 512, 0, 0), 65563 }, + { conv_key(100, 240, 135, 128, 128, 0, 0), 65607 }, + { conv_key(100, 240, 135, 192, 192, 0, 0), 65608 }, + { conv_key(100, 240, 135, 512, 512, 0, 0), 65572 }, + { conv_key(100, 240, 135, 768, 768, 0, 0), 65565 }, + { conv_key(100, 240, 136, 64, 64, 0, 0), 65682 }, + { conv_key(100, 240, 136, 128, 128, 0, 0), 65607 }, + { conv_key(100, 240, 136, 192, 192, 0, 0), 65606 }, + { conv_key(100, 240, 136, 256, 256, 0, 0), 65591 }, + { conv_key(100, 240, 136, 384, 384, 0, 0), 65572 }, + { conv_key(100, 240, 136, 512, 512, 0, 0), 65572 }, + { conv_key(100, 480, 270, 128, 128, 0, 0), 65609 }, + { conv_key(100, 480, 270, 192, 192, 0, 0), 65684 }, + { conv_key(100, 480, 270, 256, 256, 0, 0), 65665 }, + { conv_key(100, 480, 270, 384, 384, 0, 0), 65647 }, + { conv_key(100, 480, 270, 512, 512, 0, 0), 65638 }, +#endif +}; + +at::Tensor d3x3(const int sm, const at::Tensor& feature, const at::Tensor& weight, at::Tensor& out_buf) +{ + return d3x3_launch_helper(sm, feature, weight, out_buf, HINT_MAP_D3x3, HINT_MAP_D3x3_NAME); +} diff --git a/src/layers/extensions/inference/cutlass/d3x3_kernel.h b/src/layers/extensions/inference/cutlass/d3x3_kernel.h new file mode 100644 index 0000000..c8b5f7f --- /dev/null +++ b/src/layers/extensions/inference/cutlass/d3x3_kernel.h @@ -0,0 +1,596 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +// clang-format on + +#include "cutlass_epilogue.h" +#include "cutlass_helper_d3x3.h" +#include "../common_cu.h" +#include "../def_cutlass.h" + +static constexpr int CUTLASS_START_INDEX = 65536; +static constexpr int HINT_NUM_CUTLASS = 151; +static constexpr int HINT_NUM_CUDA = 25; + +template +at::Tensor d3x3_cutlass(const at::Tensor& feature, const at::Tensor& weight, const at::Tensor& out_buf) +{ + static constexpr int groups_per_cta = 64; + using ThreadBlockOutputShape = cutlass::conv::TensorNHWCShape<1, 8, 8, groups_per_cta>; + using FilterShape = cutlass::MatrixShape<3, 3>; + using ThreadblockShape = + cutlass::gemm::GemmShape; + using WarpShape = cutlass::gemm::GemmShape<16, groups_per_cta, FilterShape::kCount>; + using InstructionShape = cutlass::gemm::GemmShape<1, 1, 1>; + using SwizzleThreadBlock = + cutlass::conv::threadblock::DepthwiseDirect2dConvIdentityThreadblockSwizzle< + 1, ThreadBlockOutputShape::kN, ThreadBlockOutputShape::kH, ThreadBlockOutputShape::kW>; + using StrideShape = cutlass::MatrixShape<1, 1>; + using DilationShape = cutlass::MatrixShape<1, 1>; + + using EpilogueOp = cutlass::epilogue::thread::LinearCombination< + cutlass::half_t, // Data type of output matrix. + 128 / cutlass::sizeof_bits_v, // The number of elements per vectorized. + cutlass::half_t, // Data type of accumulator + cutlass::half_t, // Data type for alpha/beta in linear combination + cutlass::epilogue::thread::ScaleType::Nothing>; // Epilogue scaling operation. + + using DepthwiseDirect2dConv = typename CustomDefaultDepthwiseDirect2dConvFprop< + cutlass::half_t, cutlass::layout::TensorNHWC, cutlass::half_t, cutlass::layout::TensorNHWC, + cutlass::half_t, cutlass::layout::TensorNHWC, cutlass::half_t, cutlass::arch::OpClassSimt, SmArch, + ThreadblockShape, ThreadBlockOutputShape, FilterShape, WarpShape, InstructionShape, EpilogueOp, + SwizzleThreadBlock, stages, cutlass::arch::OpMultiplyAdd, cutlass::conv::IteratorAlgorithm::kFixedStrideDilation, + cutlass::conv::StrideSupport::kFixed, StrideShape, DilationShape>::Kernel; + + using Direct2dConv = CustomDirectConvolutionDevice; + + // Note: d3x3 weight is reordered from [C, 1, 3, 3] to [1, C, 3, 3]. + const int B = feature.size(0); + const int C = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int C1_ = weight.size(0); + const int C2_ = weight.size(1); + const int KH_ = weight.size(2); + const int KW_ = weight.size(3); + assert(C == C2_ && C1_ == 1 && KH_ == 3 && KW_ == 3); + + cutlass::conv::Conv2dProblemSize problem_size({ B, H, W, C }, // input + { C, 3, 3, 1 }, // kernel + { 1, 1, 1, 1 }, // pad + { 1, 1 }, // stride + { 1, 1 }, // dilation + { B, H, W, C }, // out + cutlass::conv::Mode::kCrossCorrelation, + split_k_slices, // split_k_slices + C // groups + ); + + cutlass::TensorRef d_feature( + static_cast(feature.data_ptr()), + cutlass::make_Coord(feature.stride(3), feature.stride(2), feature.stride(0))); + cutlass::TensorRef d_weight( + static_cast(weight.data_ptr()), + cutlass::make_Coord(weight.stride(3), weight.stride(2), weight.stride(0))); + cutlass::TensorRef d_out( + static_cast(out_buf.data_ptr()), + cutlass::make_Coord(out_buf.stride(3), out_buf.stride(2), out_buf.stride(0))); + + typename Direct2dConv::Arguments args(problem_size, d_feature, d_weight, d_out, d_out, {}, d_weight); + + Direct2dConv direct2dconv_op; + cutlass::Status status = direct2dconv_op.can_implement(args); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to configure convolution operation." << std::endl; + return at::Tensor(); + } + + auto stream = at::cuda::getCurrentCUDAStream(); + status = direct2dconv_op(args, nullptr, stream); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to run convolution operation." << std::endl; + return at::Tensor(); + } + + return out_buf; +} + +template +__global__ void d3x3_kernel(GPUTensor4D out, const GPUTensor4D feature, + const GPUTensor4D weight, const int C, const int H, const int W) +{ + const int n = blockIdx.x * blockDim.x + threadIdx.x; + const int c = n % C; + const int hw = n / C; + const int h = (hw % ((H + H_BLOCK_SIZE - 1) / H_BLOCK_SIZE)) * H_BLOCK_SIZE; + const int w = (hw / ((H + H_BLOCK_SIZE - 1) / H_BLOCK_SIZE)) * W_BLOCK_SIZE; + if (c >= C || h >= H || w >= W) { + cudaGDC(); + return; + } + + float _weight[3][3]; + float _feature[H_BLOCK_SIZE + 2][W_BLOCK_SIZE + 2]; + +#pragma unroll + for (int i = 0; i < 3; i++) { +#pragma unroll + for (int j = 0; j < 3; j++) { + _weight[i][j] = static_cast(weight[0][c][i][j]); + } + } + cudaGDC(); + +#pragma unroll + for (int i = 0; i < H_BLOCK_SIZE + 2; i++) { +#pragma unroll + for (int j = 0; j < W_BLOCK_SIZE + 2; j++) { + const int y = h + i - 1; + const int x = w + j - 1; + float curr_feature = 0.f; + if (y >= 0 && y < H && x >= 0 && x < W) { + curr_feature = static_cast(feature[0][c][y][x]); + } + _feature[i][j] = curr_feature; + } + } + + for (int h_offset = 0; h_offset < H_BLOCK_SIZE; h_offset++) { + if (h + h_offset >= H) { + break; + } + for (int w_offset = 0; w_offset < W_BLOCK_SIZE; w_offset++) { + if (w + w_offset >= W) { + break; + } + + float r = 0.f; +#pragma unroll + for (int i = 0; i < 3; i++) { +#pragma unroll + for (int j = 0; j < 3; j++) { + float curr_weight = _weight[i][j]; + float curr_feature = _feature[i + h_offset][j + w_offset]; + r += curr_feature * curr_weight; + } + } + out[0][c][h + h_offset][w + w_offset] = r; + } + } +} + +template +__forceinline__ auto d3x3_launch(const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& out_buf) +{ + // Note: d3x3 weight is reordered from [C, 1, 3, 3] to [1, C, 3, 3]. + const int C = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int C1_ = weight.size(0); + const int C2_ = weight.size(1); + const int KH_ = weight.size(2); + const int KW_ = weight.size(3); + assert(C == C2_ && C1_ == 1 && KH_ == 3 && KW_ == 3); + const int total_threads = + C * ((H + H_BLOCK_SIZE - 1) / H_BLOCK_SIZE) * ((W + W_BLOCK_SIZE - 1) / W_BLOCK_SIZE); + + const int BLOCK_SIZE = 256; + const dim3 gridDim((total_threads + BLOCK_SIZE - 1) / BLOCK_SIZE); + const dim3 blockDim(BLOCK_SIZE); + + cudaLaunchConfig_t config; + config.gridDim = gridDim; + config.blockDim = blockDim; + config.dynamicSmemBytes = 0; + config.stream = at::cuda::getCurrentCUDAStream(); + auto attr = get_cuda_launch_attribute(); + config.attrs = &attr; + config.numAttrs = 1; + + cudaLaunchKernelEx(&config, &d3x3_kernel, out_buf, feature, weight, + C, H, W); + return out_buf; +} + +__forceinline__ auto d3x3_launch_switcher(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& out_buf, + const int hint) +{ + if (sm >= 80) { + /** + * 0: pytorch + * 1 - 25: cuda + * 65536 - 65686: cutlass + */ + switch (hint) { + // remove the original case 0 because "at::conv2d" does not support out_buf + case 0: + return d3x3_launch<2, 2>(feature, weight, out_buf); + case 1: + return d3x3_launch<2, 3>(feature, weight, out_buf); + case 2: + return d3x3_launch<2, 4>(feature, weight, out_buf); + case 3: + return d3x3_launch<2, 5>(feature, weight, out_buf); + case 4: + return d3x3_launch<2, 6>(feature, weight, out_buf); + case 5: + return d3x3_launch<3, 2>(feature, weight, out_buf); + case 6: + return d3x3_launch<3, 3>(feature, weight, out_buf); + case 7: + return d3x3_launch<3, 4>(feature, weight, out_buf); + case 8: + return d3x3_launch<3, 5>(feature, weight, out_buf); + case 9: + return d3x3_launch<3, 6>(feature, weight, out_buf); + case 10: + return d3x3_launch<4, 2>(feature, weight, out_buf); + case 11: + return d3x3_launch<4, 3>(feature, weight, out_buf); + case 12: + return d3x3_launch<4, 4>(feature, weight, out_buf); + case 13: + return d3x3_launch<4, 5>(feature, weight, out_buf); + case 14: + return d3x3_launch<4, 6>(feature, weight, out_buf); + case 15: + return d3x3_launch<5, 2>(feature, weight, out_buf); + case 16: + return d3x3_launch<5, 3>(feature, weight, out_buf); + case 17: + return d3x3_launch<5, 4>(feature, weight, out_buf); + case 18: + return d3x3_launch<5, 5>(feature, weight, out_buf); + case 19: + return d3x3_launch<5, 6>(feature, weight, out_buf); + case 20: + return d3x3_launch<6, 2>(feature, weight, out_buf); + case 21: + return d3x3_launch<6, 3>(feature, weight, out_buf); + case 22: + return d3x3_launch<6, 4>(feature, weight, out_buf); + case 23: + return d3x3_launch<6, 5>(feature, weight, out_buf); + case 24: + return d3x3_launch<6, 6>(feature, weight, out_buf); + case 65536: + return d3x3_cutlass(feature, weight, out_buf); + case 65537: + return d3x3_cutlass(feature, weight, out_buf); + case 65538: + return d3x3_cutlass(feature, weight, out_buf); + case 65539: + return d3x3_cutlass(feature, weight, out_buf); + case 65540: + return d3x3_cutlass(feature, weight, out_buf); + case 65541: + return d3x3_cutlass(feature, weight, out_buf); + case 65542: + return d3x3_cutlass(feature, weight, out_buf); + case 65543: + return d3x3_cutlass(feature, weight, out_buf); + case 65544: + return d3x3_cutlass(feature, weight, out_buf); + case 65545: + return d3x3_cutlass(feature, weight, out_buf); + case 65546: + return d3x3_cutlass(feature, weight, out_buf); + case 65547: + return d3x3_cutlass(feature, weight, out_buf); + case 65548: + return d3x3_cutlass(feature, weight, out_buf); + case 65549: + return d3x3_cutlass(feature, weight, out_buf); + case 65550: + return d3x3_cutlass(feature, weight, out_buf); + case 65551: + return d3x3_cutlass(feature, weight, out_buf); + case 65552: + return d3x3_cutlass(feature, weight, out_buf); + case 65553: + return d3x3_cutlass(feature, weight, out_buf); + case 65554: + return d3x3_cutlass(feature, weight, out_buf); + case 65555: + return d3x3_cutlass(feature, weight, out_buf); + case 65556: + return d3x3_cutlass(feature, weight, out_buf); + case 65557: + return d3x3_cutlass(feature, weight, out_buf); + case 65558: + return d3x3_cutlass(feature, weight, out_buf); + case 65559: + return d3x3_cutlass(feature, weight, out_buf); + case 65560: + return d3x3_cutlass(feature, weight, out_buf); + case 65561: + return d3x3_cutlass(feature, weight, out_buf); + case 65562: + return d3x3_cutlass(feature, weight, out_buf); + case 65563: + return d3x3_cutlass(feature, weight, out_buf); + case 65564: + return d3x3_cutlass(feature, weight, out_buf); + case 65565: + return d3x3_cutlass(feature, weight, out_buf); + case 65566: + return d3x3_cutlass(feature, weight, out_buf); + case 65567: + return d3x3_cutlass(feature, weight, out_buf); + case 65568: + return d3x3_cutlass(feature, weight, out_buf); + case 65569: + return d3x3_cutlass(feature, weight, out_buf); + case 65570: + return d3x3_cutlass(feature, weight, out_buf); + case 65571: + return d3x3_cutlass(feature, weight, out_buf); + case 65572: + return d3x3_cutlass(feature, weight, out_buf); + case 65573: + return d3x3_cutlass(feature, weight, out_buf); + case 65574: + return d3x3_cutlass(feature, weight, out_buf); + case 65575: + return d3x3_cutlass(feature, weight, out_buf); + case 65576: + return d3x3_cutlass(feature, weight, out_buf); + case 65577: + return d3x3_cutlass(feature, weight, out_buf); + case 65578: + return d3x3_cutlass(feature, weight, out_buf); + case 65579: + return d3x3_cutlass(feature, weight, out_buf); + case 65580: + return d3x3_cutlass(feature, weight, out_buf); + case 65581: + return d3x3_cutlass(feature, weight, out_buf); + case 65582: + return d3x3_cutlass(feature, weight, out_buf); + case 65583: + return d3x3_cutlass(feature, weight, out_buf); + case 65584: + return d3x3_cutlass(feature, weight, out_buf); + case 65585: + return d3x3_cutlass(feature, weight, out_buf); + case 65586: + return d3x3_cutlass(feature, weight, out_buf); + case 65587: + return d3x3_cutlass(feature, weight, out_buf); + case 65588: + return d3x3_cutlass(feature, weight, out_buf); + case 65589: + return d3x3_cutlass(feature, weight, out_buf); + case 65590: + return d3x3_cutlass(feature, weight, out_buf); + case 65591: + return d3x3_cutlass(feature, weight, out_buf); + case 65592: + return d3x3_cutlass(feature, weight, out_buf); + case 65593: + return d3x3_cutlass(feature, weight, out_buf); + case 65594: + return d3x3_cutlass(feature, weight, out_buf); + case 65595: + return d3x3_cutlass(feature, weight, out_buf); + case 65596: + return d3x3_cutlass(feature, weight, out_buf); + case 65597: + return d3x3_cutlass(feature, weight, out_buf); + case 65598: + return d3x3_cutlass(feature, weight, out_buf); + case 65599: + return d3x3_cutlass(feature, weight, out_buf); + case 65600: + return d3x3_cutlass(feature, weight, out_buf); + case 65601: + return d3x3_cutlass(feature, weight, out_buf); + case 65602: + return d3x3_cutlass(feature, weight, out_buf); + case 65603: + return d3x3_cutlass(feature, weight, out_buf); + case 65604: + return d3x3_cutlass(feature, weight, out_buf); + case 65605: + return d3x3_cutlass(feature, weight, out_buf); + case 65606: + return d3x3_cutlass(feature, weight, out_buf); + case 65607: + return d3x3_cutlass(feature, weight, out_buf); + case 65608: + return d3x3_cutlass(feature, weight, out_buf); + case 65609: + return d3x3_cutlass(feature, weight, out_buf); + case 65610: + return d3x3_cutlass(feature, weight, out_buf); + case 65611: + return d3x3_cutlass(feature, weight, out_buf); + case 65612: + return d3x3_cutlass(feature, weight, out_buf); + case 65613: + return d3x3_cutlass(feature, weight, out_buf); + case 65614: + return d3x3_cutlass(feature, weight, out_buf); + case 65615: + return d3x3_cutlass(feature, weight, out_buf); + case 65616: + return d3x3_cutlass(feature, weight, out_buf); + case 65617: + return d3x3_cutlass(feature, weight, out_buf); + case 65618: + return d3x3_cutlass(feature, weight, out_buf); + case 65619: + return d3x3_cutlass(feature, weight, out_buf); + case 65620: + return d3x3_cutlass(feature, weight, out_buf); + case 65621: + return d3x3_cutlass(feature, weight, out_buf); + case 65622: + return d3x3_cutlass(feature, weight, out_buf); + case 65623: + return d3x3_cutlass(feature, weight, out_buf); + case 65624: + return d3x3_cutlass(feature, weight, out_buf); + case 65625: + return d3x3_cutlass(feature, weight, out_buf); + case 65626: + return d3x3_cutlass(feature, weight, out_buf); + case 65627: + return d3x3_cutlass(feature, weight, out_buf); + case 65628: + return d3x3_cutlass(feature, weight, out_buf); + case 65629: + return d3x3_cutlass(feature, weight, out_buf); + case 65630: + return d3x3_cutlass(feature, weight, out_buf); + case 65631: + return d3x3_cutlass(feature, weight, out_buf); + case 65632: + return d3x3_cutlass(feature, weight, out_buf); + case 65633: + return d3x3_cutlass(feature, weight, out_buf); + case 65634: + return d3x3_cutlass(feature, weight, out_buf); + case 65635: + return d3x3_cutlass(feature, weight, out_buf); + case 65636: + return d3x3_cutlass(feature, weight, out_buf); + case 65637: + return d3x3_cutlass(feature, weight, out_buf); + case 65638: + return d3x3_cutlass(feature, weight, out_buf); + case 65639: + return d3x3_cutlass(feature, weight, out_buf); + case 65640: + return d3x3_cutlass(feature, weight, out_buf); + case 65641: + return d3x3_cutlass(feature, weight, out_buf); + case 65642: + return d3x3_cutlass(feature, weight, out_buf); + case 65643: + return d3x3_cutlass(feature, weight, out_buf); + case 65644: + return d3x3_cutlass(feature, weight, out_buf); + case 65645: + return d3x3_cutlass(feature, weight, out_buf); + case 65646: + return d3x3_cutlass(feature, weight, out_buf); + case 65647: + return d3x3_cutlass(feature, weight, out_buf); + case 65648: + return d3x3_cutlass(feature, weight, out_buf); + case 65649: + return d3x3_cutlass(feature, weight, out_buf); + case 65650: + return d3x3_cutlass(feature, weight, out_buf); + case 65651: + return d3x3_cutlass(feature, weight, out_buf); + case 65652: + return d3x3_cutlass(feature, weight, out_buf); + case 65653: + return d3x3_cutlass(feature, weight, out_buf); + case 65654: + return d3x3_cutlass(feature, weight, out_buf); + case 65655: + return d3x3_cutlass(feature, weight, out_buf); + case 65656: + return d3x3_cutlass(feature, weight, out_buf); + case 65657: + return d3x3_cutlass(feature, weight, out_buf); + case 65658: + return d3x3_cutlass(feature, weight, out_buf); + case 65659: + return d3x3_cutlass(feature, weight, out_buf); + case 65660: + return d3x3_cutlass(feature, weight, out_buf); + case 65661: + return d3x3_cutlass(feature, weight, out_buf); + case 65662: + return d3x3_cutlass(feature, weight, out_buf); + case 65663: + return d3x3_cutlass(feature, weight, out_buf); + case 65664: + return d3x3_cutlass(feature, weight, out_buf); + case 65665: + return d3x3_cutlass(feature, weight, out_buf); + case 65666: + return d3x3_cutlass(feature, weight, out_buf); + case 65667: + return d3x3_cutlass(feature, weight, out_buf); + case 65668: + return d3x3_cutlass(feature, weight, out_buf); + case 65669: + return d3x3_cutlass(feature, weight, out_buf); + case 65670: + return d3x3_cutlass(feature, weight, out_buf); + case 65671: + return d3x3_cutlass(feature, weight, out_buf); + case 65672: + return d3x3_cutlass(feature, weight, out_buf); + case 65673: + return d3x3_cutlass(feature, weight, out_buf); + case 65674: + return d3x3_cutlass(feature, weight, out_buf); + case 65675: + return d3x3_cutlass(feature, weight, out_buf); + case 65676: + return d3x3_cutlass(feature, weight, out_buf); + case 65677: + return d3x3_cutlass(feature, weight, out_buf); + case 65678: + return d3x3_cutlass(feature, weight, out_buf); + case 65679: + return d3x3_cutlass(feature, weight, out_buf); + case 65680: + return d3x3_cutlass(feature, weight, out_buf); + case 65681: + return d3x3_cutlass(feature, weight, out_buf); + case 65682: + return d3x3_cutlass(feature, weight, out_buf); + case 65683: + return d3x3_cutlass(feature, weight, out_buf); + case 65684: + return d3x3_cutlass(feature, weight, out_buf); + case 65685: + return d3x3_cutlass(feature, weight, out_buf); + case 65686: // default cutlass hint for sm80 + return d3x3_cutlass(feature, weight, out_buf); + default: + assert(false); + } + } + + assert(sm == 75); + return d3x3_cutlass(feature, weight, out_buf); +} + +__forceinline__ auto d3x3_launch_helper(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& out_buf, + std::unordered_map& map, + const std::string& map_name) +{ + if (sm == 75) { + return d3x3_launch_switcher(sm, feature, weight, out_buf, -1); + } + const int C = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const uint64_t key = conv_key(sm, W, H, C, C, 0, 0); + int best_hint = -1; + auto it = map.find(key); + if (it == map.end()) { + return d3x3_launch_switcher(sm, feature, weight, out_buf, + CUTLASS_START_INDEX + HINT_NUM_CUTLASS - 1); + } else { + best_hint = it->second; + } + return d3x3_launch_switcher(sm, feature, weight, out_buf, best_hint); +} diff --git a/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_epilogue.h b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_epilogue.h new file mode 100644 index 0000000..d93b0ff --- /dev/null +++ b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_epilogue.h @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +// clang-format on + +#include "sm90_epilogue_tma_warpspecialized_quad.h" + +/** + * These 2 classes/structs are rewritten: + * 1. cutlass::epilogue::collective::detail::Sm90TmaBuilderImpl -> QuadSm90TmaBuilderImpl + * 2. cutlass::epilogue::collective::CollectiveBuilder -> QuadCollectiveBuilderEpilogue + */ + +// Original file: cutlass/epilogue/collective/builders/sm90_builder.inl +// to define QuadCollectiveEpilogue as CollectiveOp +// Helper for building TMA warp-specialized collective epilogues, specialized by +// the fusion operation performed and the dispatch policy to use. +template +struct QuadSm90TmaBuilderImpl { + // C/D should meet TMA alignment requirement if not void + static_assert( + cutlass::epilogue::collective::detail::is_aligned(), + "C/D Should meet TMA alignment requirement\n"); + // Passing void D disables destination store + smem allocation + using ElementD = + cute::conditional_t, + cutlass::epilogue::fusion::get_element_aux_t, ElementD_>; + + // Passing void C disables source load + smem allocation + using ElementC = + cute::conditional_t, ElementD, ElementC_>; // prevents void ref breakages + using GmemLayoutTagC = + cute::conditional_t, GmemLayoutTagD, GmemLayoutTagC_>; + + using GmemStrideTypeC = cutlass::detail::TagToStrideC_t; + using GmemStrideTypeD = cutlass::detail::TagToStrideC_t; + + using UnderlyingGmemStrideTypeC = cute::remove_pointer_t; + using UnderlyingGmemStrideTypeD = cute::remove_pointer_t; + + using CopyOpS2G = + cute::conditional_t, + cute::SM90_TMA_STORE_IM2COL, cute::SM90_TMA_STORE>; + using CopyOpG2S = + cute::conditional_t, + cute::SM90_TMA_LOAD_IM2COL, cute::SM90_TMA_LOAD>; + + // Get the smallest tiled copy we can use to retile the accumulators + // using CopyAtomC = Copy_Atom; + using CopyAtomC = cute::conditional_t< + cute::size<1>(EpilogueTile_MN{}) % 16 == 0, cute::Copy_Atom, + cute::conditional_t(EpilogueTile_MN{}) % 8 == 0, + cute::Copy_Atom, void>>; + static_assert(!cute::is_same_v, + "CopyAtomC can't be void, divisiblity check for EpilogueTile_MN failed"); + // Get register to register tiled copy that happen before shared memory store. + // Apply void as no register transform op needed currently. + using CopyOpR2R = void; + + // TMA builder allows for passing callbacks directly, which is either a cutlass::epilogue::fusion::FusionCallbacks + // instance or a direct visitor implementation, e.g. cutlass::epilogue::fusion::Sm90LinearCombination + using FusionCallbacks = typename cutlass::epilogue::collective::detail::CallbacksBuilder< + DispatchPolicy, FusionOpOrCallbacks, TileShape_MNK, EpilogueTile_MN, ElementAccumulator>::Callbacks; + + using CollectiveOp = QuadCollectiveEpilogue< + DispatchPolicy, TileShape_MNK, EpilogueTile_MN, + ElementC_, // Need to pass void through to expose via QuadGemmUniversal + GmemStrideTypeC, ElementD_, GmemStrideTypeD, FusionCallbacks, CopyOpG2S, + decltype(cutlass::epilogue::collective::detail::sm90_get_epilogue_smem_swizzle_layout_atom< + UnderlyingGmemStrideTypeC, ElementC, EpilogueTile_MN>()), + decltype(cutlass::epilogue::collective::detail::sm90_get_smem_load_op_for_source< + UnderlyingGmemStrideTypeC, ElementC, EpilogueTile_MN>()), + CopyOpS2G, + decltype(cutlass::epilogue::collective::detail::sm90_get_epilogue_smem_swizzle_layout_atom< + UnderlyingGmemStrideTypeD, ElementD, EpilogueTile_MN>()), + decltype(cutlass::epilogue::collective::detail::sm90_get_smem_store_op_for_accumulator< + UnderlyingGmemStrideTypeD, ElementD, EpilogueTile_MN>()), + CopyAtomC, CopyOpR2R>; +}; + +// Primary template declaration to enable partial/specialized definitions below. +template , + class Enable = void> +struct QuadCollectiveBuilderEpilogue { + static_assert(cutlass::detail::dependent_false, + "Could not build a collective epilogue for given parameters."); +}; + +// Original file: cutlass/epilogue/collective/builders/sm90_builder.inl +// to define QuadSm90TmaBuilderImpl as CollectiveOp +// Tma warp-specialized builder +template +struct QuadCollectiveBuilderEpilogue< + cutlass::arch::Sm90, OpClass, TileShape_MNK, ClusterShape_MNK, EpilogueTileType, ElementAccumulator, ElementCompute, + ElementC, GmemLayoutTagC, AlignmentC, ElementD_, GmemLayoutTagD, AlignmentD, Schedule, FusionOperation, + cute::enable_if_t>> { +private: + using ElementD = + cute::conditional_t, + cutlass::epilogue::fusion::get_element_aux_t, ElementD_>; + using EpilogueTile_MN = + decltype(cutlass::epilogue::collective::detail::sm90_compute_tile_shape_or_override< + ElementD, EpilogueTileType, Schedule, TileShape_MNK>()); + using DispatchPolicy = decltype(cutlass::epilogue::collective::detail::sm90_get_tma_dispatch_policy< + TileShape_MNK, EpilogueTile_MN, ElementC, ElementD, Schedule>()); + +public: + using CollectiveOp = + typename QuadSm90TmaBuilderImpl::CollectiveOp; +}; diff --git a/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_mainloop.h b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_mainloop.h new file mode 100644 index 0000000..26b8d24 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_builder_mainloop.h @@ -0,0 +1,112 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +// clang-format on + +#include "sm90_mma_tma_gmma_ss_warpspecialized_quad.h" + +/** + * These 1 classes/structs are rewritten: + * 1. cutlass::gemm::collective::CollectiveBuilder -> QuadCollectiveBuilderMainloop + */ + +// SM90 Collective Builders should be used only starting CUDA 12.0 +#if (__CUDACC_VER_MAJOR__ >= 12) + #define CUTLASS_SM90_COLLECTIVE_BUILDER_SUPPORTED +#endif + +// Primary template declaration to enable partial/specialized definitions below. +template +struct QuadCollectiveBuilderMainloop { + static_assert(sizeof(ElementA) == 0, + "QuadCollectiveBuilderMainloop: unsupported configuration."); +}; + +// Original file: cutlass/gemm/collective/builders/sm90_gmma_builder.inl +// to define QuadCollectiveMma as CollectiveOp +// GMMA_TMA_WS_SS +template +struct QuadCollectiveBuilderMainloop< + cutlass::arch::Sm90, cutlass::arch::OpClassTensorOp, ElementA, GmemLayoutATag, AlignmentA, ElementB, + GmemLayoutBTag, AlignmentB, ElementAccumulator, TileShape_MNK, ClusterShape_MNK, StageCountType, KernelScheduleType, + cute::enable_if_t<(cute::is_same_v) + && not cutlass::gemm::collective::detail::is_use_rmem_A< + ElementA, GmemLayoutATag, ElementB, GmemLayoutBTag>()>> { + static_assert(cute::is_static::value); + static_assert(cute::is_static::value); +#ifndef CUTLASS_SM90_COLLECTIVE_BUILDER_SUPPORTED + static_assert(cutlass::detail::dependent_false, + "Unsupported Toolkit for SM90 Collective Builder\n"); +#endif + static_assert( + cutlass::gemm::collective::detail::is_aligned(), + "Should meet TMA alignment requirement\n"); + + using ElementAMma = + cute::conditional_t, cutlass::tfloat32_t, ElementA>; + using ElementBMma = + cute::conditional_t, cutlass::tfloat32_t, ElementB>; + + static constexpr cute::GMMA::Major GmmaMajorA = + cutlass::gemm::collective::detail::gmma_ss_tag_to_major_A(); + static constexpr cute::GMMA::Major GmmaMajorB = + cutlass::gemm::collective::detail::gmma_ss_tag_to_major_B(); + + static constexpr bool IsCooperative = + cute::is_same_v; + using AtomLayoutMNK = + cute::conditional_t>, + cute::Layout>>; + + using TiledMma = decltype(cute::make_tiled_mma( + cute::GMMA::ss_op_selector(), + AtomLayoutMNK{})); + + using GmemTiledCopyA = decltype(cutlass::gemm::collective::detail::sm90_cluster_shape_to_tma_atom( + cute::shape<1>(ClusterShape_MNK{}))); + using GmemTiledCopyB = decltype(cutlass::gemm::collective::detail::sm90_cluster_shape_to_tma_atom( + cute::shape<0>(ClusterShape_MNK{}))); + + using SmemLayoutAtomA = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + GmmaMajorA, ElementAMma, decltype(cute::get<0>(TileShape_MNK{})), + decltype(cute::get<2>(TileShape_MNK{}))>()); + using SmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + GmmaMajorB, ElementBMma, decltype(cute::get<1>(TileShape_MNK{})), + decltype(cute::get<2>(TileShape_MNK{}))>()); + + static constexpr size_t TensorMapStorage = 0; + static constexpr size_t SchedulerPipelineStorage = + cute::is_pointer_v> + ? sizeof(cutlass::PipelineDetail::PipelineAsyncSharedStorage<8>) + : 0; + static constexpr int KernelSmemCarveout = + static_cast(TensorMapStorage + SchedulerPipelineStorage); + static constexpr int Sm90ReducedSmemCapacityBytes = + cutlass::gemm::collective::detail::sm90_smem_capacity_bytes - KernelSmemCarveout; + + static constexpr int PipelineStages = + cutlass::gemm::collective::detail::compute_stage_count_or_override< + Sm90ReducedSmemCapacityBytes, ElementAMma, ElementBMma, TileShape_MNK>(StageCountType{}); + + using DispatchPolicy = + cutlass::gemm::MainloopSm90TmaGmmaWarpSpecialized; + + using SmemCopyAtomA = void; + using SmemCopyAtomB = void; + + using CollectiveOp = QuadCollectiveMma< + DispatchPolicy, TileShape_MNK, ElementA, cutlass::detail::TagToStrideA_t, ElementB, + cutlass::detail::TagToStrideB_t, TiledMma, GmemTiledCopyA, SmemLayoutAtomA, + SmemCopyAtomA, cute::identity, GmemTiledCopyB, SmemLayoutAtomB, SmemCopyAtomB, cute::identity>; +}; diff --git a/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_epilogue_tma_warpspecialized_quad.h b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_epilogue_tma_warpspecialized_quad.h new file mode 100644 index 0000000..f07db07 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_epilogue_tma_warpspecialized_quad.h @@ -0,0 +1,992 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +// clang-format on + +/** + * These 1 classes/structs are rewritten: + * 1. cutlass::epilogue::collective::CollectiveEpilogue -> QuadCollectiveEpilogue + */ + +template +struct QuadAddOp; + +template +struct QuadAddOp> { + static const bool kIsHeavy = true; + + CUTLASS_HOST_DEVICE + cutlass::Array operator()(cutlass::Array const& accum0, + cutlass::Array const& accum1, + cutlass::Array const& accum2, + cutlass::Array const& accum3) const + { + cutlass::plus> plus_op; + return plus_op(plus_op(plus_op(accum0, accum1), accum2), accum3); + } +}; + +// Primary template declaration to enable partial/specialized definitions below. +template +class QuadCollectiveEpilogue { + static_assert(cutlass::detail::dependent_false, + "Could not find an epilogue specialization."); +}; + +// Original file: cutlass/epilogue/collective/sm90_epilogue_tma_warpspecialized.hpp +// to define QuadCollectiveEpilogue as CollectiveOp +template +class QuadCollectiveEpilogue< + cutlass::epilogue::Sm90TmaWarpSpecialized, + CtaTileMNK_, EpilogueTile_, ElementC_, StrideC_, ElementD_, StrideD_, FusionCallbacks_, CopyOpG2S_, + SmemLayoutAtomC_, CopyOpS2R_, CopyOpS2G_, SmemLayoutAtomD_, CopyOpR2S_, CopyAtomC_, CopyOpR2R_> { +public: + // + // Type Aliases + // + using DispatchPolicy = + cutlass::epilogue::Sm90TmaWarpSpecialized; + using CtaTileMNK = CtaTileMNK_; + using EpilogueTile = EpilogueTile_; + using FusionCallbacks = FusionCallbacks_; + using ElementC = ElementC_; + using StrideC = StrideC_; + using ElementD = ElementD_; + using StrideD = StrideD_; + using CopyOpG2S = CopyOpG2S_; + using SmemLayoutAtomC = SmemLayoutAtomC_; + using CopyOpS2R = CopyOpS2R_; + using CopyOpS2G = CopyOpS2G_; + using SmemLayoutAtomD = SmemLayoutAtomD_; + using CopyOpR2S = CopyOpR2S_; + using CopyAtomC = CopyAtomC_; + using CopyOpR2R = CopyOpR2R_; + + using ThreadEpilogueOp = + typename cutlass::epilogue::fusion::FusionCallbacksTraits::Operation; + using GmemTiledCopyC = CopyOpG2S; + using GmemTiledCopyD = CopyOpS2G; + + static_assert(!cute::is_layout::value && cutlass::is_tuple::value, + "EpilogueTile must be a cute::Tile or cute::Shape"); + static_assert(cute::rank(CtaTileMNK{}) == 3, + "CtaTileMNK must be rank-3: [CTA_M, CTA_N, CTA_K]"); + static_assert(cute::rank(EpilogueTile{}) == 2, + "EpilogueTile must be rank-2: [EPI_TILE_M, EPI_TILE_N]"); + static_assert(cute::size<0>(CtaTileMNK{}) % cute::size<0>(cute::shape(EpilogueTile{})) == 0, + "EPI_TILE_M must divide CTA_M"); + static_assert(cute::size<1>(CtaTileMNK{}) % cute::size<1>(cute::shape(EpilogueTile{})) == 0, + "EPI_TILE_N must divide CTA_N"); + static_assert(cute::rank(StrideC{}) == 3, "StrideC must be rank-3: [M, N, L]"); + static_assert(cute::rank(StrideD{}) == 3, "StrideD must be rank-3: [M, N, L]"); + +private: + constexpr static bool is_source_supported = not cute::is_void_v; + constexpr static bool is_destination_supported = not cute::is_void_v; + using NonVoidElementD = + cute::conditional_t, ElementD>; + static_assert(not cute::is_void_v, "SmemElementD is void"); + using NonVoidElementC = cute::conditional_t; // prevents void ref breakages + + using TmaElementD = + cute::conditional_t>, uint64_t, NonVoidElementD>; + using TmaElementC = + cute::conditional_t>, uint64_t, NonVoidElementC>; + + using SmemElementC = typename cutlass::detail::get_unpacked_element_type::type; + using SmemElementD = typename cutlass::detail::get_unpacked_element_type::type; + + constexpr static int StagesC = StagesC_; + constexpr static int StagesD = StagesD_; + constexpr static bool ReuseSmemC = ReuseSmemC_ and is_destination_supported; + constexpr static bool DelayTmaStore = DelayTmaStore_; + + constexpr static bool is_m_major_C = cutlass::epilogue::collective::detail::is_m_major(); + constexpr static bool is_m_major_D = cutlass::epilogue::collective::detail::is_m_major(); + + constexpr static bool is_im2col_C = cute::is_same_v; + constexpr static bool is_im2col_D = cute::is_same_v; + + // Check if register transformation is needed before copying register to shared memory. + constexpr static bool IsUseR2R = !cute::is_void_v; + + using SmemLayoutC = decltype(cute::tile_to_shape( + SmemLayoutAtomC{}, + cute::make_shape(cute::size<0>(EpilogueTile{}), cute::size<1>(EpilogueTile{}), + cute::Int{}), + cute::conditional_t, + cute::Step>{})); + using SmemLayoutD = decltype(cute::tile_to_shape( + SmemLayoutAtomD{}, + cute::make_shape(cute::size<0>(EpilogueTile{}), cute::size<1>(EpilogueTile{}), + cute::Int{}), + cute::conditional_t, + cute::Step>{})); + + constexpr static bool support_smem_reuse = + is_source_supported && is_destination_supported && StagesD <= StagesC + && cute::cosize(cute::take<0, 2>(SmemLayoutC{})) + == cute::cosize(cute::take<0, 2>(SmemLayoutD{})); + static_assert(not(ReuseSmemC && not support_smem_reuse), "Smem reuse requirements not met"); + + constexpr static size_t SmemAlignmentD = cutlass::detail::alignment_for_swizzle(SmemLayoutD{}); + constexpr static size_t SmemAlignmentC = cutlass::detail::alignment_for_swizzle(SmemLayoutC{}); + constexpr static size_t MaxSmemAlignment = cute::max(SmemAlignmentC, SmemAlignmentD); + + using SmemArrayTypeC = cute::ArrayEngine>; + using SmemArrayTypeD = cute::ArrayEngine>; + + using EmptyType = cute::tuple<>; + using SmemCStorage = + cute::conditional_t; + using SmemDStorage = cute::conditional_t; + + struct CollectiveStorageWithC { + alignas(SmemAlignmentC) cute::ArrayEngine> smem_C; + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D; + }; + + union CollectiveStorageWithoutC { + cute::array smem_C; + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D; + }; + + union CollectiveStorageReuseC { + alignas(MaxSmemAlignment) cute::ArrayEngine> smem_C; + alignas(MaxSmemAlignment) cute::ArrayEngine> smem_D; + }; + +public: + // TMA pipeline for loading C + using LoadPipeline = cutlass::PipelineTransactionAsync; + using LoadPipelineState = cutlass::PipelineState; + constexpr static uint32_t TmaTransactionBytes = + (cute::size(cute::take<0, 2>(SmemLayoutC{})) + * static_cast(cutlass::sizeof_bits::value)) + / 8; + constexpr static bool RequiresTransactionBytes = true; + + // TMA pipeline for storing D + using StorePipeline = + cute::conditional_t, + cutlass::PipelineTmaStore>; + using StorePipelineState = cutlass::PipelineState; + + struct SharedStorage { + struct TensorStorage { + using CollectiveStorage = + cute::conditional_t>; + CollectiveStorage collective; + + using FusionStorage = typename FusionCallbacks::SharedStorage; + FusionStorage thread0; + FusionStorage thread1; + FusionStorage thread2; + FusionStorage thread3; + } tensors; + + using PipelineStorage = typename LoadPipeline::SharedStorage; + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using PipelineStorage = typename SharedStorage::PipelineStorage; + + // Host side epilogue arguments + struct Arguments { + typename FusionCallbacks::Arguments thread0{}; + typename FusionCallbacks::Arguments thread1{}; + typename FusionCallbacks::Arguments thread2{}; + typename FusionCallbacks::Arguments thread3{}; + ElementC const* ptr_C; + StrideC dC; + ElementD const* ptr_D; + StrideD dD; + }; + + // Device side epilogue params + struct Params { + using TMA_C = decltype(cute::make_tma_copy( + CopyOpG2S{}, + cute::make_tensor(cute::make_gmem_ptr(nullptr), + cute::repeat_like(StrideC{}, int32_t(0)), StrideC{}), + cute::take<0, 2>(SmemLayoutC{}), EpilogueTile{}, cute::_1{})); + using TMA_D = decltype(cute::make_tma_copy( + CopyOpS2G{}, + cute::make_tensor(cute::make_gmem_ptr(nullptr), + cute::repeat_like(StrideD{}, int32_t(0)), StrideD{}), + cute::take<0, 2>(SmemLayoutD{}), EpilogueTile{}, cute::_1{})); + + typename FusionCallbacks::Params thread0{}; + typename FusionCallbacks::Params thread1{}; + typename FusionCallbacks::Params thread2{}; + typename FusionCallbacks::Params thread3{}; + TMA_C tma_load_c; + TMA_D tma_store_d; + uint32_t tma_transaction_bytes = TmaTransactionBytes; + }; + + // + // Methods + // + + CUTLASS_HOST_DEVICE + QuadCollectiveEpilogue(Params const& params_, TensorStorage& shared_tensors) + : params(params_) + , fusion_callbacks0(params_.thread0, shared_tensors.thread0) + , fusion_callbacks1(params_.thread1, shared_tensors.thread1) + , fusion_callbacks2(params_.thread2, shared_tensors.thread2) + , fusion_callbacks3(params_.thread3, shared_tensors.thread3) + { + } + + template + static bool can_implement(ProblemShape const& problem_shape, [[maybe_unused]] Arguments const& args) + { + auto problem_shape_MNKL = cute::append<4>(problem_shape, 1); + auto [M, N, K, L] = problem_shape_MNKL; + auto shape = cute::make_shape(M, N, L); + + bool implementable = true; + if constexpr (is_destination_supported) { + constexpr int tma_alignment_bits_D = + cutlass::detail::get_output_alignment_bits(); + constexpr int min_tma_aligned_elements_D = + tma_alignment_bits_D / cutlass::sizeof_bits::value; + if constexpr (cute::is_same_v) { // ignore L stride for implicit gemm + implementable = cutlass::detail::check_alignment( + cute::take<0, 2>(shape), cute::take<0, 2>(StrideD{})); + } else { + implementable = + cutlass::detail::check_alignment(shape, StrideD{}); + } + } + + if constexpr (not cute::is_void_v) { + constexpr int tma_alignment_bits_C = cutlass::detail::get_input_alignment_bits(); + constexpr int min_tma_aligned_elements_C = + tma_alignment_bits_C / cutlass::sizeof_bits::value; + if constexpr (cute::is_same_v) { // ignore L stride for implicit gemm + implementable = implementable + && cutlass::detail::check_alignment( + cute::take<0, 2>(shape), cute::take<0, 2>(StrideC{})); + } else { + implementable = + implementable + && cutlass::detail::check_alignment(shape, StrideC{}); + } + } + + if (!implementable) { + CUTLASS_TRACE_HOST( + " CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for " + "TMA.\n"); + } + + bool fusion_implementable = true; + ; + fusion_implementable = + fusion_implementable && FusionCallbacks::can_implement(problem_shape, args.thread0); + fusion_implementable = + fusion_implementable && FusionCallbacks::can_implement(problem_shape, args.thread1); + fusion_implementable = + fusion_implementable && FusionCallbacks::can_implement(problem_shape, args.thread2); + fusion_implementable = + fusion_implementable && FusionCallbacks::can_implement(problem_shape, args.thread3); + + if (!fusion_implementable) { + CUTLASS_TRACE_HOST( + " CAN IMPLEMENT: Problem Size doesn't meet the minimum requirements for " + "FusionCallbacks.\n"); + } + + return implementable && fusion_implementable; + } + + template + CUTLASS_HOST_DEVICE static constexpr int get_load_pipe_increment(TileShapeMNK tile_shape_MNK) + { + // Compute number of epilogue subtiles + return cute::size<1>( + zipped_divide(cute::make_layout(cute::take<0, 2>(tile_shape_MNK)), EpilogueTile{})); + } + + template + CUTLASS_HOST_DEVICE static constexpr int get_store_pipe_increment(TileShapeMNK tile_shape_MNK) + { + return get_load_pipe_increment(tile_shape_MNK); + } + + template + static size_t get_workspace_size(ProblemShape const& problem_shape, Arguments const& args) + { + return 0; + } + + template + static cutlass::Status initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, + void* workspace, cudaStream_t stream, + cutlass::CudaHostAdapter* cuda_adapter = nullptr) + { + return cutlass::Status::kSuccess; + } + + CUTLASS_DEVICE + bool is_producer_load_needed() const { return fusion_callbacks0.is_producer_load_needed(); } + + template + CUTLASS_DEVICE auto load(LoadPipeline load_pipeline, LoadPipelineState load_pipe_producer_state, + ProblemShapeMNKL problem_shape_mnkl, TileShapeMNK tile_shape_MNK, + TileCoordMNKL tile_coord_mnkl, TiledMma tiled_mma, int thread_idx, + TensorStorage& shared_tensors, int subtile_idx = -1) + { + // Indexing variables + auto [M, N, K, L] = problem_shape_mnkl; + auto [m_coord, n_coord, k_coord, l_coord] = tile_coord_mnkl; + + // The tma tensor C under im2col mode only has two modes (M, N) which + // should be local tiled with only (m_coord, n_coord). + auto coord_shape = cute::conditional_return( + cute::make_coord(m_coord, n_coord), cute::make_coord(m_coord, n_coord, l_coord)); + + // Represent the full source tensor, slice to get the tile this CTA is currently responsible for + cute::Tensor mC_mn = params.tma_load_c.get_tma_tensor(cute::make_shape(M, N, L)); // (M,N,L) + cute::Tensor mC = cute::coalesce(mC_mn, cute::take<0, 2>(CtaTileMNK{})); + cute::Tensor gC = + cute::local_tile(mC, cute::take<0, 2>(CtaTileMNK{}), coord_shape); // (CTA_M,CTA_N) + + // Apply epilogue subtile, get matching smem tensor + auto ptr_sC = shared_tensors.collective.smem_C.begin(); + cute::Tensor gC_epi = cute::flat_divide(gC, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + cute::Tensor sC_epi = cute::make_tensor(cute::make_smem_ptr(ptr_sC), + SmemLayoutC{}); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + + // Prepare the thread(b)lock's (G)mem to (S)mem TMA tiled copy (bGS_) + cute::ThrCopy thrblk_g2s = params.tma_load_c.get_slice(cute::_0{}); + cute::Tensor bGS_gC = thrblk_g2s.partition_S(gC_epi); // (G2S,G2S_M,G2S_N,EPI_M,EPI_N) + cute::Tensor bGS_sC = thrblk_g2s.partition_D(sC_epi); // (G2S,G2S_M,G2S_N,PIPE_C) + + // Get the fusion callbacks for the producer load warp + auto pld_args = cutlass::epilogue::fusion::detail::ProducerLoadArgs( + problem_shape_mnkl, CtaTileMNK{}, tile_coord_mnkl, tiled_mma, EpilogueTile{}, thread_idx); + auto pld_callbacks = fusion_callbacks0.get_producer_load_callbacks(pld_args); + bool is_C_load_needed = is_source_supported && fusion_callbacks0.is_C_load_needed(); + + // Predication for TMA load (one thread issues TMA load) + bool issue_tma_load = cute::elect_one_sync(); + + // Pre-loop fusion callback entry point + pld_callbacks.begin(); + + CUTLASS_PRAGMA_UNROLL + for (int epi_n = 0; epi_n < cute::size<3>(gC_epi); ++epi_n) { + CUTLASS_PRAGMA_UNROLL + for (int epi_m = 0; epi_m < cute::size<2>(gC_epi); ++epi_m) { + if (subtile_idx != -1 + && (epi_n * static_cast(cute::size<2>(gC_epi)) + epi_m) != subtile_idx) { + continue; + } + // Acquire the lock for this stage + constexpr uint16_t mcast_mask = 0; + uint64_t* tma_barrier = load_pipeline.producer_get_barrier(load_pipe_producer_state); + load_pipeline.producer_acquire(load_pipe_producer_state); + + // Loop fusion callback entry point + pld_callbacks.step(tma_barrier, epi_m, epi_n, load_pipe_producer_state.count(), + issue_tma_load); + + // Execute the TMA load for C if needed + if (issue_tma_load && is_C_load_needed) { + cute::copy(params.tma_load_c.with(*tma_barrier, mcast_mask), + bGS_gC(cute::_, cute::_, cute::_, epi_m, epi_n), + bGS_sC(cute::_, cute::_, cute::_, load_pipe_producer_state.index())); + load_pipeline.producer_expect_transaction(load_pipe_producer_state); + } + + // Commit TMA loads for this stage and release the lock + load_pipeline.producer_commit(load_pipe_producer_state); + ++load_pipe_producer_state; + } + } + + // Post-loop fusion callback entry point + pld_callbacks.end(); + + return load_pipe_producer_state; + } + + CUTLASS_DEVICE auto load_tail(LoadPipeline load_pipeline, LoadPipelineState load_pipe_producer_state) + { + bool issue_tma_load = cute::elect_one_sync(); + if (issue_tma_load) { + load_pipeline.producer_tail(load_pipe_producer_state); + } + + return load_pipe_producer_state; + } + + template + CUTLASS_DEVICE auto + store(LoadPipeline load_pipeline, LoadPipelineState load_pipe_consumer_state, + StorePipeline store_pipeline, StorePipelineState store_pipe_producer_state, + ProblemShapeMNKL problem_shape_mnkl, TileShapeMNK tile_shape_MNK, + TileCoordMNKL tile_coord_mnkl, cute::Tensor accumulators0, + cute::Tensor accumulators1, + cute::Tensor accumulators2, + cute::Tensor accumulators3, TiledMma tiled_mma, int thread_idx, + TensorStorage& shared_tensors, int subtile_idx = -1) + { + using ElementAccumulator = typename AccEngine::value_type; + using ElementCompute_ = + typename cutlass::epilogue::fusion::FusionCallbacksTraits::ElementCompute; + using ElementCompute = + cute::conditional_t, ElementAccumulator, ElementCompute_>; + + static_assert(cute::is_rmem::value, "Accumulator must be RF resident."); + static_assert(cute::rank(AccLayout{}) == 3, + "Accumulator must be MMA-partitioned: (MMA,MMA_M,MMA_N)"); + static_assert(cute::rank(ProblemShapeMNKL{}) == 4, "ProblemShapeMNKL must be rank 4"); + static_assert(cute::is_static::value, "TileShapeMNK must be static"); + static_assert(cute::rank(TileShapeMNK{}) == 3, "TileShapeMNK must be rank 3"); + static_assert(cute::rank(TileCoordMNKL{}) == 4, "TileCoordMNKL must be rank 4"); + + // Indexing variables + auto [M, N, K, L] = problem_shape_mnkl; + auto [m_coord, n_coord, k_coord, l_coord] = tile_coord_mnkl; + + // The tma tensor D under im2col mode only has two modes (M, N) which + // should be local tiled with only (m_coord, n_coord). + auto coord_shape = cute::conditional_return( + cute::make_coord(m_coord, n_coord), cute::make_coord(m_coord, n_coord, l_coord)); + + // Represent the full output tensor, slice to get the tile this CTA is responsible for + cute::Tensor mD_mn = params.tma_store_d.get_tma_tensor(cute::make_shape(M, N, L)); // (M,N,L) + cute::Tensor mD = cute::coalesce(mD_mn, cute::take<0, 2>(CtaTileMNK{})); + cute::Tensor gD = + cute::local_tile(mD, cute::take<0, 2>(CtaTileMNK{}), coord_shape); // (CTA_M,CTA_N) + + // Apply epilogue subtiling + cute::Tensor gD_epi = cute::flat_divide(gD, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + // Construct the corresponding pipelined smem tensors + auto ptr_sC = shared_tensors.collective.smem_C.begin(); + auto ptr_sD = shared_tensors.collective.smem_D.begin(); + cute::Tensor sC_epi = cute::as_position_independent_swizzle_tensor(cute::make_tensor( + cute::make_smem_ptr(ptr_sC), SmemLayoutC{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + cute::Tensor sD_epi = cute::as_position_independent_swizzle_tensor(cute::make_tensor( + cute::make_smem_ptr(ptr_sD), SmemLayoutD{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + + cute::TiledCopy tiled_copy_C_atom = cute::make_tiled_copy_C_atom(CopyAtomC{}, tiled_mma); + + // (t)hread-partition for (r)egister to (r)egister copy (tRR_) + cute::TiledCopy tiled_r2r = [&]() CUTLASS_LAMBDA_FUNC_INLINE { + if constexpr (IsUseR2R) { + return cute::make_tiled_copy_S(cute::Copy_Atom{}, + tiled_copy_C_atom); + } else { + return cute::make_tiled_copy_S( + cute::Copy_Atom, ElementCompute>{}, + tiled_copy_C_atom); + } + }(); + cute::ThrCopy thread_r2r = tiled_r2r.get_slice(thread_idx); + + // (t)hread-partition for (r)egister to (s)mem copy (tRS_) + cute::TiledCopy tiled_r2s = [&]() CUTLASS_LAMBDA_FUNC_INLINE { + if constexpr (IsUseR2R) { + return cute::make_tiled_copy_D(cute::Copy_Atom{}, tiled_r2r); + } else { + return cute::make_tiled_copy_S(cute::Copy_Atom{}, + tiled_copy_C_atom); + } + }(); + cute::ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + cute::Tensor tRS_rAcc0 = thread_r2s.retile_S(accumulators0); // ((R2S,R2S_V),MMA_M,MMA_N) + cute::Tensor tRS_rAcc1 = thread_r2s.retile_S(accumulators1); // ((R2S,R2S_V),MMA_M,MMA_N) + cute::Tensor tRS_rAcc2 = thread_r2s.retile_S(accumulators2); // ((R2S,R2S_V),MMA_M,MMA_N) + cute::Tensor tRS_rAcc3 = thread_r2s.retile_S(accumulators3); // ((R2S,R2S_V),MMA_M,MMA_N) + + cute::Tensor tRS_sD = thread_r2s.partition_D(sD_epi); // (R2S,R2S_M,R2S_N,PIPE_D) + + auto mma_tile_m = cute::size<0>(TileShapeMNK{}) / cute::size<1>(tRS_rAcc0); + auto mma_tile_n = cute::size<1>(TileShapeMNK{}) / cute::size<2>(tRS_rAcc0); + auto epi_tile_m = cute::size<0>(EpilogueTile{}); + auto epi_tile_n = cute::size<1>(EpilogueTile{}); + + // Allocate D registers + cute::Layout tRS_rD_layout = + cute::make_layout(cute::take<0, 3>(cute::shape(thread_r2s.partition_S(sD_epi)))); + cute::Tensor tRS_rD = cute::make_tensor(tRS_rD_layout); // (R2S,R2S_M,R2S_N) + + // Vectorized fragment view + constexpr int FragmentSize = DispatchPolicy::FragmentSize; + cute::Tensor tRS_rAcc_frg0 = + cute::recast>(tRS_rAcc0); + cute::Tensor tRS_rAcc_frg1 = + cute::recast>(tRS_rAcc1); + cute::Tensor tRS_rAcc_frg2 = + cute::recast>(tRS_rAcc2); + cute::Tensor tRS_rAcc_frg3 = + cute::recast>(tRS_rAcc3); + + cute::Tensor tRS_rD_frg = cute::recast>(tRS_rD); + CUTE_STATIC_ASSERT(cute::size<0>(tRS_rAcc0) % FragmentSize == 0, + "Fragment size does not vectorize properly"); + + // (t)hread-partition for (s)mem to (r)egister copy (tSR_) + cute::TiledCopy tiled_s2r = + cute::make_tiled_copy_S(cute::Copy_Atom{}, tiled_copy_C_atom); + cute::ThrCopy thread_s2r = tiled_s2r.get_slice(thread_idx); + cute::Tensor tSR_sC = thread_s2r.partition_S(sC_epi); // (S2R,S2R_M,S2R_N,PIPE_C) + cute::Layout tSR_rC_layout = thread_s2r.retile_D(tRS_rD).layout(); // (S2R,S2R_M,S2R_N) + + // Allocate C registers + // If C smem load is a non-vectorized dst(i) = src(i) then we can allocate C registers directly in the compute type + // to eliminate some redundant pack+unpack instruction sequences for sub-word types + constexpr bool IsDirectS2R = + cute::is_same_v> + && decltype(cute::max_common_vector(tSR_rC_layout, tSR_sC.layout()))::value <= 1; + using RegisterElementC = cute::conditional_t; + cute::Tensor tRS_rC = cute::make_tensor(tRS_rD_layout); // (R2S,R2S_M,R2S_N) + cute::Tensor tSR_rC = thread_s2r.retile_D(tRS_rC); // (S2R,S2R_M,S2R_N) + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + cute::ThrCopy thrblk_s2g = params.tma_store_d.get_slice(cute::_0{}); + cute::Tensor bSG_sD = thrblk_s2g.partition_S(sD_epi); // (S2G,S2G_M,S2G_N,PIPE_D) + cute::Tensor bSG_gD = thrblk_s2g.partition_D(gD_epi); // (S2G,S2G_M,S2G_N,EPI_M,EPI_N) + + // OOB predication for tile quantization "residue" + // Absolute coordinate tensors (dynamic) + cute::Tensor mD_crd = cute::make_identity_tensor(cute::make_shape(M, N)); // (M,N) + cute::Tensor cD_mn = cute::local_tile(mD_crd, cute::take<0, 2>(CtaTileMNK{}), + cute::make_coord(m_coord, n_coord)); // (CTA_M,CTA_N) + cute::Tensor tRS_cD_mn = [&]() CUTLASS_LAMBDA_FUNC_INLINE { + if constexpr (IsUseR2R) { + // (t)hread-partition for ConsumerStoreCallbacks. + cute::TiledCopy tiled_cst = cute::make_tiled_copy_S( + cute::Copy_Atom{}, tiled_copy_C_atom); + cute::ThrCopy thread_cst = tiled_cst.get_slice(thread_idx); + return thread_cst.partition_S( + cute::flat_divide(cD_mn, EpilogueTile{})); // (R2S,R2S_M,R2S_N,EPI_M,EPI_N) + } else { + return thread_r2s.partition_S( + cute::flat_divide(cD_mn, EpilogueTile{})); // (R2S,R2S_M,R2S_N,EPI_M,EPI_N) + } + }(); + // Relative coordinate tensors (static) + cute::Tensor cD = cute::make_coord_tensor(cD_mn.layout()); // (CTA_M,CTA_N) + cute::Tensor tRS_cD = cute::make_coord_tensor(tRS_cD_mn.layout()); // (R2S,R2S_M,R2S_N,EPI_M,EPI_N) + // Subtract the global "bottom right" corner from the local "top left" corner to get the max relative coordinate + auto residue_cD = cute::make_coord(M, N) - cD_mn(cute::_0{}); // (m,n) + auto residue_tRS_cD = cute::make_coord(M, N) - tRS_cD_mn(cute::_0{}); // (m,n) + + CUTE_STATIC_ASSERT(epi_tile_m % mma_tile_m == 0, "MMA_TILE_M must divide EPI_TILE_M"); + + if constexpr (epi_tile_m * epi_tile_n > mma_tile_m * mma_tile_n) { + // When the epilogue subtile is larger than the MMA tiles, loop over multiple MMA tiles + CUTE_STATIC_ASSERT(epi_tile_n % mma_tile_n == 0, "MMA_TILE_N must divide EPI_TILE_N"); + } else { + CUTE_STATIC_ASSERT(mma_tile_n % epi_tile_n == 0, "EPI_TILE_N must divide MMA_TILE_N"); + } + + // Get cute::TiledCopy for partition reference when consumer store. + cute::TiledCopy tiled_copy_partition_ref = + cute::make_tiled_copy_S(cute::Copy_Atom{}, tiled_copy_C_atom); + // Get the fusion callbacks for the consumer store warps + constexpr bool RefSrc = true; // Register tensors reference tiled copy src layout + auto cst_args = cutlass::epilogue::fusion::detail::ConsumerStoreArgs( + problem_shape_mnkl, CtaTileMNK{}, tile_coord_mnkl, tiled_mma, EpilogueTile{}, + tiled_copy_partition_ref, cD, residue_cD, tRS_cD, residue_tRS_cD, tRS_rC, thread_idx); + auto cst_callbacks0 = fusion_callbacks0.template get_consumer_store_callbacks(cst_args); + auto cst_callbacks1 = fusion_callbacks1.template get_consumer_store_callbacks(cst_args); + auto cst_callbacks2 = fusion_callbacks2.template get_consumer_store_callbacks(cst_args); + auto cst_callbacks3 = fusion_callbacks3.template get_consumer_store_callbacks(cst_args); + bool is_producer_load_needed = fusion_callbacks0.is_producer_load_needed(); + bool is_C_load_needed = is_source_supported && fusion_callbacks0.is_C_load_needed(); + + using FragmentVisit = decltype(cst_callbacks0.visit(tRS_rAcc_frg0(0), 0, 0, 0)); + constexpr bool IsDirectR2S = + cute::is_same_v>; + using RegisterElementD = cute::conditional_t; + cute::Tensor tRS_rCompute = cute::make_tensor(tRS_rD_layout); // (R2S,R2S_M,R2S_N) + cute::Tensor tRS_rCompute_frg = + cute::recast>(tRS_rCompute); + + // Thread synchronizer for previously issued waits or fences + // to ensure visibility of smem reads/writes to threads or TMA unit + auto synchronize = [&]() CUTLASS_LAMBDA_FUNC_INLINE { + cutlass::arch::NamedBarrier::sync(size(TiledMma{}), + cutlass::arch::ReservedNamedBarriers::EpilogueBarrier); + }; + + // Predication for TMA store (one warp issues TMA store) + bool issue_tma_store = (thread_idx / cutlass::NumThreadsPerWarp) == 0; + + // In the reuse smem configuration we have StagesC smem buffers and at most StagesD + // committed TMA stores in flight. The TMA store pipeline producer acquire returns when at + // most StagesD-1 committed stores are in-flight, so we can only guarantee store completion + // after StagesD iterations, then we can begin issuing releases on the smem buffer locks. + // store_pipe_producer_state tracks the acquire and load_pipe_consumer_state tracks the + // release, in circular buffer fashion. + LoadPipelineState load_wait_state = load_pipe_consumer_state; + if constexpr (ReuseSmemC) { + load_wait_state = store_pipe_producer_state; + load_wait_state.phase_ ^= 1; + } + + // We can delay issue of TMA store by one iteration to achieve better interleaving of non-TMA instructions + // Sync requirements of smem reuse may preclude this optimization + // Delayed stores cause delayed stage releases which causes deadlock when StagesC == StagesD + [[maybe_unused]] int epi_m_prev = 0; + [[maybe_unused]] int epi_n_prev = 0; + static_assert(not(DelayTmaStore and ReuseSmemC and StagesC <= StagesD), + "This TMA epilogue configuration will deadlock"); + + // The TMA store sequence for one subtile iteration + auto tma_store_fn = [&](int epi_m, int epi_n) CUTLASS_LAMBDA_FUNC_INLINE { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if constexpr (is_destination_supported) { + if (issue_tma_store) { + cute::copy(params.tma_store_d, + bSG_sD(cute::_, cute::_, cute::_, store_pipe_producer_state.index()), + bSG_gD(cute::_, cute::_, cute::_, epi_m, epi_n)); + } + } + + // Post async fence, pre TMA commit callback entry point + cst_callbacks0.tma_store(epi_m, epi_n, store_pipe_producer_state.count(), issue_tma_store); + cst_callbacks1.tma_store(epi_m, epi_n, store_pipe_producer_state.count(), issue_tma_store); + cst_callbacks2.tma_store(epi_m, epi_n, store_pipe_producer_state.count(), issue_tma_store); + cst_callbacks3.tma_store(epi_m, epi_n, store_pipe_producer_state.count(), issue_tma_store); + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + ++issued_stores; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + synchronize(); + + if constexpr (ReuseSmemC) { + // producer_acquire returns when at most StagesD-1 committed stores are pending + bool store_finished = issued_stores > StorePipeline::UnacquiredStages; + // Let dma warp know earliest smem buffer is consumed and empty after StagesD producer commits + if (store_finished) { + if (is_producer_load_needed) { + load_pipeline.consumer_release(load_pipe_consumer_state); + } + ++load_pipe_consumer_state; + } + } + }; + + // + // BEGIN EPILOGUE + // + + // Pre-loop fusion callback entry point + cst_callbacks0.begin(); + cst_callbacks1.begin(); + cst_callbacks2.begin(); + cst_callbacks3.begin(); + + if (cst_callbacks0.begin_sync_needed()) { + synchronize(); + } + + // For each output tile + CUTLASS_PRAGMA_UNROLL + for (int epi_n = 0; epi_n < cute::size<3>(gD_epi); ++epi_n) { + CUTLASS_PRAGMA_UNROLL + for (int epi_m = 0; epi_m < cute::size<2>(gD_epi); ++epi_m) { + [[maybe_unused]] bool is_first_iteration = epi_m == 0 && epi_n == 0; + bool is_last_iteration = + epi_m == cute::size<2>(gD_epi) - 1 && epi_n == cute::size<3>(gD_epi) - 1; + + if (subtile_idx != -1 + && (epi_n * static_cast(cute::size<2>(gD_epi)) + epi_m) != subtile_idx) { + continue; + } + + cst_callbacks0.begin_loop(epi_m, epi_n); + cst_callbacks1.begin_loop(epi_m, epi_n); + cst_callbacks2.begin_loop(epi_m, epi_n); + cst_callbacks3.begin_loop(epi_m, epi_n); + + if (is_producer_load_needed) { + // Wait for the producer load to fill smem + load_pipeline.consumer_wait(load_wait_state); + + if (is_C_load_needed) { + // Copy source tile from smem to register + cute::copy(tiled_s2r, + tSR_sC(cute::_, cute::_, cute::_, load_wait_state.index()), tSR_rC); + // Ensure smem loads are complete before reusing smem for mixed types/layouts + if constexpr (ReuseSmemC && not(SmemLayoutC{} == SmemLayoutD{})) { + synchronize(); + } + } + } + + // First loop fusion callback entry point + cst_callbacks0.previsit(epi_m, epi_n, load_wait_state.count(), is_producer_load_needed); + cst_callbacks1.previsit(epi_m, epi_n, load_wait_state.count(), is_producer_load_needed); + cst_callbacks2.previsit(epi_m, epi_n, load_wait_state.count(), is_producer_load_needed); + cst_callbacks3.previsit(epi_m, epi_n, load_wait_state.count(), is_producer_load_needed); + + if (is_producer_load_needed) { + if constexpr (not ReuseSmemC) { + // Let producer load warp know smem buffers are consumed and empty + cutlass::arch::fence_view_async_shared(); + load_pipeline.consumer_release(load_pipe_consumer_state); + ++load_pipe_consumer_state; + } + ++load_wait_state; + } + + if constexpr (epi_tile_m * epi_tile_n > mma_tile_m * mma_tile_n) { + // When the epilogue subtile is larger than the MMA tiles, loop over multiple + // MMA tiles + static constexpr int MmaMPerEpiM = epi_tile_m / mma_tile_m; + static constexpr int MmaNPerEpiN = epi_tile_n / mma_tile_n; + + CUTLASS_PRAGMA_UNROLL + for (int mma_n_in_epi = 0; mma_n_in_epi < MmaNPerEpiN; ++mma_n_in_epi) { + int mma_n = (epi_n * MmaNPerEpiN) + mma_n_in_epi; + + CUTLASS_PRAGMA_UNROLL + for (int mma_m_in_epi = 0; mma_m_in_epi < MmaMPerEpiM; ++mma_m_in_epi) { + int mma_m = (epi_m * MmaMPerEpiM) + mma_m_in_epi; + cute::Tensor tRS_rAcc_frg_mn0 = tRS_rAcc_frg0(cute::_, mma_m, mma_n); + cute::Tensor tRS_rAcc_frg_mn1 = tRS_rAcc_frg1(cute::_, mma_m, mma_n); + cute::Tensor tRS_rAcc_frg_mn2 = tRS_rAcc_frg2(cute::_, mma_m, mma_n); + cute::Tensor tRS_rAcc_frg_mn3 = tRS_rAcc_frg3(cute::_, mma_m, mma_n); + + int idx_in_epi_subtile = (mma_n_in_epi * MmaMPerEpiM + mma_m_in_epi); + + auto comp0 = cst_callbacks0.visit(tRS_rAcc_frg_mn0(0), + idx_in_epi_subtile, epi_m, epi_n); + auto comp1 = cst_callbacks1.visit(tRS_rAcc_frg_mn1(0), + idx_in_epi_subtile, epi_m, epi_n); + auto comp2 = cst_callbacks2.visit(tRS_rAcc_frg_mn2(0), + idx_in_epi_subtile, epi_m, epi_n); + auto comp3 = cst_callbacks3.visit(tRS_rAcc_frg_mn3(0), + idx_in_epi_subtile, epi_m, epi_n); + QuadAddOp> quad_add_op; + auto combined_comp = quad_add_op(comp0, comp1, comp2, comp3); + tRS_rCompute_frg(idx_in_epi_subtile) = combined_comp; + } + } + } else { + int mma_m = epi_m; + int mma_n = (epi_n * cute::size<1>(EpilogueTile{})) / mma_tile_n; + cute::Tensor tRS_rAcc_frg_mn0 = tRS_rAcc_frg0(cute::_, mma_m, mma_n); + cute::Tensor tRS_rAcc_frg_mn1 = tRS_rAcc_frg1(cute::_, mma_m, mma_n); + cute::Tensor tRS_rAcc_frg_mn2 = tRS_rAcc_frg2(cute::_, mma_m, mma_n); + cute::Tensor tRS_rAcc_frg_mn3 = tRS_rAcc_frg3(cute::_, mma_m, mma_n); + + // Vectorized fragment loop with visitor callback entry point + int epi_n_in_mma = epi_n % (mma_tile_n / epi_tile_n); + int r2s_v = epi_n_in_mma * size(tRS_rCompute_frg); + CUTLASS_PRAGMA_UNROLL + for (int epi_v = 0; epi_v < size(tRS_rCompute_frg); ++epi_v) { + auto comp0 = cst_callbacks0.visit(tRS_rAcc_frg_mn0(r2s_v + epi_v), epi_v, + epi_m, epi_n); + auto comp1 = cst_callbacks1.visit(tRS_rAcc_frg_mn1(r2s_v + epi_v), epi_v, + epi_m, epi_n); + auto comp2 = cst_callbacks2.visit(tRS_rAcc_frg_mn2(r2s_v + epi_v), epi_v, + epi_m, epi_n); + auto comp3 = cst_callbacks3.visit(tRS_rAcc_frg_mn3(r2s_v + epi_v), epi_v, + epi_m, epi_n); + QuadAddOp> quad_add_op; + auto combined_comp = quad_add_op(comp0, comp1, comp2, comp3); + tRS_rCompute_frg(epi_v) = combined_comp; + } + } + + // The latest we can delay the TMA store is right before the smem store of the next iteration + // since the current TMA store needs to be committed before we can acquire the next smem buffer + if constexpr (DelayTmaStore) { + // Issue TMA stores for the previous subtile + if (not is_first_iteration and subtile_idx == -1) { + tma_store_fn(epi_m_prev, epi_n_prev); + } + epi_m_prev = epi_m; + epi_n_prev = epi_n; + } + + // Smem reduction callback entry point using current store buffer for workspace + cst_callbacks0.reduce(sD_epi(cute::_, cute::_, store_pipe_producer_state.index()), + synchronize, epi_m, epi_n, is_last_iteration, tRS_rCompute_frg); + cst_callbacks1.reduce(sD_epi(cute::_, cute::_, store_pipe_producer_state.index()), + synchronize, epi_m, epi_n, is_last_iteration, tRS_rCompute_frg); + cst_callbacks2.reduce(sD_epi(cute::_, cute::_, store_pipe_producer_state.index()), + synchronize, epi_m, epi_n, is_last_iteration, tRS_rCompute_frg); + cst_callbacks3.reduce(sD_epi(cute::_, cute::_, store_pipe_producer_state.index()), + synchronize, epi_m, epi_n, is_last_iteration, tRS_rCompute_frg); + + // Copy tile from register to regiser if needed + if constexpr (IsUseR2R) { + // retile source and destination for tiled_r2r + cute::Tensor tRR_rD_src = + thread_r2r.retile_S(tRS_rCompute); // (R2R,R2R_M,R2R_N,EPI_M,EPI_N) + cute::Tensor tRR_rD_dst = + thread_r2r.retile_D(tRS_rCompute); // (R2R,R2R_M,R2R_N,EPI_M,EPI_N) + + // Output register transformation before copying to shared memory. + cute::copy(tiled_r2r, tRR_rD_src, tRR_rD_dst); + } + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tRS_rD_frg); ++i) { + tRS_rD_frg(i) = + cutlass::NumericArrayConverter{}( + tRS_rCompute_frg(i)); + } + + // Copy tile from register to smem + if constexpr (is_destination_supported) { + cute::copy(tiled_r2s, tRS_rD, + tRS_sD(cute::_, cute::_, cute::_, store_pipe_producer_state.index())); + } + + // Post reduction, pre TMA store callback entry point + constexpr bool issue_smem_store = true; // No smem store predication + cst_callbacks0.postreduce(epi_m, epi_n, store_pipe_producer_state.count(), + issue_smem_store); + cst_callbacks1.postreduce(epi_m, epi_n, store_pipe_producer_state.count(), + issue_smem_store); + cst_callbacks2.postreduce(epi_m, epi_n, store_pipe_producer_state.count(), + issue_smem_store); + cst_callbacks3.postreduce(epi_m, epi_n, store_pipe_producer_state.count(), + issue_smem_store); + + if constexpr (not DelayTmaStore) { + // Issue TMA stores for this subtile + tma_store_fn(epi_m, epi_n); + } + + cst_callbacks0.end_loop(epi_m, epi_n); + cst_callbacks1.end_loop(epi_m, epi_n); + cst_callbacks2.end_loop(epi_m, epi_n); + cst_callbacks3.end_loop(epi_m, epi_n); + } // for epi_m + } // for epi_n + + if constexpr (DelayTmaStore) { + // Issue TMA stores for the last subtile + tma_store_fn(epi_m_prev, epi_n_prev); + } + + // Post-loop fusion callback entry point + cst_callbacks0.end(); + cst_callbacks1.end(); + cst_callbacks2.end(); + cst_callbacks3.end(); + + return cute::make_tuple(load_pipe_consumer_state, store_pipe_producer_state); + } + + CUTLASS_DEVICE auto store_tail(LoadPipeline load_pipeline, + LoadPipelineState load_pipe_consumer_state, + StorePipeline store_pipeline, + StorePipelineState store_pipe_producer_state) + { + // wait for all TMA stores to complete + store_pipeline.producer_tail(store_pipe_producer_state); + // reset store counter + issued_stores = 0; + + if constexpr (ReuseSmemC) { + if (fusion_callbacks0.is_producer_load_needed()) { + // Issue releases on up to StagesD-1 previously issued TMA stores + constexpr int release_stages = + cute::min(StorePipeline::UnacquiredStages, get_load_pipe_increment(CtaTileMNK{})); + CUTLASS_PRAGMA_UNROLL + for (int stage = 0; stage < release_stages; ++stage) { + load_pipeline.consumer_release(load_pipe_consumer_state); + ++load_pipe_consumer_state; + } + } + } + + return cute::make_tuple(load_pipe_consumer_state, store_pipe_producer_state); + } + + /// Issue Tma Descriptor Prefetch -- ideally from a single thread for best performance + CUTLASS_DEVICE + static void prefetch_tma_descriptors(Params const& epilogue_params) + { + if constexpr (is_source_supported) { + cute::prefetch_tma_descriptor(epilogue_params.tma_load_c.get_tma_descriptor()); + } + if constexpr (is_destination_supported) { + cute::prefetch_tma_descriptor(epilogue_params.tma_store_d.get_tma_descriptor()); + } + } + + template + static constexpr Params to_underlying_arguments(ProblemShape const& problem_shape, + Arguments const& args, + [[maybe_unused]] void* workspace) + { + // Optionally append 1s until problem shape is rank-4 in case its is only rank-3 (MNK) + auto problem_shape_MNKL = cute::append<4>(problem_shape, 1); + auto [M, N, K, L] = problem_shape_MNKL; + + uint32_t transaction_bytes = TmaTransactionBytes; + typename Params::TMA_C tma_load_c{}; + if constexpr (is_source_supported) { + cute::Tensor tensor_c = + cute::make_tensor(cute::make_gmem_ptr(args.ptr_C), + cute::make_layout(cute::make_shape(M, N, L), args.dC)); + tma_load_c = cute::make_tma_copy_C_sm90(CopyOpG2S{}, tensor_c, + cute::take<0, 2>(SmemLayoutC{}), EpilogueTile{}); + } + + typename Params::TMA_D tma_store_d{}; + if constexpr (is_destination_supported) { + cute::Tensor tensor_d = + cute::make_tensor(cute::make_gmem_ptr(args.ptr_D), + cute::make_layout(cute::make_shape(M, N, L), args.dD)); + tma_store_d = cute::make_tma_copy_C_sm90(CopyOpS2G{}, tensor_d, + cute::take<0, 2>(SmemLayoutD{}), EpilogueTile{}); + } + + return { FusionCallbacks::to_underlying_arguments(problem_shape, args.thread0, workspace), + FusionCallbacks::to_underlying_arguments(problem_shape, args.thread1, workspace), + FusionCallbacks::to_underlying_arguments(problem_shape, args.thread2, workspace), + FusionCallbacks::to_underlying_arguments(problem_shape, args.thread3, workspace), + tma_load_c, + tma_store_d, + transaction_bytes }; + } + +private: + Params const& params; + FusionCallbacks fusion_callbacks0; + FusionCallbacks fusion_callbacks1; + FusionCallbacks fusion_callbacks2; + FusionCallbacks fusion_callbacks3; + int issued_stores = 0; +}; diff --git a/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_gemm_tma_warpspecialized_cooperative_quad.h b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_gemm_tma_warpspecialized_cooperative_quad.h new file mode 100644 index 0000000..ebcbc36 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_gemm_tma_warpspecialized_cooperative_quad.h @@ -0,0 +1,828 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +#include +#include +// clang-format on + +/** + * These 1 classes/structs are rewritten: + * 1. cutlass::gemm::kernel::GemmUniversal -> QuadGemmUniversal + */ + +// Primary template declaration to enable partial/specialized definitions below. +template +class QuadGemmUniversal; + +// Original file: cutlass/gemm/kernel/sm90_gemm_tma_warpspecialized_cooperative.hpp +// to add multiple accumulators to mma +template +class QuadGemmUniversal< + ProblemShape_, CollectiveMainloop_, CollectiveEpilogue_, TileSchedulerTag_, + cute::enable_if_t>> { +public: + // + // Type Aliases + // + using ProblemShape = ProblemShape_; + static_assert(cute::rank(ProblemShape{}) == 3 or cute::rank(ProblemShape{}) == 4, + "ProblemShape{} should be or "); + + // Mainloop derived types + using CollectiveMainloop = CollectiveMainloop_; + using TileShape = typename CollectiveMainloop::TileShape; + using TiledMma = typename CollectiveMainloop::TiledMma; + using ArchTag = typename CollectiveMainloop::ArchTag; + using ElementA = typename CollectiveMainloop::ElementA; + using StrideA = typename CollectiveMainloop::StrideA; + using ElementB = typename CollectiveMainloop::ElementB; + using StrideB = typename CollectiveMainloop::StrideB; + using DispatchPolicy = typename CollectiveMainloop::DispatchPolicy; + using ElementAccumulator = typename CollectiveMainloop::ElementAccumulator; + using ClusterShape = typename DispatchPolicy::ClusterShape; + using MainloopArguments = typename CollectiveMainloop::Arguments; + using MainloopParams = typename CollectiveMainloop::Params; + // Epilogue derived types + using CollectiveEpilogue = CollectiveEpilogue_; + using ElementC = typename CollectiveEpilogue::ElementC; + using StrideC = typename CollectiveEpilogue::StrideC; + using ElementD = typename CollectiveEpilogue::ElementD; + using StrideD = typename CollectiveEpilogue::StrideD; + using EpilogueArguments = typename CollectiveEpilogue::Arguments; + using EpilogueParams = typename CollectiveEpilogue::Params; + + static_assert(ArchTag::kMinComputeCapability >= 90); + + static constexpr uint32_t TileSchedulerPipelineStageCount = + DispatchPolicy::Schedule::SchedulerPipelineStageCount; + using TileSchedulerTag = TileSchedulerTag_; + + using TileScheduler = typename cutlass::gemm::kernel::detail::TileSchedulerSelector< + TileSchedulerTag, ArchTag, TileShape, ClusterShape, TileSchedulerPipelineStageCount>::Scheduler; + + using TileSchedulerArguments = typename TileScheduler::Arguments; + using TileSchedulerParams = typename TileScheduler::Params; + + // Warp specialization thread count per threadblock + static constexpr uint32_t NumSchedThreads = cutlass::NumThreadsPerWarp; // 1 warp + static constexpr uint32_t NumMMAThreads = cute::size(TiledMma{}); // 8 warps + static constexpr uint32_t NumMainloopLoadThreads = cutlass::NumThreadsPerWarp; // 1 warp + static constexpr uint32_t NumEpilogueLoadThreads = cutlass::NumThreadsPerWarp; // 1 warp for C + + static constexpr bool IsSchedDynamicPersistent = TileScheduler::IsDynamicPersistent; + static constexpr bool IsGdcEnabled = cutlass::arch::IsGdcGloballyEnabled; + + static constexpr uint32_t NumLoadWarpGroups = 1; + static constexpr uint32_t NumMmaWarpGroups = NumMMAThreads / cutlass::NumThreadsPerWarpGroup; + static constexpr uint32_t MaxThreadsPerBlock = + NumMMAThreads + (NumLoadWarpGroups * cutlass::NumThreadsPerWarpGroup); + static constexpr uint32_t MinBlocksPerMultiprocessor = 1; + static constexpr uint32_t NumFixupBarriers = NumMmaWarpGroups; + static constexpr uint32_t NumProducerThreads = CollectiveMainloop::NumProducerThreadEvents; + static constexpr bool IsMainloopAuxiliaryLoadNeeded = + cutlass::gemm::kernel::detail::HasAuxiliaryLoad_v; + + /// Register requirement for Load and Math WGs + static constexpr int RegsPerThread = cute::size<0>(TileShape{}) * cute::size<1>(TileShape{}) + / NumMMAThreads * sizeof(ElementAccumulator) + / sizeof(uint32_t); + static constexpr bool HeavyRegisterPressure = RegsPerThread >= 208; + static constexpr uint32_t LoadRegisterRequirement = !HeavyRegisterPressure ? 40 : 24; + static constexpr uint32_t MmaRegisterRequirement = !HeavyRegisterPressure ? 232 : 240; + + // 1 stage ordered sequence between mainloop and epilogue producer load threads + using LoadWarpOrderBarrier = cutlass::OrderedSequenceBarrier<1, 2>; + + using TileSchedulerPipeline = typename TileScheduler::Pipeline; + using TileSchedulerPipelineState = typename TileSchedulerPipeline::PipelineState; + using TileSchedulerStorage = typename TileScheduler::SharedStorage; + using TileSchedulerThrottlePipeline = typename TileScheduler::ThrottlePipeline; + using TileSchedulerThrottlePipelineState = typename TileSchedulerThrottlePipeline::PipelineState; + + // Kernel level shared memory storage + struct SharedStorage { + struct PipelineStorage : cute::aligned_struct<16, cute::_1> { + using MainloopPipelineStorage = typename CollectiveMainloop::PipelineStorage; + using EpiLoadPipelineStorage = typename CollectiveEpilogue::PipelineStorage; + + alignas(16) MainloopPipelineStorage mainloop; + alignas(16) EpiLoadPipelineStorage epi_load; + alignas(16) typename LoadWarpOrderBarrier::SharedStorage load_order; + } pipelines; + + alignas(16) TileSchedulerStorage scheduler; + + struct TensorStorage : cute::aligned_struct<128, cute::_1> { + using MainloopTensorStorage = typename CollectiveMainloop::TensorStorage; + using EpilogueTensorStorage = typename CollectiveEpilogue::TensorStorage; + + EpilogueTensorStorage epilogue; + MainloopTensorStorage mainloop; + } tensors; + }; + + static constexpr int SharedStorageSize = sizeof(SharedStorage); + + // Device side arguments + struct Arguments { + cutlass::gemm::GemmUniversalMode mode{}; + ProblemShape problem_shape{}; + MainloopArguments mainloop{}; + EpilogueArguments epilogue{}; + cutlass::KernelHardwareInfo hw_info{}; + TileSchedulerArguments scheduler{}; + }; + + // Kernel entry point API + struct Params { + cutlass::gemm::GemmUniversalMode mode{}; + ProblemShape problem_shape{}; + MainloopParams mainloop{}; + EpilogueParams epilogue{}; + cutlass::KernelHardwareInfo hw_info{}; + TileSchedulerParams scheduler{}; + void* workspace{ nullptr }; + }; + + // + // Methods + // + + static bool can_implement(Arguments const& args) + { + bool implementable = (args.mode == cutlass::gemm::GemmUniversalMode::kGemm) + or (args.mode == cutlass::gemm::GemmUniversalMode::kBatched + && cute::rank(ProblemShape{}) == 4); + if (!implementable) { + CUTLASS_TRACE_HOST( + " CAN IMPLEMENT: Arguments or Problem Shape don't meet the requirements.\n"); + return implementable; + } + implementable &= CollectiveMainloop::can_implement(args.problem_shape, args.mainloop); + implementable &= CollectiveEpilogue::can_implement(args.problem_shape, args.epilogue); + implementable &= TileScheduler::can_implement(args.scheduler); + return implementable; + } + + static dim3 get_block_shape() { return dim3(MaxThreadsPerBlock, 1, 1); } + + // Computes the kernel launch grid shape based on runtime parameters + static dim3 get_grid_shape(Params const& params) + { + // Given device SM count, set grid size s.t. we do not launch more thread blocks than we can run concurrently + TileSchedulerArguments args{}; + if constexpr (!std::is_const_v) { + args.max_swizzle_size = 1 << params.scheduler.log_swizzle_size_; + } + args.raster_order = params.scheduler.raster_order_ == TileScheduler::RasterOrder::AlongN + ? TileScheduler::RasterOrderOptions::AlongN + : TileScheduler::RasterOrderOptions::AlongM; + return TileScheduler::get_grid_shape(params.scheduler, params.problem_shape, TileShape{}, + ClusterShape{}, params.hw_info, args); + } + + static size_t get_workspace_size(Arguments const& args) + { + size_t workspace_size = 0; + constexpr uint32_t NumEpilogueSubTiles = + CollectiveEpilogue::get_store_pipe_increment(TileShape{}); + + workspace_size += CollectiveEpilogue::get_workspace_size(args.problem_shape, args.epilogue); + workspace_size = cutlass::round_nearest(workspace_size, cutlass::MinWorkspaceAlignment); + + workspace_size += TileScheduler::template get_workspace_size( + args.scheduler, args.problem_shape, args.hw_info, NumMmaWarpGroups, NumEpilogueSubTiles); + workspace_size = cutlass::round_nearest(workspace_size, cutlass::MinWorkspaceAlignment); + return workspace_size; + } + + static cutlass::Status initialize_workspace(Arguments const& args, void* workspace = nullptr, + cudaStream_t stream = nullptr, + cutlass::CudaHostAdapter* cuda_adapter = nullptr) + { + cutlass::Status status = cutlass::Status::kSuccess; + uint8_t* workspace_ptr = reinterpret_cast(workspace); + size_t workspace_offset = 0; + constexpr uint32_t NumEpilogueSubTiles = + CollectiveEpilogue::get_store_pipe_increment(TileShape{}); + static constexpr uint32_t NumAccumulatorMtxs = 1; + + status = CollectiveEpilogue::initialize_workspace(args.problem_shape, args.epilogue, + workspace_ptr + workspace_offset, stream, + cuda_adapter); + workspace_offset += CollectiveEpilogue::get_workspace_size(args.problem_shape, args.epilogue); + workspace_offset = cutlass::round_nearest(workspace_offset, cutlass::MinWorkspaceAlignment); + if (status != cutlass::Status::kSuccess) { + return status; + } + + status = TileScheduler::template initialize_workspace( + args.scheduler, workspace_ptr + workspace_offset, stream, args.problem_shape, + args.hw_info, NumMmaWarpGroups, NumEpilogueSubTiles, NumAccumulatorMtxs, cuda_adapter); + workspace_offset += TileScheduler::template get_workspace_size( + args.scheduler, args.problem_shape, args.hw_info, NumMmaWarpGroups, NumEpilogueSubTiles); + workspace_offset = cutlass::round_nearest(workspace_offset, cutlass::MinWorkspaceAlignment); + if (status != cutlass::Status::kSuccess) { + return status; + } + + return status; + } + + CUTLASS_DEVICE + void operator()(Params const& params, char* smem_buf) + { +#ifdef __CUDA_ARCH_FEAT_SM90_ALL + #define ENABLE_SM90_KERNEL_LEVEL 1 +#endif +// Any Tensor Op MMA Atom in the ISA is arch conditional. +#ifndef ENABLE_SM90_KERNEL_LEVEL + printf( + "ERROR : Arch conditional MMA instruction used without targeting appropriate compute " + "capability. Aborting.\n"); +#else + + // Preconditions + static_assert(NumMMAThreads == 256, + "Cooperative kernel must have TiledMMA operating using 256 threads."); + static_assert(cute::size<0>(TileShape{}) >= 128, + "Cooperative kernel requires Tile Size to be greater than or equal to 128 " + "along the M-dimension."); + + static_assert(cute::rank(StrideA{}) == 3, + "StrideA must be rank-3: [M, K, L]. If batch mode is not needed, set L " + "stride to Int<0>."); + static_assert(cute::rank(StrideB{}) == 3, + "StrideB must be rank-3: [N, K, L]. If batch mode is not needed, set L " + "stride to Int<0>."); + static_assert(cute::rank(StrideC{}) == 3, + "StrideC must be rank-3: [M, N, L]. If batch mode is not needed, set L " + "stride to Int<0>."); + static_assert(cute::rank(StrideD{}) == 3, + "StrideD must be rank-3: [M, N, L]. If batch mode is not needed, set L " + "stride to Int<0>."); + + /* In the Cooperative kernel, Consumer0 and Consumer1 collaborate on the same tile */ + enum class WarpGroupRole { Producer = 0, Consumer0 = 1, Consumer1 = 2 }; + enum class ProducerWarpRole { Mainloop = 0, Warp1 = 1, Epilogue = 2, MainloopAux = 3 }; + + // Kernel level shared memory storage + SharedStorage& shared_storage = *reinterpret_cast(smem_buf); + + int thread_idx = int(threadIdx.x); + int lane_idx = cutlass::canonical_lane_idx(); + int warp_idx = cutlass::canonical_warp_idx_sync(); + int warp_idx_in_warp_group = warp_idx % cutlass::NumWarpsPerWarpGroup; + int warp_group_thread_idx = thread_idx % cutlass::NumThreadsPerWarpGroup; + int mma_thread_idx = thread_idx % NumMMAThreads; + auto warp_group_role = WarpGroupRole(cutlass::canonical_warp_group_idx()); + auto producer_warp_role = ProducerWarpRole(warp_idx_in_warp_group); + int lane_predicate = cute::elect_one_sync(); + uint32_t block_rank_in_cluster = cute::block_rank_in_cluster(); + + // Issue Tma Descriptor Prefetch from a single thread + if ((warp_idx == 0) && lane_predicate) { + CollectiveMainloop::prefetch_tma_descriptors(params.mainloop); + CollectiveEpilogue::prefetch_tma_descriptors(params.epilogue); + } + + CollectiveEpilogue collective_epilogue(params.epilogue, shared_storage.tensors.epilogue); + bool is_epi_load_needed = collective_epilogue.is_producer_load_needed(); + // TileScheduler pipeline + typename TileSchedulerPipeline::Params scheduler_pipeline_params; + typename TileSchedulerThrottlePipeline::Params scheduler_throttle_pipeline_params; + if constexpr (IsSchedDynamicPersistent) { + if (warp_group_role == WarpGroupRole::Producer + && producer_warp_role == ProducerWarpRole::Warp1) { + scheduler_pipeline_params.role = TileSchedulerPipeline::ThreadCategory::ProducerConsumer; + } else { + scheduler_pipeline_params.role = TileSchedulerPipeline::ThreadCategory::Consumer; + } + scheduler_pipeline_params.producer_blockid = 0; + scheduler_pipeline_params.producer_arv_count = 1; + scheduler_pipeline_params.consumer_arv_count = + NumSchedThreads + NumMainloopLoadThreads + NumMMAThreads; + + if (is_epi_load_needed) { + scheduler_pipeline_params.consumer_arv_count += NumEpilogueLoadThreads; + } + scheduler_pipeline_params.transaction_bytes = sizeof(typename TileScheduler::CLCResponse); + + scheduler_throttle_pipeline_params.producer_arv_count = NumMainloopLoadThreads; + scheduler_throttle_pipeline_params.consumer_arv_count = NumSchedThreads; + scheduler_throttle_pipeline_params.dst_blockid = 0; + scheduler_throttle_pipeline_params.initializing_warp = 3; + if (warp_group_role == WarpGroupRole::Producer + && producer_warp_role == ProducerWarpRole::Warp1) { + scheduler_throttle_pipeline_params.role = + TileSchedulerThrottlePipeline::ThreadCategory::Consumer; + } + // set role when it is for DMA warp in Mainloop + else if (warp_group_role == WarpGroupRole::Producer + && producer_warp_role == ProducerWarpRole::Mainloop) { + scheduler_throttle_pipeline_params.role = + TileSchedulerThrottlePipeline::ThreadCategory::Producer; + } + } + TileSchedulerPipeline scheduler_pipeline(shared_storage.scheduler.pipeline(), + scheduler_pipeline_params); + TileSchedulerPipelineState scheduler_pipe_consumer_state; + + TileSchedulerThrottlePipeline scheduler_throttle_pipeline( + shared_storage.scheduler.throttle_pipeline(), scheduler_throttle_pipeline_params); + TileSchedulerThrottlePipelineState scheduler_pipe_throttle_consumer_state; + TileSchedulerThrottlePipelineState scheduler_pipe_throttle_producer_state = + cutlass::make_producer_start_state(); + + // Mainloop Load pipeline + using MainloopPipeline = typename CollectiveMainloop::MainloopPipeline; + typename MainloopPipeline::Params mainloop_pipeline_params; + if (warp_group_role == WarpGroupRole::Producer + && (producer_warp_role == ProducerWarpRole::Mainloop + || producer_warp_role == ProducerWarpRole::MainloopAux)) { + mainloop_pipeline_params.role = MainloopPipeline::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Consumer0 || warp_group_role == WarpGroupRole::Consumer1) { + mainloop_pipeline_params.role = MainloopPipeline::ThreadCategory::Consumer; + } + mainloop_pipeline_params.is_leader = warp_group_thread_idx == 0; + mainloop_pipeline_params.num_consumers = NumMMAThreads; + mainloop_pipeline_params.num_producers = NumProducerThreads; + mainloop_pipeline_params.transaction_bytes = params.mainloop.tma_transaction_bytes; + MainloopPipeline mainloop_pipeline(shared_storage.pipelines.mainloop, + mainloop_pipeline_params, ClusterShape{}); + + // Epilogue Load pipeline + using EpiLoadPipeline = typename CollectiveEpilogue::LoadPipeline; + typename EpiLoadPipeline::Params epi_load_pipeline_params; + if (warp_group_role == WarpGroupRole::Producer + && producer_warp_role == ProducerWarpRole::Epilogue) { + epi_load_pipeline_params.role = EpiLoadPipeline::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Consumer0 || warp_group_role == WarpGroupRole::Consumer1) { + epi_load_pipeline_params.role = EpiLoadPipeline::ThreadCategory::Consumer; + } + epi_load_pipeline_params.dst_blockid = cute::block_rank_in_cluster(); + epi_load_pipeline_params.producer_arv_count = NumEpilogueLoadThreads; + epi_load_pipeline_params.consumer_arv_count = NumMMAThreads; + if constexpr (CollectiveEpilogue::RequiresTransactionBytes) { + epi_load_pipeline_params.transaction_bytes = params.epilogue.tma_transaction_bytes; + } + EpiLoadPipeline epi_load_pipeline(shared_storage.pipelines.epi_load, epi_load_pipeline_params); + + // Epilogue Store pipeline + using EpiStorePipeline = typename CollectiveEpilogue::StorePipeline; + typename EpiStorePipeline::Params epi_store_pipeline_params; + epi_store_pipeline_params.always_wait = true; + EpiStorePipeline epi_store_pipeline(epi_store_pipeline_params); + + typename LoadWarpOrderBarrier::Params params_load_order_barrier; + params_load_order_barrier.group_id = producer_warp_role == ProducerWarpRole::Mainloop ? 0 : 1; + params_load_order_barrier.group_size = cutlass::NumThreadsPerWarp; + LoadWarpOrderBarrier load_order_barrier(shared_storage.pipelines.load_order, + params_load_order_barrier); + + // Initialize starting pipeline states for the collectives + // Epilogue store pipe is producer-only (consumer is TMA unit, waits via scoreboarding) + typename CollectiveMainloop::PipelineState mainloop_pipe_consumer_state; + typename CollectiveEpilogue::LoadPipelineState epi_load_pipe_consumer_state; + + // For the DMA Load (producer) we start with an opposite phase + // i.e., we skip all waits since we know that the buffer is indeed empty + cutlass::PipelineState mainloop_pipe_producer_state = + cutlass::make_producer_start_state(); + cutlass::PipelineState epi_load_pipe_producer_state = + cutlass::make_producer_start_state(); + cutlass::PipelineState epi_store_pipe_producer_state = + cutlass::make_producer_start_state(); + + auto cluster_wait_fn = []() { + // We need this to guarantee that the Pipeline init is visible + // To all producers and consumer thread blocks in the Cluster + if constexpr (cute::size(ClusterShape{}) > 1) { + cute::cluster_arrive_relaxed(); + return []() { cute::cluster_wait(); }; + } else { + __syncthreads(); + return []() {}; // do nothing + } + }(); + + // Optionally append 1s until problem shape is rank-4 in case it is only rank-3 (MNK) + auto problem_shape_MNKL = cute::append<4>(params.problem_shape, cute::_1{}); + + // Get the appropriate blocks for this thread block -- potential for thread block locality + TiledMma tiled_mma; + auto blk_shape = TileShape{}; // (BLK_M,BLK_N,BLK_K) + + TileScheduler scheduler{ params.scheduler }; + if constexpr (IsSchedDynamicPersistent) { + scheduler.set_data_ptr(shared_storage.scheduler.data()); + } + // Declare work_tile_info, then define it in each of warps that use it. + typename TileScheduler::WorkTileInfo work_tile_info; + + // In a warp specialized kernel, collectives expose data movement and compute operations separately + CollectiveMainloop collective_mainloop; + + // Prepare and partition the input tensors. Expects a tuple of tensors where: + // get<0>(load_inputs) is the tma tensor A after local tiling so that it has shape + // (BLK_M,BLK_K,m,k,l) get<1>(load_inputs) is the tma tensor B0 after local tiling so that + // it has shape (BLK_N,BLK_K,n,k,l) get<2>(load_inputs) is the tma tensor B1 after local + // tiling so that it has shape (BLK_N,BLK_K,n,k,l) get<3>(load_inputs) is the tma tensor B2 + // after local tiling so that it has shape (BLK_N,BLK_K,n,k,l) get<4>(load_inputs) is the + // tma tensor B3 after local tiling so that it has shape (BLK_N,BLK_K,n,k,l) + + auto load_inputs = collective_mainloop.load_init(problem_shape_MNKL, params.mainloop); + static_assert(cute::tuple_size_v >= 5, + "Output of load_init must have at least five elements (A, B0, B1, B2, B3)"); + + // Extract out partitioned A and B. + cute::Tensor gA_mkl = cute::get<0>(load_inputs); + cute::Tensor gB0_nkl = cute::get<1>(load_inputs); + cute::Tensor gB1_nkl = cute::get<2>(load_inputs); + cute::Tensor gB2_nkl = cute::get<3>(load_inputs); + cute::Tensor gB3_nkl = cute::get<4>(load_inputs); + + // Wait for all thread blocks in the Cluster + cluster_wait_fn(); + + if (warp_group_role == WarpGroupRole::Producer) { + work_tile_info = scheduler.initial_work_tile_info(ClusterShape{}); + cutlass::arch::warpgroup_reg_dealloc(); + + // Scheduler Producer Warp + if (producer_warp_role == ProducerWarpRole::Warp1) { + if constexpr (IsSchedDynamicPersistent) { + bool requires_clc_query = true; + TileSchedulerPipelineState scheduler_pipe_producer_state = + cutlass::make_producer_start_state(); + + cutlass::arch::wait_on_dependent_grids(); + while (work_tile_info.is_valid()) { + + if (requires_clc_query) { + // Throttle CLC query to mitigate workload imbalance caused by skews among persistent workers. + scheduler_throttle_pipeline.consumer_wait( + scheduler_pipe_throttle_consumer_state); + scheduler_throttle_pipeline.consumer_release( + scheduler_pipe_throttle_consumer_state); + ++scheduler_pipe_throttle_consumer_state; + + // Query next work tile + scheduler_pipe_producer_state = scheduler.advance_to_next_work( + scheduler_pipeline, scheduler_pipe_producer_state); + } + + // Fetch next work tile + auto [next_work_tile_info, increment_pipe] = scheduler.fetch_next_work( + work_tile_info, scheduler_pipeline, scheduler_pipe_consumer_state); + requires_clc_query = increment_pipe; + if (increment_pipe) { + ++scheduler_pipe_consumer_state; + } + + work_tile_info = next_work_tile_info; + } + scheduler_pipeline.producer_tail(scheduler_pipe_producer_state); + } + } // Scheduler Producer Warp End + else + + // Mainloop Producer Warp + if (producer_warp_role == ProducerWarpRole::Mainloop) { + // Ensure that the prefetched kernel does not touch + // unflushed global memory prior to this instruction + cutlass::arch::wait_on_dependent_grids(); + bool do_load_order_arrive = true; + bool requires_clc_query = true; + while (work_tile_info.is_valid()) { + if (!TileScheduler::valid_warpgroup_in_work_tile(work_tile_info)) { + auto [next_work_tile_info, increment_pipe] = + scheduler.fetch_next_work(work_tile_info); + work_tile_info = next_work_tile_info; + continue; + } + + // Compute m_coord, n_coord, l_coord with the post-tiled m-shape and n-shape + auto m_coord = cute::idx2crd(work_tile_info.M_idx, cute::shape<2>(gA_mkl)); + auto n_coord = cute::idx2crd(work_tile_info.N_idx, cute::shape<2>(gB0_nkl)); + auto l_coord = cute::idx2crd(work_tile_info.L_idx, cute::shape<4>(gB0_nkl)); + auto blk_coord = cute::make_coord(m_coord, n_coord, cute::_, l_coord); + + // Get the number of K tiles to compute for this work as well as the starting K tile offset of the work. + auto work_k_tile_count = TileScheduler::get_work_k_tile_count( + work_tile_info, problem_shape_MNKL, blk_shape); + auto work_k_tile_start = TileScheduler::get_work_k_tile_start(work_tile_info); + auto k_tile_iter = cute::make_coord_iterator( + cute::idx2crd(work_k_tile_start, cute::shape<3>(gA_mkl)), + cute::shape<3>(gA_mkl)); + + if (requires_clc_query) { + scheduler_throttle_pipeline.producer_acquire( + scheduler_pipe_throttle_producer_state); + scheduler_throttle_pipeline.producer_commit( + scheduler_pipe_throttle_producer_state); + ++scheduler_pipe_throttle_producer_state; + } + + collective_mainloop.load( + params.mainloop, mainloop_pipeline, mainloop_pipe_producer_state, + load_inputs, blk_coord, k_tile_iter, work_k_tile_count, lane_idx, + block_rank_in_cluster, shared_storage.tensors.mainloop); + // Update starting pipeline state for the next tile + mainloop_pipe_producer_state.advance(work_k_tile_count); + + // Signal for the epilogue load warp to begin + if (do_load_order_arrive) { + load_order_barrier.arrive(); + do_load_order_arrive = false; + } + // Get next work tile + auto [next_work_tile_info, increment_pipe] = scheduler.fetch_next_work( + work_tile_info, scheduler_pipeline, scheduler_pipe_consumer_state); + + work_tile_info = next_work_tile_info; + if constexpr (IsSchedDynamicPersistent) { + requires_clc_query = increment_pipe; + if (increment_pipe) { + ++scheduler_pipe_consumer_state; + } + } + } // Scheduler work fetch loop + + // Make sure all Consumer Warp Groups have been waited upon + collective_mainloop.load_tail(mainloop_pipeline, mainloop_pipe_producer_state); + + } else if (producer_warp_role == ProducerWarpRole::MainloopAux) { + if constexpr (IsMainloopAuxiliaryLoadNeeded) { + while (work_tile_info.is_valid()) { + if (!TileScheduler::valid_warpgroup_in_work_tile(work_tile_info)) { + auto [next_work_tile_info, increment_pipe] = + scheduler.fetch_next_work(work_tile_info); + work_tile_info = next_work_tile_info; + continue; + } + + // Compute m_coord, n_coord, l_coord with the post-tiled m-shape and n-shape + auto m_coord = cute::idx2crd(work_tile_info.M_idx, cute::shape<2>(gA_mkl)); + auto n_coord = + cute::idx2crd(work_tile_info.N_idx, cute::shape<2>(gB0_nkl)); + auto l_coord = + cute::idx2crd(work_tile_info.L_idx, cute::shape<4>(gB0_nkl)); + auto blk_coord = cute::make_coord(m_coord, n_coord, cute::_, l_coord); + + // Get the number of K tiles to compute for this work as well as the starting K tile offset of the work. + auto work_k_tile_count = TileScheduler::get_work_k_tile_count( + work_tile_info, problem_shape_MNKL, blk_shape); + auto work_k_tile_start = + TileScheduler::get_work_k_tile_start(work_tile_info); + auto k_tile_iter = cute::make_coord_iterator( + cute::idx2crd(work_k_tile_start, cute::shape<3>(gA_mkl)), + cute::shape<3>(gA_mkl)); + + collective_mainloop.load_auxiliary( + params.mainloop, mainloop_pipeline, mainloop_pipe_producer_state, + load_inputs, blk_coord, k_tile_iter, work_k_tile_count, lane_idx, + block_rank_in_cluster, shared_storage.tensors.mainloop); + // Update starting pipeline state for the next tile + mainloop_pipe_producer_state.advance(work_k_tile_count); + + // Get next work tile + auto [next_work_tile_info, increment_pipe] = scheduler.fetch_next_work( + work_tile_info, scheduler_pipeline, scheduler_pipe_consumer_state); + + work_tile_info = next_work_tile_info; + } // Scheduler work fetch loop + } + } + + // Epilogue Producer Warp + else if (producer_warp_role == ProducerWarpRole::Epilogue && is_epi_load_needed) { + + // Ensure that the prefetched kernel does not touch + // unflushed global memory prior to this instruction + cutlass::arch::wait_on_dependent_grids(); + + if (!TileScheduler::requires_separate_reduction(params.scheduler) + && work_tile_info.is_valid()) { + load_order_barrier.wait(); + } + + CollectiveEpilogue collective_epilogue(params.epilogue, + shared_storage.tensors.epilogue); + + while (work_tile_info.is_valid()) { + if (TileScheduler::compute_epilogue(work_tile_info, params.scheduler)) { + // Compute m_coord, n_coord, l_coord with the post-tiled m-shape and n-shape + auto m_coord = cute::idx2crd(work_tile_info.M_idx, cute::shape<2>(gA_mkl)); + auto n_coord = + cute::idx2crd(work_tile_info.N_idx, cute::shape<2>(gB0_nkl)); + auto l_coord = + cute::idx2crd(work_tile_info.L_idx, cute::shape<4>(gB0_nkl)); + auto blk_coord = cute::make_coord(m_coord, n_coord, cute::_, l_coord); + + epi_load_pipe_producer_state = collective_epilogue.load( + epi_load_pipeline, epi_load_pipe_producer_state, problem_shape_MNKL, + blk_shape, blk_coord, tiled_mma, lane_idx, + shared_storage.tensors.epilogue, + work_tile_info.reduction_subtile_idx()); + } + + // Get next work tile + auto [next_work_tile_info, increment_pipe] = scheduler.fetch_next_work( + work_tile_info, scheduler_pipeline, scheduler_pipe_consumer_state); + work_tile_info = next_work_tile_info; + if constexpr (IsSchedDynamicPersistent) { + if (increment_pipe) { + ++scheduler_pipe_consumer_state; + } + } + } // Scheduler work fetch loop + + // Make sure all Consumer Warp Groups have been waited upon + collective_epilogue.load_tail(epi_load_pipeline, epi_load_pipe_producer_state); + } // Epilogue Producer Warp End + } // Producer Warp Group End + else if (warp_group_role == WarpGroupRole::Consumer0 + || warp_group_role == WarpGroupRole::Consumer1) { + work_tile_info = scheduler.initial_work_tile_info(ClusterShape{}); + cutlass::arch::warpgroup_reg_alloc(); + + CollectiveEpilogue collective_epilogue(params.epilogue, shared_storage.tensors.epilogue); + + // Do we potentially issue tail arrives for TMA stores, if epilogue load is waiting for it + bool do_store_tail = false; + while (work_tile_info.is_valid()) { + // Compute m_coord, n_coord, l_coord with the post-tiled m-shape and n-shape + auto m_coord = cute::idx2crd(work_tile_info.M_idx, cute::shape<2>(gA_mkl)); + auto n_coord = cute::idx2crd(work_tile_info.N_idx, cute::shape<2>(gB0_nkl)); + auto l_coord = cute::idx2crd(work_tile_info.L_idx, cute::shape<4>(gB0_nkl)); + auto blk_coord = cute::make_coord(m_coord, n_coord, cute::_, l_coord); + auto work_k_tile_count = + TileScheduler::get_work_k_tile_count(work_tile_info, problem_shape_MNKL, blk_shape); + // Allocate the accumulators for the (M,N) blk_shape + // + // MSVC CTAD breaks if we say "Tensor" here, so we use "auto" instead. + auto accumulators0 = + cute::partition_fragment_C(tiled_mma, cute::take<0, 2>(blk_shape)); // (MMA,MMA_M,MMA_N) + auto accumulators1 = + cute::partition_fragment_C(tiled_mma, cute::take<0, 2>(blk_shape)); // (MMA,MMA_M,MMA_N) + auto accumulators2 = + cute::partition_fragment_C(tiled_mma, cute::take<0, 2>(blk_shape)); // (MMA,MMA_M,MMA_N) + auto accumulators3 = + cute::partition_fragment_C(tiled_mma, cute::take<0, 2>(blk_shape)); // (MMA,MMA_M,MMA_N) + + if (TileScheduler::valid_warpgroup_in_work_tile(work_tile_info)) { + collective_mainloop.mma(mainloop_pipeline, mainloop_pipe_consumer_state, + accumulators0, accumulators1, accumulators2, + accumulators3, work_k_tile_count, mma_thread_idx, + shared_storage.tensors.mainloop, params.mainloop); + + // Make sure the math instructions are done and free buffers before entering the epilogue + collective_mainloop.mma_tail(mainloop_pipeline, mainloop_pipe_consumer_state, + work_k_tile_count); + + // Update starting mainloop pipeline state for the next tile + mainloop_pipe_consumer_state.advance(work_k_tile_count); + } + #ifdef CUTLASS_ENABLE_GDC_FOR_SM90 + if (scheduler.is_last_tile(work_tile_info)) { + // Hint on an early release of global memory resources. + // The timing of calling this function only influences performance, + // not functional correctness. + cutlass::arch::launch_dependent_grids(); + } + #endif + + // Index of warp group within consumer warp groups + int consumer_warp_group_idx = cutlass::canonical_warp_group_idx() - NumLoadWarpGroups; + + // Perform reduction across splits, if needed + TileScheduler::fixup(params.scheduler, work_tile_info, accumulators0, + NumMmaWarpGroups, consumer_warp_group_idx); + TileScheduler::fixup(params.scheduler, work_tile_info, accumulators1, + NumMmaWarpGroups, consumer_warp_group_idx); + TileScheduler::fixup(params.scheduler, work_tile_info, accumulators2, + NumMmaWarpGroups, consumer_warp_group_idx); + TileScheduler::fixup(params.scheduler, work_tile_info, accumulators3, + NumMmaWarpGroups, consumer_warp_group_idx); + + if (TileScheduler::compute_epilogue(work_tile_info, params.scheduler)) { + // Epilogue and write to gD + auto [epi_load_pipe_consumer_state_next, epi_store_pipe_producer_state_next] = + collective_epilogue.store( + epi_load_pipeline, epi_load_pipe_consumer_state, epi_store_pipeline, + epi_store_pipe_producer_state, problem_shape_MNKL, blk_shape, blk_coord, + accumulators0, accumulators1, accumulators2, accumulators3, tiled_mma, + mma_thread_idx, shared_storage.tensors.epilogue, + work_tile_info.reduction_subtile_idx()); + epi_load_pipe_consumer_state = epi_load_pipe_consumer_state_next; + epi_store_pipe_producer_state = epi_store_pipe_producer_state_next; + do_store_tail = true; + } + + // Get next work tile + auto [next_work_tile_info, increment_pipe] = scheduler.fetch_next_work( + work_tile_info, scheduler_pipeline, scheduler_pipe_consumer_state); + work_tile_info = next_work_tile_info; + if constexpr (IsSchedDynamicPersistent) { + if (increment_pipe) { + ++scheduler_pipe_consumer_state; + } + } + } // Scheduler work fetch loop + + if (do_store_tail) { + collective_epilogue.store_tail(epi_load_pipeline, epi_load_pipe_consumer_state, + epi_store_pipeline, epi_store_pipe_producer_state); + } + } // Consumer Warp Groups End +#endif + } + + // Convert to underlying arguments. In this case, a simple copy for the aliased type. + static Params to_underlying_arguments(Arguments const& args, void* workspace) + { + CUTLASS_TRACE_HOST("to_underlying_arguments():"); + + auto problem_shape = args.problem_shape; + if constexpr (cutlass::gemm::kernel::detail::Has_SwapAB_v) { + // swap M/N + cute::get<0>(problem_shape) = cute::get<1>(args.problem_shape); + cute::get<1>(problem_shape) = cute::get<0>(args.problem_shape); + } + auto problem_shape_MNKL = cute::append<4>(problem_shape, 1); + + // Get SM count if needed, otherwise use user supplied SM count + int sm_count = args.hw_info.sm_count; + if (sm_count <= 0) { + CUTLASS_TRACE_HOST( + " WARNING: Arguments do not include a valid SM count.\n" + " For optimal performance, populate the arguments KernelHardwareInfo struct with " + "the SM count."); + sm_count = + cutlass::KernelHardwareInfo::query_device_multiprocessor_count(args.hw_info.device_id); + } + CUTLASS_TRACE_HOST("to_underlying_arguments(): Setting persistent grid SM count to " + << sm_count); + + // Get maximum number of clusters that could co-exist on the target device + int max_active_clusters = args.hw_info.max_active_clusters; + if (max_active_clusters <= 0) { + max_active_clusters = 0; + CUTLASS_TRACE_HOST( + " WARNING: Arguments do not include a valid max cluster count.\n" + " For optimal performance, populate the arguments KernelHardwareInfo struct with " + "the max_active_clusters."); + } else { + CUTLASS_TRACE_HOST( + "to_underlying_arguments(): Setting persistent grid cluster count to " + << max_active_clusters); + } + + cutlass::KernelHardwareInfo hw_info{ args.hw_info.device_id, sm_count, max_active_clusters }; + + // Calculate workspace pointers + uint8_t* workspace_ptr = reinterpret_cast(workspace); + size_t workspace_offset = 0; + + void* epilogue_workspace = workspace_ptr + workspace_offset; + workspace_offset += CollectiveEpilogue::get_workspace_size(args.problem_shape, args.epilogue); + workspace_offset = cutlass::round_nearest(workspace_offset, cutlass::MinWorkspaceAlignment); + + void* scheduler_workspace = workspace_ptr + workspace_offset; + workspace_offset += + TileScheduler::template get_workspace_size( + args.scheduler, args.problem_shape, args.hw_info, NumMmaWarpGroups); + workspace_offset = cutlass::round_nearest(workspace_offset, cutlass::MinWorkspaceAlignment); + + void* mainloop_workspace = nullptr; + // Precompute the sub tiles numbers in epilogue, pass into tile scheduler. Therefore it will be used + // in separate reduction scheme for streamk case, NumEpilogueSubTiles default value is 1, which means + // subtile will not be used, therefore separate reduction will not be enabled. + constexpr uint32_t NumEpilogueSubTiles = + CollectiveEpilogue::get_store_pipe_increment(TileShape{}); + TileSchedulerParams scheduler = TileScheduler::to_underlying_arguments( + problem_shape_MNKL, TileShape{}, ClusterShape{}, hw_info, args.scheduler, + scheduler_workspace, NumEpilogueSubTiles); + + return { args.mode, + problem_shape, + CollectiveMainloop::to_underlying_arguments(args.problem_shape, args.mainloop, + mainloop_workspace), + CollectiveEpilogue::to_underlying_arguments(args.problem_shape, args.epilogue, + epilogue_workspace), + hw_info, + scheduler, + workspace }; + } +}; diff --git a/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_mma_tma_gmma_ss_warpspecialized_quad.h b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_mma_tma_gmma_ss_warpspecialized_quad.h new file mode 100644 index 0000000..4e3350c --- /dev/null +++ b/src/layers/extensions/inference/cutlass/sm90_quad_gemm/sm90_mma_tma_gmma_ss_warpspecialized_quad.h @@ -0,0 +1,729 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +// clang-format on + +/** + * These 1 classes/structs are rewritten: + * 1. cutlass::gemm::collective::CollectiveMma -> QuadCollectiveMma + */ + +// Primary template declaration to enable partial/specialized definitions below. +template +struct QuadCollectiveMma { + static_assert(cutlass::detail::dependent_false, + "Could not find a mainloop specialization."); +}; + +// Original file: cutlass/gemm/collective/sm90_mma_tma_gmma_ss_warpspecialized.hpp +// to add multiple accumulators to mma +// WarpSpecialized Mainloop +template +struct QuadCollectiveMma< + cutlass::gemm::MainloopSm90TmaGmmaWarpSpecialized, + TileShape_, ElementA_, StrideA_, ElementB_, StrideB_, TiledMma_, GmemTiledCopyA_, SmemLayoutAtomA_, + SmemCopyAtomA_, TransformA_, GmemTiledCopyB_, SmemLayoutAtomB_, SmemCopyAtomB_, TransformB_> { + // + // Type Aliases + // + using DispatchPolicy = + cutlass::gemm::MainloopSm90TmaGmmaWarpSpecialized; + using TileShape = TileShape_; + using ElementA = ElementA_; + using StrideA = StrideA_; + using ElementB = ElementB_; + using StrideB = StrideB_; + using TiledMma = TiledMma_; + using ElementAccumulator = typename TiledMma::ValTypeC; + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomA = SmemLayoutAtomA_; + using SmemLayoutAtomB = SmemLayoutAtomB_; + using SmemCopyAtomA = SmemCopyAtomA_; + using SmemCopyAtomB = SmemCopyAtomB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + using ArchTag = typename DispatchPolicy::ArchTag; + + using CtaShape_MNK = decltype(shape_div(TileShape{}, ClusterShape{})); + using MainloopPipeline = cutlass::PipelineTmaAsync; + using PipelineState = cutlass::PipelineState; + + using PipelineParams = typename MainloopPipeline::Params; + + // One threads per CTA are producers (1 for operand tile) + static constexpr int NumProducerThreadEvents = 1; + + static_assert(cute::rank(SmemLayoutAtomA{}) == 2, "SmemLayoutAtom must be rank 2 (M/N, K)"); + static_assert((cute::size<0>(TileShape{}) % cute::size<0>(SmemLayoutAtomA{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert((cute::size<2>(TileShape{}) % cute::size<1>(SmemLayoutAtomA{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + + static_assert(cute::rank(SmemLayoutAtomB{}) == 2, "SmemLayoutAtom must be rank 2 (M/N, K)"); + static_assert((cute::size<1>(TileShape{}) % cute::size<0>(SmemLayoutAtomB{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert((cute::size<2>(TileShape{}) % cute::size<1>(SmemLayoutAtomB{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + + // Tile along modes in a way that maximizes the TMA box size. + using SmemLayoutA = decltype(cute::tile_to_shape( + SmemLayoutAtomA{}, + cute::make_shape(cute::shape<0>(TileShape{}), cute::shape<2>(TileShape{}), + cute::Int{}), + cute::conditional_t<::cutlass::gemm::detail::is_major<0, StrideA>(), + cute::Step, + cute::Step>{})); + using SmemLayoutB = decltype(cute::tile_to_shape( + SmemLayoutAtomB{}, + cute::make_shape(cute::shape<1>(TileShape{}), cute::shape<2>(TileShape{}), + cute::Int{}), + cute::conditional_t<::cutlass::gemm::detail::is_major<0, StrideB>(), + cute::Step, + cute::Step>{})); + + static_assert(DispatchPolicy::Stages >= 2, + "Specialization requires Stages set to value 2 or more."); + static_assert(cute::is_base_of::value + && cute::is_base_of::value, + "MMA atom must source both A and B operand from smem_desc for this mainloop."); + static_assert(cute::is_same_v + || cute::is_same_v, + "GmemTiledCopy - invalid SM90 TMA copy atom specified."); + static_assert(cute::is_same_v + || cute::is_same_v, + "GmemTiledCopy - invalid SM90 TMA copy atom specified."); + + // TMA converts f32 input to tf32 when copying from GMEM to SMEM + // For all other types, cast to size equivalent uint type to avoid any rounding by TMA. + static constexpr bool ConvertF32toTF32A = cute::is_same_v; + static constexpr bool ConvertF32toTF32B = cute::is_same_v; + using InternalElementA = cute::conditional_t>>; + using InternalElementB = cute::conditional_t>>; + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, cute::_0> { + cute::array_aligned> smem_A; + cute::array_aligned> smem_B0; + cute::array_aligned> smem_B1; + cute::array_aligned> smem_B2; + cute::array_aligned> smem_B3; + } tensors; + + using PipelineStorage = typename MainloopPipeline::SharedStorage; + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using PipelineStorage = typename SharedStorage::PipelineStorage; + + // Host side kernel arguments + struct Arguments { + ElementA const* ptr_A; + StrideA dA; + ElementB const* ptr_B0; + ElementB const* ptr_B1; + ElementB const* ptr_B2; + ElementB const* ptr_B3; + StrideB dB; + uint32_t mma_promotion_interval = 4; + }; + + // Device side kernel params + struct Params { + // Assumption: StrideA is congruent with Problem_MK + using TMA_A = decltype(cute::make_tma_copy_A_sm90( + GmemTiledCopyA{}, + cute::make_tensor(static_cast(nullptr), + repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(cute::_, cute::_, cute::_0{}), TileShape{}, ClusterShape{})); + // Assumption: StrideB is congruent with Problem_NK + using TMA_B = decltype(cute::make_tma_copy_B_sm90( + GmemTiledCopyB{}, + cute::make_tensor(static_cast(nullptr), + repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(cute::_, cute::_, cute::_0{}), TileShape{}, ClusterShape{})); + TMA_A tma_load_a; + TMA_B tma_load_b0; + TMA_B tma_load_b1; + TMA_B tma_load_b2; + TMA_B tma_load_b3; + + uint32_t tma_transaction_bytes = TmaTransactionBytes; + uint32_t tma_transaction_bytes_mk = TmaTransactionBytesMK; + uint32_t tma_transaction_bytes_nk = TmaTransactionBytesNK; + }; + + // + // Methods + // + + template + static bool can_implement(ProblemShape const& problem_shape, [[maybe_unused]] Arguments const& args) + { + constexpr int tma_alignment_bits = 128; + auto problem_shape_MNKL = cute::append<4>(problem_shape, 1); + auto [M, N, K, L] = problem_shape_MNKL; + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = + tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable + && cutlass::detail::check_alignment( + cute::make_shape(M, K, L), StrideA{}); + constexpr int min_tma_aligned_elements_B = + tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable + && cutlass::detail::check_alignment( + cute::make_shape(N, K, L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST( + " CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for " + "TMA.\n"); + } + return implementable; + } + + static constexpr int K_PIPE_MAX = DispatchPolicy::Stages; + static constexpr int K_PIPE_MMAS = 1; + static constexpr uint32_t TmaTransactionBytesMK = + cutlass::bits_to_bytes(cute::size<0>(SmemLayoutA{}) * cute::size<1>(SmemLayoutA{}) + * static_cast(cutlass::sizeof_bits::value)); + static constexpr uint32_t TmaTransactionBytesNK = + cutlass::bits_to_bytes(cute::size<0>(SmemLayoutB{}) * cute::size<1>(SmemLayoutB{}) + * static_cast(cutlass::sizeof_bits::value)); + static constexpr uint32_t TmaTransactionBytes = TmaTransactionBytesMK + TmaTransactionBytesNK * 4; + + /// Perform a collective-scoped matrix multiply-accumulate + /// Producer Perspective + template + CUTLASS_DEVICE void + load(Params const& mainloop_params, MainloopPipeline pipeline, PipelineState smem_pipe_write, + cute::tuple const& load_inputs, + BlockCoord const& blk_coord, KTileIterator k_tile_iter, int k_tile_count, int thread_idx, + uint32_t block_rank_in_cluster, TensorStorage& shared_tensors) + { + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + cute::Tensor sA = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_A.data()), + SmemLayoutA{}); // (BLK_M,BLK_K,PIPE) + cute::Tensor sB0 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B0.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + cute::Tensor sB1 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B1.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + cute::Tensor sB2 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B2.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + cute::Tensor sB3 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B3.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + + // + // Prepare the TMA loads for A and B + // + + constexpr uint32_t cluster_shape_x = cute::get<0>(typename DispatchPolicy::ClusterShape()); + uint2 cluster_local_block_id = { block_rank_in_cluster % cluster_shape_x, + block_rank_in_cluster / cluster_shape_x }; + + cute::Tensor gA_mkl = cute::get<0>(load_inputs); + cute::Tensor gB0_nkl = cute::get<1>(load_inputs); + cute::Tensor gB1_nkl = cute::get<2>(load_inputs); + cute::Tensor gB2_nkl = cute::get<3>(load_inputs); + cute::Tensor gB3_nkl = cute::get<4>(load_inputs); + + auto block_tma_a = mainloop_params.tma_load_a.get_slice(cluster_local_block_id.y); + auto block_tma_b0 = mainloop_params.tma_load_b0.get_slice(cluster_local_block_id.x); + auto block_tma_b1 = mainloop_params.tma_load_b1.get_slice(cluster_local_block_id.x); + auto block_tma_b2 = mainloop_params.tma_load_b2.get_slice(cluster_local_block_id.x); + auto block_tma_b3 = mainloop_params.tma_load_b3.get_slice(cluster_local_block_id.x); + + // Partition the inputs based on the current block coordinates. + auto [m_coord, n_coord, k_coord, l_coord] = blk_coord; + cute::Tensor gA = gA_mkl(cute::_, cute::_, m_coord, cute::_, l_coord); // (BLK_M,BLK_K,k) + cute::Tensor gB0 = gB0_nkl(cute::_, cute::_, n_coord, cute::_, l_coord); // (BLK_N,BLK_K,k) + cute::Tensor gB1 = gB1_nkl(cute::_, cute::_, n_coord, cute::_, l_coord); // (BLK_N,BLK_K,k) + cute::Tensor gB2 = gB2_nkl(cute::_, cute::_, n_coord, cute::_, l_coord); // (BLK_N,BLK_K,k) + cute::Tensor gB3 = gB3_nkl(cute::_, cute::_, n_coord, cute::_, l_coord); // (BLK_N,BLK_K,k) + + // Applies the mapping from block_tma_a + cute::Tensor tAgA = block_tma_a.partition_S(gA); // (TMA,TMA_M,TMA_K,k) + cute::Tensor tAsA = block_tma_a.partition_D(sA); // (TMA,TMA_M,TMA_K,PIPE) + + cute::Tensor tBgB0 = block_tma_b0.partition_S(gB0); // (TMA,TMA_N,TMA_K,k) + cute::Tensor tBsB0 = block_tma_b0.partition_D(sB0); // (TMA,TMA_N,TMA_K,PIPE) + cute::Tensor tBgB1 = block_tma_b1.partition_S(gB1); // (TMA,TMA_N,TMA_K,k) + cute::Tensor tBsB1 = block_tma_b1.partition_D(sB1); // (TMA,TMA_N,TMA_K,PIPE) + cute::Tensor tBgB2 = block_tma_b2.partition_S(gB2); // (TMA,TMA_N,TMA_K,k) + cute::Tensor tBsB2 = block_tma_b2.partition_D(sB2); // (TMA,TMA_N,TMA_K,PIPE) + cute::Tensor tBgB3 = block_tma_b3.partition_S(gB3); // (TMA,TMA_N,TMA_K,k) + cute::Tensor tBsB3 = block_tma_b3.partition_D(sB3); // (TMA,TMA_N,TMA_K,PIPE) + + uint16_t mcast_mask_a = 0; + uint16_t mcast_mask_b = 0; + + // Issue TmaLoads + // Maps the tile -> block, value + if constexpr (cute::is_same_v) { + auto block_layout = + cute::Layout{}; // (m,n) -> block_id + for (int n = 0; n < cute::size<1>(block_layout); ++n) { + mcast_mask_a |= + (uint16_t(1) << block_layout(cluster_local_block_id.x, n, cute::_0{})); + } + } + + if constexpr (cute::is_same_v) { + auto block_layout = + cute::Layout{}; // (m,n) -> block_id + for (int m = 0; m < cute::size<0>(block_layout); ++m) { + mcast_mask_b |= + (uint16_t(1) << block_layout(m, cluster_local_block_id.y, cute::_0{})); + } + } + + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (; k_tile_count > 0; --k_tile_count) { + // LOCK smem_pipe_write for _writing_ + pipeline.producer_acquire(smem_pipe_write); + + // + // Copy gmem to smem for *k_tile_iter + // + + using BarrierType = typename MainloopPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(smem_pipe_write); + + int write_stage = smem_pipe_write.index(); + copy(mainloop_params.tma_load_a.with(*tma_barrier, mcast_mask_a), + tAgA(cute::_, cute::_, cute::_, *k_tile_iter), + tAsA(cute::_, cute::_, cute::_, write_stage)); + copy(mainloop_params.tma_load_b0.with(*tma_barrier, mcast_mask_b), + tBgB0(cute::_, cute::_, cute::_, *k_tile_iter), + tBsB0(cute::_, cute::_, cute::_, write_stage)); + copy(mainloop_params.tma_load_b1.with(*tma_barrier, mcast_mask_b), + tBgB1(cute::_, cute::_, cute::_, *k_tile_iter), + tBsB1(cute::_, cute::_, cute::_, write_stage)); + copy(mainloop_params.tma_load_b2.with(*tma_barrier, mcast_mask_b), + tBgB2(cute::_, cute::_, cute::_, *k_tile_iter), + tBsB2(cute::_, cute::_, cute::_, write_stage)); + copy(mainloop_params.tma_load_b3.with(*tma_barrier, mcast_mask_b), + tBgB3(cute::_, cute::_, cute::_, *k_tile_iter), + tBsB3(cute::_, cute::_, cute::_, write_stage)); + + ++k_tile_iter; + + // Advance smem_pipe_write + ++smem_pipe_write; + } + } + } + + /// Set up the data needed by this collective for load and mma. + /// Returns a tuple of tensors. The collective and the kernel layer have the contract + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_mkl - The tma tensor, A after a local tile so it has shape (BLK_M,BLK_K,m,k,l) + /// gB0_nkl - The tma tensor, B after a local tile so it has shape (BLK_N,BLK_K,n,k,l) + /// gB1_nkl - The tma tensor, B after a local tile so it has shape (BLK_N,BLK_K,n,k,l) + /// gB2_nkl - The tma tensor, B after a local tile so it has shape (BLK_N,BLK_K,n,k,l) + /// gB3_nkl - The tma tensor, B after a local tile so it has shape (BLK_N,BLK_K,n,k,l) + + /// The rest of the tensors can be specified as needed by this collective. + template + CUTLASS_DEVICE auto load_init(ProblemShape_MNKL const& problem_shape_MNKL, + Params const& mainloop_params) const + { + // Separate out problem shape for convenience + auto [M, N, K, L] = problem_shape_MNKL; + + // TMA requires special handling of strides to deal with coord codomain mapping + // Represent the full tensors -- get these from TMA + cute::Tensor mA_mkl = + mainloop_params.tma_load_a.get_tma_tensor(cute::make_shape(M, K, L)); // (m,k,l) + cute::Tensor mB0_nkl = + mainloop_params.tma_load_b0.get_tma_tensor(cute::make_shape(N, K, L)); // (n,k,l) + cute::Tensor mB1_nkl = + mainloop_params.tma_load_b1.get_tma_tensor(cute::make_shape(N, K, L)); // (n,k,l) + cute::Tensor mB2_nkl = + mainloop_params.tma_load_b2.get_tma_tensor(cute::make_shape(N, K, L)); // (n,k,l) + cute::Tensor mB3_nkl = + mainloop_params.tma_load_b3.get_tma_tensor(cute::make_shape(N, K, L)); // (n,k,l) + + // Make tiled views, defer the slice + cute::Tensor gA_mkl = + cute::local_tile(mA_mkl, TileShape{}, make_coord(cute::_, cute::_, cute::_), + cute::Step{}); // (BLK_M,BLK_K,m,k,l) + cute::Tensor gB0_nkl = + cute::local_tile(mB0_nkl, TileShape{}, make_coord(cute::_, cute::_, cute::_), + cute::Step{}); // (BLK_N,BLK_K,n,k,l) + cute::Tensor gB1_nkl = + cute::local_tile(mB1_nkl, TileShape{}, make_coord(cute::_, cute::_, cute::_), + cute::Step{}); // (BLK_N,BLK_K,n,k,l) + cute::Tensor gB2_nkl = + cute::local_tile(mB2_nkl, TileShape{}, make_coord(cute::_, cute::_, cute::_), + cute::Step{}); // (BLK_N,BLK_K,n,k,l) + cute::Tensor gB3_nkl = + cute::local_tile(mB3_nkl, TileShape{}, make_coord(cute::_, cute::_, cute::_), + cute::Step{}); // (BLK_N,BLK_K,n,k,l) + + return cute::make_tuple(gA_mkl, gB0_nkl, gB1_nkl, gB2_nkl, gB3_nkl); + } + + /// Perform a Producer Epilogue to prevent early exit of blocks in a Cluster + CUTLASS_DEVICE void load_tail(MainloopPipeline pipeline, PipelineState smem_pipe_write) + { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline.producer_tail(smem_pipe_write); + } + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template + CUTLASS_DEVICE void mma(MainloopPipeline pipeline, PipelineState smem_pipe_read, + FrgTensorC& accum0, FrgTensorC& accum1, FrgTensorC& accum2, + FrgTensorC& accum3, int k_tile_count, int thread_idx, + TensorStorage& shared_tensors, Params const& mainloop_params) + { + static_assert(cute::is_rmem::value, "C tensor must be rmem resident."); + static_assert(cute::rank(SmemLayoutA{}) == 3, "Smem layout must be rank 3."); + static_assert(cute::rank(SmemLayoutB{}) == 3, "Smem layout must be rank 3."); + static_assert( + cute::is_void_v, + "SM90 GMMA mainloops cannot have a non-void copy atom for smem sourced instructions."); + static_assert( + cute::is_void_v, + "SM90 GMMA mainloops cannot have a non-void copy atom for smem sourced instructions."); + + cute::Tensor sA = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_A.data()), + SmemLayoutA{}); // (BLK_M,BLK_K,PIPE) + cute::Tensor sB0 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B0.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + cute::Tensor sB1 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B1.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + cute::Tensor sB2 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B2.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + cute::Tensor sB3 = cute::make_tensor(cute::make_smem_ptr(shared_tensors.smem_B3.data()), + SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + + // + // Define C accumulators and A/B partitioning + // + + // Layout of warp group to thread mapping + + static_assert( + cute::stride<0>(typename TiledMma::ALayout{}) == 0 + and cute::stride<0>(typename TiledMma::BLayout{}) == 0 + and cute::size<0>(typename TiledMma::ALayout{}) == cutlass::NumThreadsPerWarpGroup + and cute::size<0>(typename TiledMma::BLayout{}) == cutlass::NumThreadsPerWarpGroup, + "Stride of the first mode must be 0 and the size of the mode must be " + "cutlass::NumThreadsPerWarpGroup"); + + constexpr int MmaWarpGroups = cute::size(TiledMma{}) / cutlass::NumThreadsPerWarpGroup; + cute::Layout warp_group_thread_layout = cute::make_layout( + cute::Int{}, cute::Int{}); + + int warp_group_idx = __shfl_sync(0xFFFFFFFF, thread_idx / cutlass::NumThreadsPerWarpGroup, 0); + + TiledMma tiled_mma; + auto thread_mma = tiled_mma.get_slice(warp_group_thread_layout(warp_group_idx)); + + cute::Tensor tCsA = thread_mma.partition_A(sA); // (MMA,MMA_M,MMA_K,PIPE) + cute::Tensor tCsB0 = thread_mma.partition_B(sB0); // (MMA,MMA_N,MMA_K,PIPE) + cute::Tensor tCsB1 = thread_mma.partition_B(sB1); // (MMA,MMA_N,MMA_K,PIPE) + cute::Tensor tCsB2 = thread_mma.partition_B(sB2); // (MMA,MMA_N,MMA_K,PIPE) + cute::Tensor tCsB3 = thread_mma.partition_B(sB3); // (MMA,MMA_N,MMA_K,PIPE) + + // Allocate "fragments/descriptors" + cute::Tensor tCrA = thread_mma.make_fragment_A(tCsA); // (MMA,MMA_M,MMA_K,PIPE) + cute::Tensor tCrB0 = thread_mma.make_fragment_B(tCsB0); // (MMA,MMA_N,MMA_K,PIPE) + cute::Tensor tCrB1 = thread_mma.make_fragment_B(tCsB1); // (MMA,MMA_N,MMA_K,PIPE) + cute::Tensor tCrB2 = thread_mma.make_fragment_B(tCsB2); // (MMA,MMA_N,MMA_K,PIPE) + cute::Tensor tCrB3 = thread_mma.make_fragment_B(tCsB3); // (MMA,MMA_N,MMA_K,PIPE) + + CUTE_STATIC_ASSERT_V(cute::size<1>(tCsA) == cute::size<1>(accum0)); // M + CUTE_STATIC_ASSERT_V(cute::size<1>(tCsB0) == cute::size<2>(accum0)); // N + CUTE_STATIC_ASSERT_V(cute::size<1>(tCsB1) == cute::size<2>(accum1)); // N + CUTE_STATIC_ASSERT_V(cute::size<1>(tCsB2) == cute::size<2>(accum2)); // N + CUTE_STATIC_ASSERT_V(cute::size<1>(tCsB3) == cute::size<2>(accum3)); // N + + CUTE_STATIC_ASSERT_V(cute::size<2>(tCsA) == cute::size<2>(tCsB0)); // K + CUTE_STATIC_ASSERT_V(cute::size<2>(tCsA) == cute::size<2>(tCsB1)); // K + CUTE_STATIC_ASSERT_V(cute::size<2>(tCsA) == cute::size<2>(tCsB2)); // K + CUTE_STATIC_ASSERT_V(cute::size<2>(tCsA) == cute::size<2>(tCsB3)); // K + + CUTE_STATIC_ASSERT_V(cute::size<3>(tCsA) == cute::size<3>(tCsB0)); // PIPE + CUTE_STATIC_ASSERT_V(cute::size<3>(tCsA) == cute::size<3>(tCsB1)); // PIPE + CUTE_STATIC_ASSERT_V(cute::size<3>(tCsA) == cute::size<3>(tCsB2)); // PIPE + CUTE_STATIC_ASSERT_V(cute::size<3>(tCsA) == cute::size<3>(tCsB3)); // PIPE + + CUTE_STATIC_ASSERT_V(cute::Int{} == cute::size<2>(sA)); // PIPE + CUTE_STATIC_ASSERT_V(cute::Int{} == cute::size<2>(sB0)); // PIPE + CUTE_STATIC_ASSERT_V(cute::Int{} == cute::size<2>(sB1)); // PIPE + CUTE_STATIC_ASSERT_V(cute::Int{} == cute::size<2>(sB2)); // PIPE + CUTE_STATIC_ASSERT_V(cute::Int{} == cute::size<2>(sB3)); // PIPE + + // + // PIPELINED MAIN LOOP + // + static_assert((0 <= K_PIPE_MMAS) && (K_PIPE_MMAS < K_PIPE_MAX), + "ERROR : Incorrect number of MMAs in flight"); + + // We release buffers to producer warps(dma load) with some mmas in flight + cutlass::PipelineState smem_pipe_release = smem_pipe_read; + + // Prologue GMMAs + int prologue_mma_count = min(K_PIPE_MMAS, k_tile_count); + assert(k_tile_count >= 1); + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::Zero; + cute::warpgroup_fence_operand(accum0); + cute::warpgroup_fence_operand(accum1); + cute::warpgroup_fence_operand(accum2); + cute::warpgroup_fence_operand(accum3); + { + // WAIT on smem_pipe_read until its data are available (phase bit flips from rdPhaseBit value) + auto barrier_token = pipeline.consumer_try_wait(smem_pipe_read); + pipeline.consumer_wait(smem_pipe_read, barrier_token); + + int read_stage = smem_pipe_read.index(); + cute::warpgroup_arrive(); + + // Unroll the K mode manually to set scale D to 1 (B0) + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::Zero; + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < cute::size<2>(tCrA); ++k_block) { + // (V,M,K) x (V,N,K) => (V,M,N) + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB0(cute::_, cute::_, k_block, read_stage), accum0); + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::One; + } + + // Unroll the K mode manually to set scale D to 1 (B1) + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::Zero; + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < cute::size<2>(tCrA); ++k_block) { + // (V,M,K) x (V,N,K) => (V,M,N) + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB1(cute::_, cute::_, k_block, read_stage), accum1); + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::One; + } + + // Unroll the K mode manually to set scale D to 1 (B2) + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::Zero; + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < cute::size<2>(tCrA); ++k_block) { + // (V,M,K) x (V,N,K) => (V,M,N) + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB2(cute::_, cute::_, k_block, read_stage), accum2); + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::One; + } + + // Unroll the K mode manually to set scale D to 1 (B3) + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::Zero; + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < cute::size<2>(tCrA); ++k_block) { + // (V,M,K) x (V,N,K) => (V,M,N) + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB3(cute::_, cute::_, k_block, read_stage), accum3); + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::One; + } + + cute::warpgroup_commit_batch(); + + ++smem_pipe_read; + } + + tiled_mma.accumulate_ = cute::GMMA::ScaleOut::One; + + cute::warpgroup_fence_operand(accum0); + cute::warpgroup_fence_operand(accum1); + cute::warpgroup_fence_operand(accum2); + cute::warpgroup_fence_operand(accum3); + + CUTLASS_PRAGMA_UNROLL + for (int k_tile_prologue = prologue_mma_count - 1; k_tile_prologue > 0; --k_tile_prologue) { + // WAIT on smem_pipe_read until its data are available (phase bit flips from rdPhaseBit value) + auto barrier_token = pipeline.consumer_try_wait(smem_pipe_read); + pipeline.consumer_wait(smem_pipe_read, barrier_token); + + int read_stage = smem_pipe_read.index(); + cute::warpgroup_arrive(); + // (V,M,K) x (V,N,K) => (V,M,N) + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, cute::_, read_stage), + tCrB0(cute::_, cute::_, cute::_, read_stage), accum0); + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, cute::_, read_stage), + tCrB1(cute::_, cute::_, cute::_, read_stage), accum1); + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, cute::_, read_stage), + tCrB2(cute::_, cute::_, cute::_, read_stage), accum2); + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, cute::_, read_stage), + tCrB3(cute::_, cute::_, cute::_, read_stage), accum3); + + cute::warpgroup_commit_batch(); + + ++smem_pipe_read; + } + + cute::warpgroup_fence_operand(accum0); + cute::warpgroup_fence_operand(accum1); + cute::warpgroup_fence_operand(accum2); + cute::warpgroup_fence_operand(accum3); + + // Mainloop GMMAs + k_tile_count -= prologue_mma_count; + + CUTLASS_PRAGMA_NO_UNROLL + for (; k_tile_count > 0; --k_tile_count) { + // WAIT on smem_pipe_read until its data are available (phase bit flips from rdPhaseBit value) + auto barrier_token = pipeline.consumer_try_wait(smem_pipe_read); + pipeline.consumer_wait(smem_pipe_read, barrier_token); + + // + // Compute on k_tile + // + + int read_stage = smem_pipe_read.index(); + cute::warpgroup_fence_operand(accum0); + cute::warpgroup_fence_operand(accum1); + cute::warpgroup_fence_operand(accum2); + cute::warpgroup_fence_operand(accum3); + + cute::warpgroup_arrive(); + // (V,M,K) x (V,N,K) => (V,M,N) + + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < cute::size<2>(tCrA); ++k_block) { + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB0(cute::_, cute::_, k_block, read_stage), accum0); + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB1(cute::_, cute::_, k_block, read_stage), accum1); + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB2(cute::_, cute::_, k_block, read_stage), accum2); + cute::gemm(tiled_mma, tCrA(cute::_, cute::_, k_block, read_stage), + tCrB3(cute::_, cute::_, k_block, read_stage), accum3); + } + cute::warpgroup_commit_batch(); + + /// Wait on the GMMA barrier for K_PIPE_MMAS (or fewer) outstanding to ensure smem_pipe_write is consumed + cute::warpgroup_wait(); + cute::warpgroup_fence_operand(accum0); + cute::warpgroup_fence_operand(accum1); + cute::warpgroup_fence_operand(accum2); + cute::warpgroup_fence_operand(accum3); + + // UNLOCK smem_pipe_release, done _computing_ on it + pipeline.consumer_release(smem_pipe_release); + + // Advance smem_pipe_read and smem_pipe_release + ++smem_pipe_read; + ++smem_pipe_release; + } + + cute::warpgroup_fence_operand(accum0); + cute::warpgroup_fence_operand(accum1); + cute::warpgroup_fence_operand(accum2); + cute::warpgroup_fence_operand(accum3); + } + + /// Perform a Consumer Epilogue to release all buffers + CUTLASS_DEVICE void mma_tail(MainloopPipeline pipeline, PipelineState smem_pipe_release, + int k_tile_count) + { + // Prologue GMMAs + int prologue_mma_count = min(K_PIPE_MMAS, k_tile_count); + k_tile_count -= prologue_mma_count; + + smem_pipe_release.advance(k_tile_count); + + // Wait on all GMMAs to complete + cute::warpgroup_wait<0>(); + + for (int count = 0; count < prologue_mma_count; ++count) { + pipeline.consumer_release( + smem_pipe_release); // UNLOCK smem_pipe_release, done _computing_ on it + ++smem_pipe_release; + } + } + + /// Issue Tma Descriptor Prefetch -- ideally from a single thread for best performance + CUTLASS_DEVICE + static void prefetch_tma_descriptors(Params const& mainloop_params) + { + cute::prefetch_tma_descriptor(mainloop_params.tma_load_a.get_tma_descriptor()); + cute::prefetch_tma_descriptor(mainloop_params.tma_load_b0.get_tma_descriptor()); + cute::prefetch_tma_descriptor(mainloop_params.tma_load_b1.get_tma_descriptor()); + cute::prefetch_tma_descriptor(mainloop_params.tma_load_b2.get_tma_descriptor()); + cute::prefetch_tma_descriptor(mainloop_params.tma_load_b3.get_tma_descriptor()); + } + + template + static constexpr Params to_underlying_arguments(ProblemShape const& problem_shape, + Arguments const& args, void* workspace) + { + (void)workspace; + + // Optionally append 1s until problem shape is rank-4 (MNKL), in case it is only rank-3 (MNK) + auto problem_shape_MNKL = cute::append<4>(problem_shape, 1); + auto [M, N, K, L] = problem_shape_MNKL; + + auto ptr_A = reinterpret_cast(args.ptr_A); + auto ptr_B0 = reinterpret_cast(args.ptr_B0); + auto ptr_B1 = reinterpret_cast(args.ptr_B1); + auto ptr_B2 = reinterpret_cast(args.ptr_B2); + auto ptr_B3 = reinterpret_cast(args.ptr_B3); + + cute::Tensor tensor_a = + cute::make_tensor(ptr_A, cute::make_layout(cute::make_shape(M, K, L), args.dA)); + cute::Tensor tensor_b0 = + cute::make_tensor(ptr_B0, cute::make_layout(cute::make_shape(N, K, L), args.dB)); + cute::Tensor tensor_b1 = + cute::make_tensor(ptr_B1, cute::make_layout(cute::make_shape(N, K, L), args.dB)); + cute::Tensor tensor_b2 = + cute::make_tensor(ptr_B2, cute::make_layout(cute::make_shape(N, K, L), args.dB)); + cute::Tensor tensor_b3 = + cute::make_tensor(ptr_B3, cute::make_layout(cute::make_shape(N, K, L), args.dB)); + + typename Params::TMA_A tma_load_a = cute::make_tma_copy_A_sm90( + GmemTiledCopyA{}, tensor_a, SmemLayoutA{}(cute::_, cute::_, cute::_0{}), TileShape{}, + ClusterShape{}); + typename Params::TMA_B tma_load_b0 = cute::make_tma_copy_B_sm90( + GmemTiledCopyB{}, tensor_b0, SmemLayoutB{}(cute::_, cute::_, cute::_0{}), TileShape{}, + ClusterShape{}); + typename Params::TMA_B tma_load_b1 = cute::make_tma_copy_B_sm90( + GmemTiledCopyB{}, tensor_b1, SmemLayoutB{}(cute::_, cute::_, cute::_0{}), TileShape{}, + ClusterShape{}); + typename Params::TMA_B tma_load_b2 = cute::make_tma_copy_B_sm90( + GmemTiledCopyB{}, tensor_b2, SmemLayoutB{}(cute::_, cute::_, cute::_0{}), TileShape{}, + ClusterShape{}); + typename Params::TMA_B tma_load_b3 = cute::make_tma_copy_B_sm90( + GmemTiledCopyB{}, tensor_b3, SmemLayoutB{}(cute::_, cute::_, cute::_0{}), TileShape{}, + ClusterShape{}); + uint32_t transaction_bytes_mk = TmaTransactionBytesMK; + uint32_t transaction_bytes_nk = TmaTransactionBytesNK; + uint32_t transaction_bytes = transaction_bytes_mk + transaction_bytes_nk * 4; + + return { tma_load_a, tma_load_b0, tma_load_b1, tma_load_b2, + tma_load_b3, transaction_bytes, transaction_bytes_mk, transaction_bytes_nk }; + } +}; diff --git a/src/layers/extensions/inference/cutlass/transposed_conv.cu b/src/layers/extensions/inference/cutlass/transposed_conv.cu new file mode 100644 index 0000000..49e523b --- /dev/null +++ b/src/layers/extensions/inference/cutlass/transposed_conv.cu @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "transposed_conv_kernel.h" +#include "../def_cutlass.h" + +const std::string HINT_MAP_TRANSPOSED_CONV_NAME = "HINT_MAP_TRANSPOSED_CONV"; +std::unordered_map HINT_MAP_TRANSPOSED_CONV = { +#if CURRENT_DEVICE_SM == 80 + { conv_key(80, 7, 4, 128, 128, 0, 0), 7 }, { conv_key(80, 7, 4, 128, 256, 0, 0), 7 }, + { conv_key(80, 13, 8, 128, 128, 0, 0), 7 }, { conv_key(80, 13, 8, 128, 256, 0, 0), 7 }, + { conv_key(80, 14, 8, 128, 128, 0, 0), 7 }, { conv_key(80, 14, 8, 256, 256, 0, 0), 8 }, + { conv_key(80, 20, 12, 128, 128, 0, 0), 7 }, { conv_key(80, 20, 12, 128, 256, 0, 0), 7 }, + { conv_key(80, 26, 15, 128, 256, 0, 0), 7 }, { conv_key(80, 26, 15, 256, 384, 0, 0), 13 }, + { conv_key(80, 26, 15, 256, 512, 0, 0), 13 }, { conv_key(80, 26, 16, 128, 128, 0, 0), 7 }, + { conv_key(80, 26, 16, 256, 256, 0, 0), 29 }, { conv_key(80, 30, 17, 128, 128, 0, 0), 7 }, + { conv_key(80, 30, 17, 128, 256, 0, 0), 29 }, { conv_key(80, 40, 24, 128, 128, 0, 0), 7 }, + { conv_key(80, 40, 24, 256, 256, 0, 0), 13 }, { conv_key(80, 52, 30, 128, 256, 0, 0), 13 }, + { conv_key(80, 52, 30, 256, 384, 0, 0), 10 }, { conv_key(80, 52, 30, 256, 512, 0, 0), 10 }, + { conv_key(80, 60, 34, 128, 128, 0, 0), 5 }, { conv_key(80, 60, 34, 128, 256, 0, 0), 10 }, + { conv_key(80, 60, 34, 256, 256, 0, 0), 10 }, { conv_key(80, 80, 45, 128, 256, 0, 0), 13 }, + { conv_key(80, 80, 45, 256, 384, 0, 0), 14 }, { conv_key(80, 80, 45, 256, 512, 0, 0), 13 }, + { conv_key(80, 120, 68, 128, 128, 0, 0), 14 }, { conv_key(80, 120, 68, 128, 256, 0, 0), 14 }, + { conv_key(80, 120, 68, 256, 256, 0, 0), 14 }, { conv_key(80, 120, 68, 256, 384, 0, 0), 14 }, + { conv_key(80, 120, 68, 256, 512, 0, 0), 13 }, { conv_key(80, 240, 135, 128, 256, 0, 0), 13 }, + { conv_key(80, 240, 135, 256, 384, 0, 0), 14 }, { conv_key(80, 240, 135, 256, 512, 0, 0), 13 }, +#elif CURRENT_DEVICE_SM == 89 + { conv_key(89, 7, 4, 128, 128, 0, 0), 7 }, { conv_key(89, 7, 4, 128, 256, 0, 0), 7 }, + { conv_key(89, 13, 8, 128, 128, 0, 0), 7 }, { conv_key(89, 13, 8, 128, 256, 0, 0), 7 }, + { conv_key(89, 14, 8, 128, 128, 0, 0), 7 }, { conv_key(89, 14, 8, 256, 256, 0, 0), 8 }, + { conv_key(89, 20, 12, 128, 128, 0, 0), 7 }, { conv_key(89, 20, 12, 128, 256, 0, 0), 7 }, + { conv_key(89, 26, 15, 128, 256, 0, 0), 8 }, { conv_key(89, 26, 15, 256, 384, 0, 0), 18 }, + { conv_key(89, 26, 15, 256, 512, 0, 0), 18 }, { conv_key(89, 26, 16, 128, 128, 0, 0), 7 }, + { conv_key(89, 26, 16, 256, 256, 0, 0), 8 }, { conv_key(89, 30, 17, 128, 128, 0, 0), 19 }, + { conv_key(89, 30, 17, 128, 256, 0, 0), 19 }, { conv_key(89, 40, 24, 128, 128, 0, 0), 8 }, + { conv_key(89, 40, 24, 256, 256, 0, 0), 18 }, { conv_key(89, 52, 30, 128, 256, 0, 0), 14 }, + { conv_key(89, 52, 30, 256, 384, 0, 0), 5 }, { conv_key(89, 52, 30, 256, 512, 0, 0), 2 }, + { conv_key(89, 60, 34, 128, 128, 0, 0), 7 }, { conv_key(89, 60, 34, 128, 256, 0, 0), 14 }, + { conv_key(89, 60, 34, 256, 256, 0, 0), 14 }, { conv_key(89, 80, 45, 128, 256, 0, 0), 14 }, + { conv_key(89, 80, 45, 256, 384, 0, 0), 14 }, { conv_key(89, 80, 45, 256, 512, 0, 0), 14 }, + { conv_key(89, 120, 68, 128, 128, 0, 0), 14 }, { conv_key(89, 120, 68, 128, 256, 0, 0), 14 }, + { conv_key(89, 120, 68, 256, 256, 0, 0), 14 }, { conv_key(89, 120, 68, 256, 384, 0, 0), 14 }, + { conv_key(89, 120, 68, 256, 512, 0, 0), 14 }, { conv_key(89, 240, 135, 128, 256, 0, 0), 0 }, + { conv_key(89, 240, 135, 256, 384, 0, 0), 14 }, { conv_key(89, 240, 135, 256, 512, 0, 0), 14 }, +#elif CURRENT_DEVICE_SM == 90 + { conv_key(90, 7, 4, 128, 128, 0, 0), 7 }, { conv_key(90, 7, 4, 128, 256, 0, 0), 7 }, + { conv_key(90, 13, 8, 128, 128, 0, 0), 7 }, { conv_key(90, 13, 8, 128, 256, 0, 0), 7 }, + { conv_key(90, 14, 8, 128, 128, 0, 0), 7 }, { conv_key(90, 14, 8, 256, 256, 0, 0), 8 }, + { conv_key(90, 20, 12, 128, 128, 0, 0), 7 }, { conv_key(90, 20, 12, 128, 256, 0, 0), 7 }, + { conv_key(90, 26, 15, 128, 256, 0, 0), 7 }, { conv_key(90, 26, 15, 256, 384, 0, 0), 29 }, + { conv_key(90, 26, 15, 256, 512, 0, 0), 29 }, { conv_key(90, 26, 16, 128, 128, 0, 0), 7 }, + { conv_key(90, 26, 16, 256, 256, 0, 0), 8 }, { conv_key(90, 30, 17, 128, 128, 0, 0), 7 }, + { conv_key(90, 30, 17, 128, 256, 0, 0), 7 }, { conv_key(90, 40, 24, 128, 128, 0, 0), 7 }, + { conv_key(90, 40, 24, 256, 256, 0, 0), 29 }, { conv_key(90, 52, 30, 128, 256, 0, 0), 13 }, + { conv_key(90, 52, 30, 256, 384, 0, 0), 10 }, { conv_key(90, 52, 30, 256, 512, 0, 0), 13 }, + { conv_key(90, 60, 34, 128, 128, 0, 0), 5 }, { conv_key(90, 60, 34, 128, 256, 0, 0), 26 }, + { conv_key(90, 60, 34, 256, 256, 0, 0), 26 }, { conv_key(90, 80, 45, 128, 256, 0, 0), 13 }, + { conv_key(90, 80, 45, 256, 384, 0, 0), 14 }, { conv_key(90, 80, 45, 256, 512, 0, 0), 13 }, + { conv_key(90, 120, 68, 128, 128, 0, 0), 14 }, { conv_key(90, 120, 68, 128, 256, 0, 0), 13 }, + { conv_key(90, 120, 68, 256, 256, 0, 0), 13 }, { conv_key(90, 120, 68, 256, 384, 0, 0), 14 }, + { conv_key(90, 120, 68, 256, 512, 0, 0), 13 }, { conv_key(90, 240, 135, 128, 256, 0, 0), 13 }, + { conv_key(90, 240, 135, 256, 384, 0, 0), 27 }, { conv_key(90, 240, 135, 256, 512, 0, 0), 10 }, +#elif CURRENT_DEVICE_SM == 100 + { conv_key(100, 7, 4, 128, 128, 0, 0), 6 }, + { conv_key(100, 7, 4, 128, 256, 0, 0), 5 }, + { conv_key(100, 13, 8, 128, 128, 0, 0), 7 }, + { conv_key(100, 13, 8, 128, 256, 0, 0), 7 }, + { conv_key(100, 14, 8, 128, 128, 0, 0), 7 }, + { conv_key(100, 14, 8, 256, 256, 0, 0), 8 }, + { conv_key(100, 20, 12, 128, 128, 0, 0), 7 }, + { conv_key(100, 20, 12, 128, 256, 0, 0), 5 }, + { conv_key(100, 26, 15, 128, 256, 0, 0), 7 }, + { conv_key(100, 26, 15, 256, 384, 0, 0), 29 }, + { conv_key(100, 26, 15, 256, 512, 0, 0), 29 }, + { conv_key(100, 26, 16, 128, 128, 0, 0), 5 }, + { conv_key(100, 26, 16, 256, 256, 0, 0), 8 }, + { conv_key(100, 30, 17, 128, 128, 0, 0), 7 }, + { conv_key(100, 30, 17, 128, 256, 0, 0), 7 }, + { conv_key(100, 40, 24, 128, 128, 0, 0), 7 }, + { conv_key(100, 40, 24, 256, 256, 0, 0), 29 }, + { conv_key(100, 52, 30, 128, 256, 0, 0), 13 }, + { conv_key(100, 52, 30, 256, 384, 0, 0), 10 }, + { conv_key(100, 52, 30, 256, 512, 0, 0), 10 }, + { conv_key(100, 60, 34, 128, 128, 0, 0), 7 }, + { conv_key(100, 60, 34, 128, 256, 0, 0), 13 }, + { conv_key(100, 60, 34, 256, 256, 0, 0), 13 }, + { conv_key(100, 80, 45, 128, 256, 0, 0), 13 }, + { conv_key(100, 80, 45, 256, 384, 0, 0), 14 }, + { conv_key(100, 80, 45, 256, 512, 0, 0), 13 }, + { conv_key(100, 120, 68, 128, 128, 0, 0), 14 }, + { conv_key(100, 120, 68, 128, 256, 0, 0), 13 }, + { conv_key(100, 120, 68, 256, 256, 0, 0), 13 }, + { conv_key(100, 120, 68, 256, 384, 0, 0), 14 }, + { conv_key(100, 120, 68, 256, 512, 0, 0), 13 }, + { conv_key(100, 240, 135, 128, 256, 0, 0), 13 }, + { conv_key(100, 240, 135, 256, 384, 0, 0), 14 }, + { conv_key(100, 240, 135, 256, 512, 0, 0), 13 }, +#endif +}; + +at::Tensor transposed_conv(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const int stride, at::Tensor& out_buf) +{ + const int kernel = weight.size(2); + if (sm < 75) { + return at::conv_transpose2d(feature, weight, at::nullopt, stride); + } + auto launch_cutlass = [&](auto sm_v) { + using sm_t = decltype(sm_v); + return transposed_conv_generic_cutlass(out_buf, feature, weight, stride); + }; + const int H = feature.size(2); + const int W = feature.size(3); + const int C2 = weight.size(0); + const int C1 = weight.size(1); + assert(kernel == stride && kernel == 2); + return launch_cutlass_helper( + sm, launch_cutlass, HINT_MAP_TRANSPOSED_CONV, HINT_MAP_TRANSPOSED_CONV_NAME, C2, C1, H, W); +} diff --git a/src/layers/extensions/inference/cutlass/transposed_conv_kernel.h b/src/layers/extensions/inference/cutlass/transposed_conv_kernel.h new file mode 100644 index 0000000..f7eded5 --- /dev/null +++ b/src/layers/extensions/inference/cutlass/transposed_conv_kernel.h @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +#include +#include +#include +#include +// clang-format on + +#include "cutlass_epilogue.h" +#include "cutlass_kernel.h" +#include "../common_cu.h" +#include "../cutlass_helper_implicit_gemm.h" +#include "../def_cutlass.h" + +template +at::Tensor transposed_conv_generic_cutlass(at::Tensor& out_buf, const at::Tensor& feature, + const at::Tensor& weight, const int stride) +{ + using EpilogueOp = cutlass::epilogue::thread::LinearCombination< + cutlass::half_t, 128 / cutlass::sizeof_bits_v, cutlass::half_t, + cutlass::half_t, cutlass::epilogue::thread::ScaleType::Nothing>; + + using Conv2dDgradKernel = typename CustomDefaultConv2dDgrad< + cutlass::half_t, cutlass::layout::TensorNHWC, cutlass::half_t, cutlass::layout::TensorNHWC, + cutlass::half_t, cutlass::layout::TensorNHWC, cutlass::half_t, cutlass::arch::OpClassTensorOp, + typename Sm::SmArch, typename Sm::ShapeThreadBlock, typename Sm::ShapeWarp, typename Sm::ShapeOp, + EpilogueOp, cutlass::conv::threadblock::StridedDgradIdentityThreadblockSwizzle<8>, Sm::Stages, + cutlass::arch::OpMultiplyAdd, cutlass::conv::IteratorAlgorithm::kOptimized>::Kernel; + + using ImplicitGemm = CustomImplicitGemmConvolution; + + const int B = feature.size(0); + const int Cin = feature.size(1); + const int H = feature.size(2); + const int W = feature.size(3); + const int Cin_ = weight.size(0); + const int Cout = weight.size(1); + const int kernel = weight.size(2); + const int kernel_ = weight.size(3); + assert(Cin == Cin_ && kernel == kernel_ && kernel == stride); + + cutlass::conv::Conv2dProblemSize problem_size({ B, H * stride, W * stride, Cout }, // out + { Cin, kernel, kernel, Cout }, // kernel + { 0, 0, 0, 0 }, // pad + { stride, stride }, // stride + { 1, 1 }, // dilation + { B, H, W, Cin }, // input + cutlass::conv::Mode::kCrossCorrelation, + 1 // split_k_slices + ); + + cutlass::TensorRef d_feature( + static_cast(feature.data_ptr()), + cutlass::make_Coord(feature.stride(3), feature.stride(2), feature.stride(0))); + cutlass::TensorRef d_weight( + static_cast(weight.data_ptr()), + cutlass::make_Coord(weight.stride(3), weight.stride(2), weight.stride(0))); + cutlass::TensorRef d_out( + static_cast(out_buf.data_ptr()), + cutlass::make_Coord(out_buf.stride(3), out_buf.stride(2), out_buf.stride(0))); + + typename ImplicitGemm::Arguments args(problem_size, d_feature, d_weight, d_out, d_out, {}); + + ImplicitGemm implicit_gemm_op; + cutlass::Status status = implicit_gemm_op.can_implement(args); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to configure convolution operation." << std::endl; + return at::Tensor(); + } + + auto stream = at::cuda::getCurrentCUDAStream(); + status = implicit_gemm_op(args, nullptr, stream); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to run convolution operation." << std::endl; + return at::Tensor(); + } + + return out_buf; +} diff --git a/src/layers/extensions/inference/cutlass_helper_gemm.h b/src/layers/extensions/inference/cutlass_helper_gemm.h new file mode 100644 index 0000000..d19eaa5 --- /dev/null +++ b/src/layers/extensions/inference/cutlass_helper_gemm.h @@ -0,0 +1,450 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +// clang-format on + +/** + * These 3 classes/structs are rewritten: + * 1. cutlass::gemm::kernel::GemmWithFusedEpilogue -> CustomGemmWithFusedEpilogue + * 2. cutlass::gemm::kernel::DefaultGemmWithBroadcast -> CustomDefaultGemmWithBroadcast + * 3. cutlass::gemm::device::GemmUniversalWithBroadcast -> CustomGemmUniversalWithBroadcast + */ + +/// Original file: cutlass/gemm/kernel/gemm_with_fused_epilogue.h +/// to add PDL sync points +/// depending on IsSingleSource, there are 2 specializations +template +struct CustomGemmWithFusedEpilogue; + +template +struct CustomGemmWithFusedEpilogue { + using Base = + cutlass::gemm::kernel::GemmWithFusedEpilogue; + using Mma = typename Base::Mma; + using Epilogue = typename Base::Epilogue; + using EpilogueOutputOp = typename Base::EpilogueOutputOp; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + using Params = typename Base::Params; + using SharedStorage = typename Base::SharedStorage; + using Arguments = typename Base::Arguments; + + using ElementA = typename Base::ElementA; + using LayoutA = typename Base::LayoutA; + using ElementB = typename Base::ElementB; + using LayoutB = typename Base::LayoutB; + using ElementC = typename Base::ElementC; + using LayoutC = typename Base::LayoutC; + + static cutlass::ComplexTransform const kTransformA = Base::kTransformA; + static cutlass::ComplexTransform const kTransformB = Base::kTransformB; + static int const kThreadCount = Base::kThreadCount; + using Operator = typename Base::Operator; + + /// Executes one GEMM + CUTLASS_DEVICE + void operator()(Params const& params, SharedStorage& shared_storage) + { + // Compute threadblock location + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord threadblock_tile_offset = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // Early exit if CTA is out of range + if (params.grid_tiled_shape.m() <= threadblock_tile_offset.m() + || params.grid_tiled_shape.n() <= threadblock_tile_offset.n()) { + cudaGDC(); + return; + } + + int offset_k = 0; + int problem_size_k = params.problem_size.k(); + + ElementA* ptr_A = static_cast(params.ptr_A); + ElementB* ptr_B = static_cast(params.ptr_B); + + // Compute initial location in logical coordinates + cutlass::MatrixCoord tb_offset_A{ + threadblock_tile_offset.m() * Mma::Shape::kM, + offset_k, + }; + + cutlass::MatrixCoord tb_offset_B{ offset_k, threadblock_tile_offset.n() * Mma::Shape::kN }; + + // Compute position within threadblock + int thread_idx = threadIdx.x; + + // Construct iterators to A and B operands + typename Mma::IteratorA iterator_A(params.params_A, ptr_A, + { params.problem_size.m(), problem_size_k }, thread_idx, + tb_offset_A); + + typename Mma::IteratorB iterator_B(params.params_B, ptr_B, + { problem_size_k, params.problem_size.n() }, thread_idx, + tb_offset_B); + + // Broadcast the warp_id computed by lane 0 to ensure dependent code + // is compiled as warp-uniform. + int warp_idx = __shfl_sync(0xffffffff, threadIdx.x / 32, 0); + + int lane_idx = threadIdx.x % 32; + + // + // Main loop + // + + // Construct thread-scoped matrix multiply + Mma mma(shared_storage.main_loop, thread_idx, warp_idx, lane_idx); + + typename Mma::FragmentC accumulators; + + accumulators.clear(); + + // Compute threadblock-scoped matrix multiply-add + int gemm_k_iterations = (problem_size_k - offset_k + Mma::Shape::kK - 1) / Mma::Shape::kK; + + // Compute threadblock-scoped matrix multiply-add + cudaGDC(); + mma(gemm_k_iterations, accumulators, iterator_A, iterator_B, accumulators); + + // + // Epilogue + // + + EpilogueOutputOp output_op(params.output_op); + + // + // Masked tile iterators constructed from members + // + + threadblock_tile_offset = threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // assume identity swizzle + cutlass::MatrixCoord threadblock_offset(threadblock_tile_offset.m() * Mma::Shape::kM, + threadblock_tile_offset.n() * Mma::Shape::kN); + + int block_idx = + threadblock_tile_offset.m() + threadblock_tile_offset.n() * params.grid_tiled_shape.m(); + + ElementC* ptr_C1 = static_cast(params.ptr_C1); + ElementC* ptr_C2 = static_cast(params.ptr_C2); + ElementC* ptr_D = static_cast(params.ptr_D); + typename Epilogue::ElementTensor* ptr_Tensor = + static_cast(params.ptr_Tensor); + + // Define the reduction output pointer and move to the appropriate place + typename Epilogue::ElementVector* ptr_Vector = + static_cast(params.ptr_Vector); + + // Tile iterators loading from source tensors. + typename Epilogue::OutputTileIterator iterator_C1( + params.params_C1, ptr_C1, params.problem_size.mn(), thread_idx, threadblock_offset); + + typename Epilogue::OutputTileIterator iterator_C2( + params.params_C2, ptr_C2, params.problem_size.mn(), thread_idx, threadblock_offset); + + // Tile iterator writing to destination tensor. + typename Epilogue::OutputTileIterator iterator_D( + params.params_D, ptr_D, params.problem_size.mn(), thread_idx, threadblock_offset); + + // Additional tensor to load from + typename Epilogue::TensorTileIterator tensor_iterator(params.params_Tensor, + // Only the final block outputs Tensor + ptr_Tensor, params.problem_size.mn(), + thread_idx, threadblock_offset); + + // Construct the epilogue + Epilogue epilogue(shared_storage.epilogue, thread_idx, warp_idx, lane_idx); + + // Move to appropriate location for this output tile + if (ptr_Vector) { + ptr_Vector += threadblock_offset.column() + threadblock_tile_offset.m() * params.ldr; + } + + // Execute the epilogue operator to update the destination tensor. + epilogue(output_op, ptr_Vector, iterator_D, accumulators, iterator_C1, iterator_C2, + tensor_iterator, params.problem_size.mn(), threadblock_offset); + } + + // Factory invocation + CUTLASS_DEVICE + static void invoke(Params const& params, SharedStorage& shared_storage) + { + CustomGemmWithFusedEpilogue op; + op(params, shared_storage); + } + + static cutlass::Status can_implement(Arguments const& args) + { + return Base::can_implement(args); + } +}; + +template +struct CustomGemmWithFusedEpilogue { + using Base = + cutlass::gemm::kernel::GemmWithFusedEpilogue; + using Mma = typename Base::Mma; + using Epilogue = typename Base::Epilogue; + using EpilogueOutputOp = typename Base::EpilogueOutputOp; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + using Params = typename Base::Params; + using SharedStorage = typename Base::SharedStorage; + using Arguments = typename Base::Arguments; + + using ElementA = typename Base::ElementA; + using LayoutA = typename Base::LayoutA; + using ElementB = typename Base::ElementB; + using LayoutB = typename Base::LayoutB; + using ElementC = typename Base::ElementC; + using LayoutC = typename Base::LayoutC; + + static cutlass::ComplexTransform const kTransformA = Base::kTransformA; + static cutlass::ComplexTransform const kTransformB = Base::kTransformB; + static int const kThreadCount = Base::kThreadCount; + using Operator = typename Base::Operator; + + /// Executes one GEMM + CUTLASS_DEVICE + void operator()(Params const& params, SharedStorage& shared_storage) + { + // Compute threadblock location + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord threadblock_tile_offset = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // Early exit if CTA is out of range + if (params.grid_tiled_shape.m() <= threadblock_tile_offset.m() + || params.grid_tiled_shape.n() <= threadblock_tile_offset.n()) { + cudaGDC(); + return; + } + + int offset_k = 0; + int problem_size_k = params.problem_size.k(); + + ElementA* ptr_A = static_cast(params.ptr_A); + ElementB* ptr_B = static_cast(params.ptr_B); + + // Compute initial location in logical coordinates + cutlass::MatrixCoord tb_offset_A{ + threadblock_tile_offset.m() * Mma::Shape::kM, + offset_k, + }; + + cutlass::MatrixCoord tb_offset_B{ offset_k, threadblock_tile_offset.n() * Mma::Shape::kN }; + + // Compute position within threadblock + int thread_idx = threadIdx.x; + + // Construct iterators to A and B operands + typename Mma::IteratorA iterator_A(params.params_A, ptr_A, + { params.problem_size.m(), problem_size_k }, thread_idx, + tb_offset_A); + + typename Mma::IteratorB iterator_B(params.params_B, ptr_B, + { problem_size_k, params.problem_size.n() }, thread_idx, + tb_offset_B); + + // Broadcast the warp_id computed by lane 0 to ensure dependent code + // is compiled as warp-uniform. + int warp_idx = cutlass::canonical_warp_idx_sync(); + + int lane_idx = threadIdx.x % 32; + + // + // Main loop + // + + // Construct thread-scoped matrix multiply + Mma mma(shared_storage.main_loop, thread_idx, warp_idx, lane_idx); + + typename Mma::FragmentC accumulators; + + accumulators.clear(); + + // Compute threadblock-scoped matrix multiply-add + int gemm_k_iterations = (problem_size_k - offset_k + Mma::Shape::kK - 1) / Mma::Shape::kK; + + // Compute threadblock-scoped matrix multiply-add + cudaGDC(); + mma(gemm_k_iterations, accumulators, iterator_A, iterator_B, accumulators); + + // + // Epilogue + // + + EpilogueOutputOp output_op(params.output_op); + + // + // Masked tile iterators constructed from members + // + + threadblock_tile_offset = threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // assume identity swizzle + cutlass::MatrixCoord threadblock_offset(threadblock_tile_offset.m() * Mma::Shape::kM, + threadblock_tile_offset.n() * Mma::Shape::kN); + + int block_idx = + threadblock_tile_offset.m() + threadblock_tile_offset.n() * params.grid_tiled_shape.m(); + + ElementC* ptr_C = static_cast(params.ptr_C); + ElementC* ptr_D = static_cast(params.ptr_D); + typename Epilogue::ElementTensor* ptr_Tensor = + static_cast(params.ptr_Tensor); + + // Define the reduction output pointer and move to the appropriate place + typename Epilogue::ElementVector* ptr_Vector = + static_cast(params.ptr_Vector); + + // Tile iterators loading from source tensors. + typename Epilogue::OutputTileIterator iterator_C( + params.params_C, ptr_C, params.problem_size.mn(), thread_idx, threadblock_offset); + + // Tile iterator writing to destination tensor. + typename Epilogue::OutputTileIterator iterator_D( + params.params_D, ptr_D, params.problem_size.mn(), thread_idx, threadblock_offset); + + // Additional tensor to load from + typename Epilogue::TensorTileIterator tensor_iterator(params.params_Tensor, + // Only the final block outputs Tensor + ptr_Tensor, params.problem_size.mn(), + thread_idx, threadblock_offset); + + // Construct the epilogue + Epilogue epilogue(shared_storage.epilogue, thread_idx, warp_idx, lane_idx); + + // Move to appropriate location for this output tile + if (ptr_Vector) { + ptr_Vector += threadblock_offset.column() + threadblock_tile_offset.m() * params.ldr; + } + + // Execute the epilogue operator to update the destination tensor. + epilogue(output_op, ptr_Vector, iterator_D, accumulators, iterator_C, tensor_iterator, + params.problem_size.mn(), threadblock_offset); + } + + // Factory invocation + CUTLASS_DEVICE + static void invoke(Params const& params, SharedStorage& shared_storage) + { + CustomGemmWithFusedEpilogue op; + op(params, shared_storage); + } + + static cutlass::Status can_implement(Arguments const& args) + { + return Base::can_implement(args); + } +}; + +/// Original file: cutlass/gemm/kernel/default_gemm_with_broadcast.h +/// to invoke CustomGemmWithFusedEpilogue +template +struct CustomDefaultGemmWithBroadcast { + using Base = typename cutlass::gemm::kernel::DefaultGemmWithBroadcast< + ElementA_, LayoutA_, TransformA, AlignmentA, ElementB_, LayoutB_, TransformB, AlignmentB, + ElementC_, LayoutC_, ElementAccumulator_, OperatorClass_, ArchTag_, ThreadblockShape_, + WarpShape_, InstructionShape_, EpilogueOutputOp_, ThreadblockSwizzle_, Stages, Operator_>; + using GemmKernel = + CustomGemmWithFusedEpilogue; +}; + +/// Original file: cutlass/gemm/device/gemm_universal_with_broadcast.h +/// to add "cudaLaunchKernelEx" to run() +template ::kAlignmentA, + int AlignmentB = cutlass::gemm::device::DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, ElementAccumulator_>::kAlignmentB, + typename Operator_ = typename cutlass::gemm::device::DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, ElementAccumulator_>::Operator, + cutlass::ComplexTransform TransformA = cutlass::ComplexTransform::kNone, + cutlass::ComplexTransform TransformB = cutlass::ComplexTransform::kNone> +class CustomGemmUniversalWithBroadcast + : public cutlass::gemm::device::GemmUniversalBase::GemmKernel> { +public: + using Base = cutlass::gemm::device::GemmUniversalBase::GemmKernel>; + + using Arguments = typename Base::Arguments; + using GemmKernel = typename Base::GemmKernel; + + static constexpr size_t kSharedStorageSize = Base::kSharedStorageSize; + + cutlass::Status run(cudaStream_t stream = nullptr) + { + CUTLASS_TRACE_HOST("GemmUniversalBase::run()"); + + // Configure grid and block dimensions + dim3 block(GemmKernel::kThreadCount, 1, 1); + dim3 grid = this->params_.get_grid_dims(); + + // Launch kernel + CUTLASS_TRACE_HOST( + " " + "grid: (" + << grid + << "), " + "block: (" + << block + << "), " + "SMEM: (" + << Base::kSharedStorageSize << ")"); + + cutlass::arch::synclog_setup(); + + cudaLaunchConfig_t config; + config.gridDim = grid; + config.blockDim = block; + config.dynamicSmemBytes = kSharedStorageSize; + config.stream = stream; + auto attr = get_cuda_launch_attribute(); + config.attrs = &attr; + config.numAttrs = 1; + + cudaLaunchKernelEx(&config, &cutlass::Kernel2, this->params_); + + // Query for errors + cudaError_t result = cudaGetLastError(); + if (result != cudaSuccess) { + CUTLASS_TRACE_HOST(" grid launch failed with error " << cudaGetErrorString(result)); + return cutlass::Status::kErrorInternal; + } + + return cutlass::Status::kSuccess; + } + + cutlass::Status operator()(Arguments const& args, void* workspace = nullptr, + cudaStream_t stream = nullptr) + { + cutlass::Status status = this->initialize(args, workspace, stream); + + if (status == cutlass::Status::kSuccess) { + status = run(stream); + } + + return status; + } +}; diff --git a/src/layers/extensions/inference/cutlass_helper_implicit_gemm.h b/src/layers/extensions/inference/cutlass_helper_implicit_gemm.h new file mode 100644 index 0000000..8ed4dc5 --- /dev/null +++ b/src/layers/extensions/inference/cutlass_helper_implicit_gemm.h @@ -0,0 +1,503 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +// clang-format off +#include +#include +#include +#include +#include +#include +#include +// clang-format on + +/** + * These 5 classes/structs are rewritten: + * 1. cutlass::conv::kernel::ImplicitGemmConvolutionWithFusedEpilogue -> CustomImplicitGemmConvolutionWithFusedEpilogue + * 2. cutlass::conv::kernel::DefaultConv2dFpropWithBroadcast -> CustomDefaultConv2dFpropWithBroadcast + * 3. cutlass::conv::kernel::ImplicitGemmConvolutionStridedDgrad -> CustomImplicitGemmConvolutionStridedDgrad + * 4. cutlass::conv::kernel::DefaultConv2dDgrad -> CustomDefaultConv2dDgrad + * 5. cutlass::conv::device::ImplicitGemmConvolution -> CustomImplicitGemmConvolution + */ + +/// Original file: cutlass/conv/kernel/implicit_gemm_convolution_with_fused_epilogue.h +/// to add PDL sync points +template +struct CustomImplicitGemmConvolutionWithFusedEpilogue { + using Base = cutlass::conv::kernel::ImplicitGemmConvolutionWithFusedEpilogue< + Mma_, Epilogue_, ThreadblockSwizzle_, ConvOperator, ConvProblemSize_>; + using ElementA = typename Base::ElementA; + using LayoutA = typename Base::LayoutA; + using ElementB = typename Base::ElementB; + using LayoutB = typename Base::LayoutB; + using ElementC = typename Base::ElementC; + using LayoutC = typename Base::LayoutC; + using ElementAccumulator = typename Base::ElementAccumulator; + using ElementCompute = typename Base::ElementCompute; + using OperatorClass = typename Base::OperatorClass; + using ArchTag = typename Base::ArchTag; + using ThreadblockShape = typename Base::ThreadblockShape; + using WarpShape = typename Base::WarpShape; + using InstructionShape = typename Base::InstructionShape; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + using EpilogueOutputOp = typename Base::EpilogueOutputOp; + static int const kStages = Base::kStages; + static int const kConvDim = Base::kConvDim; + using WarpMmaOperator = typename Base::WarpMmaOperator; + using ArchMmaOperator = typename Base::ArchMmaOperator; + using MathOperator = typename Base::MathOperator; + + static cutlass::conv::Operator const kConvolutionalOperator = Base::kConvolutionalOperator; + static cutlass::conv::IteratorAlgorithm const kIteratorAlgorithm = Base::kIteratorAlgorithm; + static cutlass::conv::StrideSupport const kStrideSupport = Base::kStrideSupport; + static cutlass::conv::GroupMode const kGroupMode = Base::kGroupMode; + + using Arguments = typename Base::Arguments; + using Mma = typename Base::Mma; + using Epilogue = typename Base::Epilogue; + using Params = typename Base::Params; + using SharedStorage = typename Base::SharedStorage; + + using ConvOutputIteratorParameter = typename Base::ConvOutputIteratorParameter; + + /// Executes one ImplicitGEMM + CUTLASS_DEVICE + void operator()(Params const& params, SharedStorage& shared_storage) + { + // Compute threadblock location + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord threadblock_tile_idx = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // Early exit if CTA is out of range + if (params.grid_tiled_shape.m() <= threadblock_tile_idx.m() + || params.grid_tiled_shape.n() <= threadblock_tile_idx.n()) { + cudaGDC(); + return; + } + + // Compute position within threadblock + int thread_idx = threadIdx.x; + + // Construct iterators to A and B operands + typename Mma::IteratorA iterator_A( + params.iterator_A, params.problem_size, params.ptr_A, thread_idx, + cutlass::MatrixCoord(threadblock_tile_idx.m() * Mma::Shape::kM, + threadblock_tile_idx.k() * Mma::Shape::kK)); + + typename Mma::IteratorB iterator_B( + params.iterator_B, params.problem_size, params.ptr_B, thread_idx, + cutlass::MatrixCoord(threadblock_tile_idx.k() * Mma::Shape::kK, + threadblock_tile_idx.n() * Mma::Shape::kN)); + + // Broadcast the warp_id computed by lane 0 to ensure dependent code + // is compiled as warp-uniform. + int warp_idx = cutlass::canonical_warp_idx_sync(); + int lane_idx = threadIdx.x % 32; + + // + // Main loop + // + + // Construct thread-scoped matrix multiply + Mma mma(shared_storage.main_loop, thread_idx, warp_idx, lane_idx); + + typename Mma::FragmentC accumulators; + + accumulators.clear(); + + // Compute threadblock-scoped matrix multiply-add + cudaGDC(); + mma(params.gemm_k_iterations, accumulators, iterator_A, iterator_B, accumulators); + + // + // Epilogue + // + + EpilogueOutputOp output_op(params.output_op); + + // Compute logical position within grid + threadblock_tile_idx = threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + cutlass::MatrixCoord threadblock_offset(threadblock_tile_idx.m() * Mma::Shape::kM, + threadblock_tile_idx.n() * Mma::Shape::kN); + + // Tile iterator writing to destination tensor + typename Epilogue::OutputTileIterator iterator_D( + params.iterator_D, params.ptr_D, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, threadblock_offset); + + // Tile iterator reading from source accumulator tensor + typename Epilogue::OutputTileIterator iterator_C( + params.iterator_C, params.ptr_C, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, threadblock_offset); + + typename Epilogue::ElementTensor* ptr_Tensor = + static_cast(params.ptr_Tensor); + + // Define the reduction output pointer and move to the appropriate place + typename Epilogue::ElementVector* ptr_Vector = + static_cast(params.ptr_Vector); + + // Additional tensor to load from + typename Epilogue::TensorTileIterator tensor_iterator( + params.params_Tensor, ptr_Tensor, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, threadblock_offset); + + // Construct the epilogue + Epilogue epilogue(shared_storage.epilogue, thread_idx, warp_idx, lane_idx); + + // Move to appropriate location for this output tile + if (ptr_Vector) { + ptr_Vector += threadblock_offset.column() + threadblock_tile_idx.m() * params.ldr; + } + + // Execute the epilogue operator to update the destination tensor. + epilogue(output_op, ptr_Vector, iterator_D, accumulators, iterator_C, tensor_iterator, + ConvOutputIteratorParameter::extent(params.problem_size), threadblock_offset); + } +}; + +/// Original file: cutlass/conv/kernel/default_conv2d_fprop_with_broadcast.h +/// to invoke CustomImplicitGemmConvolutionWithFusedEpilogue +template , + int AlignmentB = 128 / cutlass::sizeof_bits_v> +struct CustomDefaultConv2dFpropWithBroadcast { + using Base = cutlass::conv::kernel::DefaultConv2dFpropWithBroadcast< + ElementA, LayoutA, ElementB, LayoutB, ElementC, LayoutC, ElementAccumulator, OperatorClass, + ArchTag, ThreadblockShape, WarpShape, InstructionShape, EpilogueOutputOp, ThreadblockSwizzle, + Stages, MathOperatorTag, IteratorAlgorithm, StrideSupport, AlignmentA, AlignmentB>; + using Kernel = + CustomImplicitGemmConvolutionWithFusedEpilogue; +}; + +/// Original file: cutlass/conv/kernel/implicit_gemm_convolution_strided_dgrad.h +/// to add PDL sync points +template +struct CustomImplicitGemmConvolutionStridedDgrad { + using Base = + cutlass::conv::kernel::ImplicitGemmConvolutionStridedDgrad; + using ElementA = typename Base::ElementA; + using LayoutA = typename Base::LayoutA; + using ElementB = typename Base::ElementB; + using LayoutB = typename Base::LayoutB; + using ElementC = typename Base::ElementC; + using LayoutC = typename Base::LayoutC; + using ElementAccumulator = typename Base::ElementAccumulator; + using ElementCompute = typename Base::ElementCompute; + using OperatorClass = typename Base::OperatorClass; + using ArchTag = typename Base::ArchTag; + using ThreadblockShape = typename Base::ThreadblockShape; + using WarpShape = typename Base::WarpShape; + using InstructionShape = typename Base::InstructionShape; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + using EpilogueOutputOp = typename Base::EpilogueOutputOp; + static int const kStages = Base::kStages; + static int const kConvDim = Base::kConvDim; + using WarpMmaOperator = typename Base::WarpMmaOperator; + using ArchMmaOperator = typename Base::ArchMmaOperator; + using MathOperator = typename Base::MathOperator; + + static cutlass::conv::Operator const kConvolutionalOperator = Base::kConvolutionalOperator; + static cutlass::conv::IteratorAlgorithm const kIteratorAlgorithm = Base::kIteratorAlgorithm; + static cutlass::conv::StrideSupport const kStrideSupport = Base::kStrideSupport; + static cutlass::conv::GroupMode const kGroupMode = Base::kGroupMode; + + using Arguments = typename Base::Arguments; + using Mma = typename Base::Mma; + using Epilogue = typename Base::Epilogue; + using Params = typename Base::Params; + using SharedStorage = typename Base::SharedStorage; + + using ConvOutputIteratorParameter = typename Base::ConvOutputIteratorParameter; + + /// Executes one ImplicitGEMM + CUTLASS_DEVICE + void operator()(Params const& params, SharedStorage& shared_storage) + { + // Compute threadblock location + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord threadblock_tile_idx = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // Early exit if CTA is out of range + if (params.grid_tiled_shape.m() <= threadblock_tile_idx.m() + || params.grid_tiled_shape.n() <= threadblock_tile_idx.n()) { + cudaGDC(); + return; + } + + // Compute position within threadblock + int thread_idx = threadIdx.x; + + // Compute starting filter position for strided dgrad + int tile_m_per_filter = + strided_dgrad_tile_m_per_filter(params.problem_size, ThreadblockShape::kM); + int filter_tile_m = (threadblock_tile_idx.m() / tile_m_per_filter); + + int start_r; + int start_s; + params.stride_w_divmod(start_r, start_s, filter_tile_m); + + int filter_r = start_r; + int filter_s = start_s; + + // Starting h, w positions for filter position in gemm_k=0 + int start_h; + int start_w; + strided_dgrad_starting_coords(params.problem_size, params.stride_h_divmod, + params.stride_w_divmod, filter_r, filter_s, start_h, start_w); + + if (start_h >= params.problem_size.H || start_w >= params.problem_size.W) { + cudaGDC(); + return; + } + + typename Mma::FragmentC accumulators; + + accumulators.clear(); + + // Broadcast the warp_id computed by lane 0 to ensure dependent code + // is compiled as warp-uniform. + int warp_idx = cutlass::canonical_warp_idx_sync(); + int lane_idx = threadIdx.x % 32; + + // Check if CTA contributes valid MMA (Dy * w) and accumulator will be non-zero after MMA + if (start_r < params.problem_size.R && start_s < params.problem_size.S) { + // Scale gemm_k_iterations for strided dgrad + int gemm_k_iterations = + (params.gemm_k_iterations / (params.problem_size.R * params.problem_size.S)) + * params.problem_size.num_gemm_k_filter_positions(start_r, start_s); + + // Construct iterators to A and B operands + typename Mma::IteratorA iterator_A( + params.iterator_A, params.problem_size, params.ptr_A, thread_idx, + params.stride_h_divmod, params.stride_w_divmod, start_r, start_s, + cutlass::MatrixCoord(threadblock_tile_idx.m() * Mma::Shape::kM, + threadblock_tile_idx.k() * Mma::Shape::kK)); + + typename Mma::IteratorB iterator_B( + params.iterator_B, params.problem_size, params.ptr_B, thread_idx, start_r, start_s, + cutlass::MatrixCoord(threadblock_tile_idx.k() * Mma::Shape::kK, + threadblock_tile_idx.n() * Mma::Shape::kN)); + + // + // Main loop + // + + // Construct thread-scoped matrix multiply + Mma mma(shared_storage.main_loop, thread_idx, warp_idx, lane_idx); + + // Compute threadblock-scoped matrix multiply-add + cudaGDC(); + mma(gemm_k_iterations, accumulators, iterator_A, iterator_B, accumulators); + } else { + cudaGDC(); + } + + // + // Epilogue + // + + EpilogueOutputOp output_op(params.output_op); + + // Construct the semaphore. + int block_idx = + threadblock_tile_idx.m() + threadblock_tile_idx.n() * params.grid_tiled_shape.m(); + cutlass::Semaphore semaphore(params.semaphore + block_idx, thread_idx); + + // Compute logical position within grid + threadblock_tile_idx = threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // If performing a reduction via split-K, fetch the initial synchronization + if (params.split_k_mode == cutlass::conv::SplitKMode::kSerial + && params.grid_tiled_shape.k() > 1) { + + // Fetch the synchronization lock initially but do not block. + semaphore.fetch(); + + // Indicate which position in a serial reduction the output operator is currently updating + output_op.set_k_partition(threadblock_tile_idx.k(), params.grid_tiled_shape.k()); + } + + cutlass::MatrixCoord threadblock_offset(threadblock_tile_idx.m() * Mma::Shape::kM, + threadblock_tile_idx.n() * Mma::Shape::kN); + + // Tile iterator writing to destination tensor + typename Epilogue::OutputTileIterator iterator_D( + params.iterator_D, params.ptr_D, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, + params.stride_h_divmod, params.stride_w_divmod, start_r, start_s, threadblock_offset); + + // Construct the epilogue + Epilogue epilogue(shared_storage.epilogue, thread_idx, warp_idx, lane_idx); + + if (output_op.is_source_needed()) { + // Tile iterator reading from source accumulator tensor + typename Epilogue::OutputTileIterator iterator_C( + params.iterator_C, params.ptr_C, + ConvOutputIteratorParameter::extent(params.problem_size), thread_idx, + params.stride_h_divmod, params.stride_w_divmod, start_r, start_s, threadblock_offset); + + // Wait on the semaphore - this latency may have been covered by iterator construction + if (params.split_k_mode == cutlass::conv::SplitKMode::kSerial + && params.grid_tiled_shape.k() > 1) { + + // For subsequent threadblocks, the source matrix is held in the 'D' tensor. + if (threadblock_tile_idx.k()) { + iterator_C = iterator_D; + } + + semaphore.wait(threadblock_tile_idx.k()); + } + + // Run epilogue with addend source iterator + epilogue(output_op, iterator_D, accumulators, iterator_C); + } else { + // Run epilogue without addend source iterator + epilogue(output_op, iterator_D, accumulators); + } + + // + // Release the semaphore + // + + if (params.split_k_mode == cutlass::conv::SplitKMode::kSerial + && params.grid_tiled_shape.k() > 1) { + + int lock = 0; + if (params.grid_tiled_shape.k() == threadblock_tile_idx.k() + 1) { + // The final threadblock resets the semaphore for subsequent grids. + lock = 0; + } else { + // Otherwise, the semaphore is incremented + lock = threadblock_tile_idx.k() + 1; + } + + semaphore.release(lock); + } + } +}; + +/// Original file: cutlass/conv/kernel/default_conv2d_dgrad.h +/// to invoke CustomImplicitGemmConvolutionStridedDgrad +template ::value, + int AlignmentB = 128 / cutlass::sizeof_bits::value> +struct CustomDefaultConv2dDgrad { + using Base = cutlass::conv::kernel::DefaultConv2dDgrad< + ElementA, LayoutA, ElementB, LayoutB, ElementC, LayoutC, ElementAccumulator, OperatorClass, + ArchTag, ThreadblockShape, WarpShape, InstructionShape, EpilogueOutputOp, ThreadblockSwizzle, + Stages, MathOperatorTag, IteratorAlgorithm, StrideSupport, AlignmentA, AlignmentB>; + using Kernel = + CustomImplicitGemmConvolutionStridedDgrad; +}; + +/// Original file: cutlass/conv/device/implicit_gemm_convolution.h +/// to add "cudaLaunchKernelEx" to run() +template +class CustomImplicitGemmConvolution { +public: + using Base = cutlass::conv::device::ImplicitGemmConvolution; + using UnderlyingKernel = typename Base::UnderlyingKernel; + using Arguments = typename Base::Arguments; + using ThreadblockSwizzle = typename Base::ThreadblockSwizzle; + + static int const kWarpCount = Base::kWarpCount; + +private: + typename UnderlyingKernel::Params params_; + +public: + cutlass::Status run(cudaStream_t stream = nullptr) + { + ThreadblockSwizzle threadblock_swizzle; + + dim3 grid = threadblock_swizzle.get_grid_shape(params_.grid_tiled_shape); + dim3 block(32 * kWarpCount, 1, 1); + + int smem_size = int(sizeof(typename UnderlyingKernel::SharedStorage)); + cutlass::Status launch_result = cutlass::Status::kSuccess; + + cutlass::arch::synclog_setup(); + + cudaLaunchConfig_t config; + config.gridDim = grid; + config.blockDim = block; + config.dynamicSmemBytes = smem_size; + config.stream = stream; + auto attr = get_cuda_launch_attribute(); + config.attrs = &attr; + config.numAttrs = 1; + + cudaLaunchKernelEx(&config, &cutlass::Kernel, params_); + + cudaError_t result = cudaGetLastError(); + if (cudaSuccess == result && cutlass::Status::kSuccess == launch_result) { + return cutlass::Status::kSuccess; + } else { + CUTLASS_TRACE_HOST(" Kernel launch failed. Reason: " << result); + return cutlass::Status::kErrorInternal; + } + } + + cutlass::Status initialize(Arguments const& args, void* workspace = nullptr, + cudaStream_t stream = nullptr) + { + // initialize the params structure from the arguments + params_ = typename UnderlyingKernel::Params(args, static_cast(workspace)); + + int smem_size = int(sizeof(typename UnderlyingKernel::SharedStorage)); + + if (smem_size >= (48 << 10)) { + cudaError_t result = + cudaFuncSetAttribute(cutlass::Kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, smem_size); + + if (result != cudaSuccess) { + return cutlass::Status::kErrorInternal; + } + } + + return cutlass::Status::kSuccess; + } + + cutlass::Status operator()(Arguments const& args, void* workspace = nullptr, + cudaStream_t stream = nullptr) + { + + cutlass::Status status = initialize(args, workspace, stream); + + if (status == cutlass::Status::kSuccess) { + status = run(stream); + } + + return status; + } + + static cutlass::Status can_implement(Arguments const& args) + { + return Base::can_implement(args); + } +}; diff --git a/src/layers/extensions/inference/def_const.h b/src/layers/extensions/inference/def_const.h new file mode 100644 index 0000000..0557cb9 --- /dev/null +++ b/src/layers/extensions/inference/def_const.h @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +constexpr float SCALE_MIN = 0.11f; +constexpr float SCALE_MAX = 16.f; +constexpr float LOG_SCALE_MIN = -2.2073f; // std::log(SCALE_MIN); +constexpr float LOG_SCALE_MAX = 2.7726f; // std::log(SCALE_MAX) +constexpr int SCALE_LEVEL = 128; +constexpr float LOG_SCALE_STEP = (LOG_SCALE_MAX - LOG_SCALE_MIN) / (SCALE_LEVEL - 1); +constexpr float LOG_SCALE_STEP_RECIP = 1.f / LOG_SCALE_STEP; + +constexpr int COND_KERNEL_THREAD_NUM1 = 1024; +constexpr int COND_KERNEL_THREAD_NUM2 = 1024; +constexpr int COND_KERNEL_PER_THREAD_NUM = 8; + +constexpr int MIN_SYMBOLS_PER_STREAM = 32768; diff --git a/src/layers/extensions/inference/def_cutlass.h b/src/layers/extensions/inference/def_cutlass.h new file mode 100644 index 0000000..7bface5 --- /dev/null +++ b/src/layers/extensions/inference/def_cutlass.h @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include + +#include "def_const.h" + +at::Tensor conv1x1_bias(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, at::Tensor& out_buf); +at::Tensor conv1x1_bias_shortcut(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const at::Tensor& shortcut, + at::Tensor& out_buf); +at::Tensor conv1x1_bias_shortcut2(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const at::Tensor& shortcut1, + const at::Tensor& shortcut2, at::Tensor& out_buf); +at::Tensor conv1x1_bias_shortcut_with_quant(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& bias, + const at::Tensor& shortcut, const at::Tensor& quant, + at::Tensor& out_buf); +at::Tensor conv1x1_bias_with_quant(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& bias, + const at::Tensor& quant, at::Tensor& out_buf); +at::Tensor conv1x1_bias_wsilu(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, at::Tensor& out_buf); +at::Tensor conv1x1_bias_wsilu_chunk_add(const int sm, const at::Tensor& feature, + const at::Tensor& weight, const at::Tensor& bias, + const at::Tensor& weight0, const at::Tensor& weight1, + const at::Tensor& weight2, const at::Tensor& weight3, + const at::Tensor& bias0, const at::Tensor& bias1, + const at::Tensor& bias2, const at::Tensor& bias3, + at::Tensor& out_buf); +at::Tensor conv2d(const at::Tensor& feature, const at::Tensor& weight, const at::Tensor& bias, + const int stride, at::Tensor& out_buf); +at::Tensor conv_bias(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const at::Tensor& bias, const int stride, at::Tensor& out_buf); +at::Tensor d3x3(const int sm, const at::Tensor& feature, const at::Tensor& weight, at::Tensor& out_buf); +at::Tensor transposed_conv(const int sm, const at::Tensor& feature, const at::Tensor& weight, + const int stride, at::Tensor& out_buf); diff --git a/src/layers/extensions/inference/def_elementwise.h b/src/layers/extensions/inference/def_elementwise.h new file mode 100644 index 0000000..64a2b19 --- /dev/null +++ b/src/layers/extensions/inference/def_elementwise.h @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include + +#include "def_const.h" + +at::Tensor add_and_multiply_broadcast_cuda(const at::Tensor& x0, const at::Tensor& x1, + const at::Tensor& q, at::Tensor& out_buf); +at::Tensor add_and_multiply_with_clamp_min_inplace_cuda(at::Tensor& x0, const at::Tensor& x1, + const at::Tensor& q); +std::tuple +build_index_dec_cuda(const at::Tensor& scales, const float skip_thres_float, + const at::optional& fx, const int32_t skip_thres_int, + at::Tensor& out_buf, at::Tensor& cond_out_buf); +std::tuple +build_index_enc_cuda(const at::Tensor& symbols, const at::Tensor& scales, + const float skip_thres_float, const at::optional& fx, + const int32_t skip_thres_int, at::Tensor& out_buf, at::Tensor& cond_out_buf); +std::tuple +conditional_index_part1_cuda(const at::Tensor& x, const at::Tensor& m, at::Tensor& out_buf, + at::Tensor& total_num_buf, at::Tensor& num_buf); +at::Tensor conditional_index_part2_cuda(const at::Tensor& x, const at::Tensor& s, + int* size_ptr = nullptr); +at::Tensor conditional_recover_with_type_conversion_cuda(const at::Tensor& x, const at::Tensor& m, + const at::Tensor& num, + const at::ScalarType dtype, + at::Tensor& out_buf); +at::Tensor divide_with_clamp_min_inplace_cuda(at::Tensor& y, const at::Tensor& q); +at::Tensor int8_to_dtype_cuda(const at::Tensor& x, const at::ScalarType dtype, const int C, + const int H, const int W, at::Tensor& out_buf); +at::Tensor multiply_with_broadcast_cuda(const at::Tensor& a, const at::Tensor& b, at::Tensor& out_buf); +at::Tensor pad_and_unshuffle_8_cuda(const at::Tensor& x, const int padB, const int padR, + at::Tensor& out_buf); +at::Tensor pixel_shuffle_2_cuda(const at::Tensor& x, at::Tensor& out_buf); +at::Tensor pixel_shuffle_8_cuda(const at::Tensor& x, bool clamp, at::Tensor& out_buf); +at::Tensor pixel_unshuffle_cuda(const at::Tensor& x, const int downscale_factor, at::Tensor& out_buf); +std::tuple +process_with_mask_cuda(const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, + const at::Tensor& mask, const float force_zero_thres_float, + const int32_t force_zero_thres_int, at::Tensor& y_q_buf, + at::Tensor& y_hat_buf, at::Tensor& s_hat_buf); +std::tuple process_with_mask_no_scale_add_and_multiply_inplace_cuda( + const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& y_q, at::Tensor& y_hat, const at::Tensor& quant, const float force_zero_thres_float, + const int32_t force_zero_thres_int); +std::tuple process_with_mask_no_scale_add_inplace_cuda( + const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& y_q, at::Tensor& y_hat, const float force_zero_thres_float, + const int32_t force_zero_thres_int); +std::tuple process_with_mask_no_scale_cuda( + const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, const at::Tensor& mask, + const float force_zero_thres_float, const int32_t force_zero_thres_int, at::Tensor& y_q_buf, + at::Tensor& y_hat_buf); +at::Tensor replicate_pad_cuda(const at::Tensor& x, const int padB, const int padR, at::Tensor& out_buf); +at::Tensor restore_y_4x_add_and_multiply_broadcast_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, + const at::Tensor& y_hat_so_far, + const at::Tensor& q, at::Tensor& out_buf); +at::Tensor restore_y_4x_and_add_inplace_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, at::Tensor& y_hat); +at::Tensor restore_y_4x_cuda(const at::Tensor& y, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& out_buf); +at::Tensor restore_y_and_add_inplace_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, at::Tensor& y_hat); +at::Tensor restore_y_and_add_multiply_inplace_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, at::Tensor& y_hat, + const at::Tensor& q); +at::Tensor restore_y_cuda(const at::Tensor& y, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& out_buf); +std::tuple round_z_cuda(const at::Tensor& z, at::Tensor& z_hat_buf, + at::Tensor& z_int8_buf); +at::Tensor single_part_for_reading_4x_cuda(const at::Tensor& x, const at::Tensor& mask, + at::Tensor& out_buf); +at::Tensor single_part_for_writing_4x_cuda(const at::Tensor& x, at::Tensor& out_buf); +at::Tensor slice_cuda(const at::Tensor& x, const int H, const int W, at::Tensor& out_buf); diff --git a/src/layers/extensions/inference/dmc_common.cpp b/src/layers/extensions/inference/dmc_common.cpp new file mode 100644 index 0000000..0610d24 --- /dev/null +++ b/src/layers/extensions/inference/dmc_common.cpp @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "dmc_common.h" + +#include + +#include "def_elementwise.h" + +void DMCCommon::capture_cuda_graph(cudaGraphExec_t& gexec, const cudaStream_t& stream, + const std::function& lambda) +{ + cudaGraph_t graph; + destroy_cuda_graph_exec(gexec); + CUDA_CHECK(cudaStreamBeginCapture(stream, cudaStreamCaptureModeThreadLocal)); + try { + lambda(); + } catch (...) { + // End capture to restore the stream from capture mode, then discard the graph. + cudaStreamEndCapture(stream, &graph); + if (graph != nullptr) { + cudaGraphDestroy(graph); + } + throw; + } + CUDA_CHECK(cudaStreamEndCapture(stream, &graph)); + CUDA_CHECK(cudaGraphInstantiate(&gexec, graph, nullptr, nullptr, 0)); + cudaGraphDestroy(graph); +} + +int DMCCommon::compute_ec_parallel(int symbol_count) +{ + int n = symbol_count / MIN_SYMBOLS_PER_STREAM; + return std::max(1, std::min(MAX_EC_PARALLEL, n)); +} + +at::Tensor DMCCommon::crop_hyper_params(const at::Tensor& hyper_params, const int H, const int W, + at::Tensor& hyper_params_out) +{ + const int H0 = hyper_params.size(2); + const int W0 = hyper_params.size(3); + if (H0 == H && W0 == W) { + return hyper_params; + } + hyper_params_out = slice_cuda(hyper_params, H, W, hyper_params_out); + return hyper_params_out; +} + +void DMCCommon::destroy_cuda_graph_exec(cudaGraphExec_t& gexec) +{ + if (gexec != nullptr) { + cudaGraphExecDestroy(gexec); + gexec = nullptr; + } +} + +at::Tensor DMCCommon::get_one_mask(const at::Tensor& micro_mask, int H, int W) +{ + auto mask = micro_mask.repeat({ (H + 1) / 2, (W + 1) / 2 }); + mask = mask.slice(0, 0, H).slice(1, 0, W); + return mask.unsqueeze(0).unsqueeze(0); +} + +std::tuple DMCCommon::get_padding_size(const int height, const int width, const int p) +{ + const int new_h = (height + p - 1) / p * p; + const int new_w = (width + p - 1) / p * p; + const int padding_right = new_w - width; + const int padding_bottom = new_h - height; + return { padding_right, padding_bottom }; +} + +at::Tensor DMCCommon::pad_for_y(const at::Tensor& y, at::Tensor& y_pad) +{ + const int H = y.size(2); + const int W = y.size(3); + auto [padding_right, padding_bottom] = get_padding_size(H, W, 4); + if (padding_right == 0 && padding_bottom == 0) { + return y; + } + y_pad = replicate_pad_cuda(y, padding_bottom, padding_right, y_pad); + return y_pad; +} + +void DMCCommon::run(const std::function& lambda, cudaGraphExec_t& gexec) +{ + auto stream = at::cuda::getCurrentCUDAStream(); + if (gexec == nullptr) { + capture_cuda_graph(gexec, stream, lambda); + } + + CUDA_CHECK(cudaGraphLaunch(gexec, stream)); +} + +void DMCCommon::run(const std::function& lambda, cudaGraphExec_t (&gexec)[g_qp_num], + const int qp) +{ + auto stream = at::cuda::getCurrentCUDAStream(); + if (gexec[0] == nullptr) { + for (int i = 0; i < g_qp_num; ++i) { + capture_cuda_graph(gexec[i], stream, [&]() { lambda(i); }); + } + } + + CUDA_CHECK(cudaGraphLaunch(gexec[qp], stream)); +} + +void DMCCommon::run(const std::function& lambda, cudaGraphExec_t (&gexec)[2], + const bool bvalue) +{ + auto stream = at::cuda::getCurrentCUDAStream(); + if (gexec[0] == nullptr) { + for (int i = 0; i < 2; ++i) { + capture_cuda_graph(gexec[i], stream, [&]() { lambda(static_cast(i)); }); + } + } + + CUDA_CHECK(cudaGraphLaunch(gexec[bvalue ? 1 : 0], stream)); +} + +void DMCCommon::run(const std::function& lambda, + cudaGraphExec_t (&gexec)[g_qp_num][2], const int qp, const bool bvalue) +{ + auto stream = at::cuda::getCurrentCUDAStream(); + if (gexec[0][0] == nullptr) { + for (int i = 0; i < g_qp_num; ++i) { + for (int j = 0; j < 2; ++j) { + capture_cuda_graph(gexec[i][j], stream, [&]() { lambda(i, static_cast(j)); }); + } + } + } + + CUDA_CHECK(cudaGraphLaunch(gexec[qp][bvalue ? 1 : 0], stream)); +} diff --git a/src/layers/extensions/inference/dmc_common.h b/src/layers/extensions/inference/dmc_common.h new file mode 100644 index 0000000..56590e2 --- /dev/null +++ b/src/layers/extensions/inference/dmc_common.h @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include + +#include "cuda_check.h" +#include "def_const.h" +#include "layers_proxy.h" +#include "py_rans.h" + +enum class DMCWorkType { + Encode, + DecodeZ, + DecodeY, +}; + +class DMCCommon { +public: + static constexpr int g_qp_num = 64; + +public: + DMCCommon() = default; + ~DMCCommon() = default; + +public: + static void capture_cuda_graph(cudaGraphExec_t& gexec, const cudaStream_t& stream, + const std::function& lambda); + static int compute_ec_parallel(int symbol_count); + static void destroy_cuda_graph_exec(cudaGraphExec_t& gexec); + static at::Tensor get_one_mask(const at::Tensor& micro_mask, int H, int W); + static std::tuple get_padding_size(const int height, const int width, const int p); + static void run(const std::function& lambda, cudaGraphExec_t& gexec); + static void run(const std::function& lambda, cudaGraphExec_t (&gexec)[g_qp_num], + const int qp); + static void run(const std::function& lambda, cudaGraphExec_t (&gexec)[2], + const bool bvalue); + static void run(const std::function& lambda, + cudaGraphExec_t (&gexec)[g_qp_num][2], const int qp, const bool bvalue); + + template + static std::shared_ptr> tensor_to_vector_1d(const at::Tensor& x) + { + auto vec = std::make_shared>(x.numel()); + if constexpr (is_gpu) { + CUDA_CHECK(cudaMemcpyAsync(vec->data(), x.data_ptr(), x.numel() * sizeof(T), + cudaMemcpyDeviceToHost, at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaStreamSynchronize(at::cuda::getCurrentCUDAStream())); + } else { + memcpy(vec->data(), x.data_ptr(), x.numel() * sizeof(T)); + } + return vec; + } + +protected: + at::Tensor crop_hyper_params(const at::Tensor& hyper_params, const int H, const int W, + at::Tensor& hyper_params_out); + at::Tensor pad_for_y(const at::Tensor& y, at::Tensor& y_pad); + +protected: + int m_entropy_coder_parallel{ 0 }; + RansEncoder m_entropy_encoder; + RansDecoder m_entropy_decoder; +}; diff --git a/src/layers/extensions/inference/dmc_htl_proxy.cpp b/src/layers/extensions/inference/dmc_htl_proxy.cpp new file mode 100644 index 0000000..7b523a4 --- /dev/null +++ b/src/layers/extensions/inference/dmc_htl_proxy.cpp @@ -0,0 +1,1178 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include +#include + +#include "common_cpp.h" +#include "cuda_check.h" +#include "def_cutlass.h" +#include "def_elementwise.h" +#include "dmc_htl_proxy.h" +#include "memory_pool.h" + +at::Tensor DMCHTLDecoderProxy::forward(const at::Tensor& x, const at::Tensor& conv1_input, + const at::Tensor& quant) +{ + auto out = forward_part1(x); + out = forward_part2(conv1_input, quant); + return out; +} + +at::Tensor DMCHTLDecoderProxy::forward_part1(const at::Tensor& x) +{ + return m_up.forward(x); +} + +at::Tensor DMCHTLDecoderProxy::forward_part2(const at::Tensor& x, const at::Tensor& quant) +{ + auto out = m_conv10.forward(x); + out = m_conv11.forward(out); + out = m_conv12.forward(out); + out = m_conv13.forward(out); + out = m_conv14.forward(out); + out = m_conv15.forward(out); + out = m_conv16.forward(out); + out = m_conv17.forward(out); + out = m_conv18.forward(out); + out = m_conv19.forward(out); + out = m_conv1a.forward(out); + out = multiply_with_broadcast_cuda(out, quant, out); + return out; +} + +at::Tensor DMCHTLDecoderProxy::pre_allocate_tensors(at::Tensor& x, at::Tensor& up_out_buf, + at::Tensor& conv1_input_buf, + const at::Tensor& out_buf) +{ + m_up.pre_allocate_tensors(x, up_out_buf); + m_conv1_out = out_buf; + auto out = m_conv10.pre_allocate_tensors(conv1_input_buf, true); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv12.pre_allocate_tensors(out); + out = m_conv13.pre_allocate_tensors(out); + out = m_conv14.pre_allocate_tensors(out); + out = m_conv15.pre_allocate_tensors(out); + out = m_conv16.pre_allocate_tensors(out); + out = m_conv17.pre_allocate_tensors(out); + out = m_conv18.pre_allocate_tensors(out); + out = m_conv19.pre_allocate_tensors(out); + out = m_conv1a.pre_allocate_tensors(out, false, m_conv1_out); + + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv12.release_tensors(); + m_conv13.release_tensors(); + m_conv14.release_tensors(); + m_conv15.release_tensors(); + m_conv16.release_tensors(); + m_conv17.release_tensors(); + m_conv18.release_tensors(); + m_conv19.release_tensors(); + m_conv1a.release_tensors(); + g_tensor_pool.set_reusable(m_conv1_out, false); + return m_conv1_out; +} + +void DMCHTLDecoderProxy::set_param(const std::map& state_dict) +{ + m_up.set_param(get_submodule_state_dict(state_dict, "up.")); + m_conv10.set_param(get_submodule_state_dict(state_dict, "conv1.0.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "conv1.1.")); + m_conv12.set_param(get_submodule_state_dict(state_dict, "conv1.2.")); + m_conv13.set_param(get_submodule_state_dict(state_dict, "conv1.3.")); + m_conv14.set_param(get_submodule_state_dict(state_dict, "conv1.4.")); + m_conv15.set_param(get_submodule_state_dict(state_dict, "conv1.5.")); + m_conv16.set_param(get_submodule_state_dict(state_dict, "conv1.6.")); + m_conv17.set_param(get_submodule_state_dict(state_dict, "conv1.7.")); + m_conv18.set_param(get_submodule_state_dict(state_dict, "conv1.8.")); + m_conv19.set_param(get_submodule_state_dict(state_dict, "conv1.9.")); + m_conv1a.set_param(get_submodule_state_dict(state_dict, "conv1.10.")); +} + +at::Tensor DMCHTLEncoderProxy::forward(const at::Tensor& x, const at::Tensor& quant) +{ + const int sm = get_gpu_sm(); + auto out = m_conv10.forward(x); + out = m_conv11.forward(out); + out = m_conv12.forward(out); + out = m_conv13.forward(out); + out = m_conv14.forward(out); + out = m_conv15.forward(out); + out = m_conv16.forward(out); + out = multiply_with_broadcast_cuda(out, quant, out); + out = conv_bias(sm, out, m_down_weight, m_down_bias, 2, m_down_out); + return out; +} + +at::Tensor DMCHTLEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_down_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_down = m_down_weight.size(0); + m_down_out = g_tensor_pool.empty({ 1, ch_down, H / 2, W / 2 }, options); + auto out = m_conv10.pre_allocate_tensors(x, true); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv12.pre_allocate_tensors(out); + out = m_conv13.pre_allocate_tensors(out); + out = m_conv14.pre_allocate_tensors(out); + out = m_conv15.pre_allocate_tensors(out); + out = m_conv16.pre_allocate_tensors(out); + + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv12.release_tensors(); + m_conv13.release_tensors(); + m_conv14.release_tensors(); + m_conv15.release_tensors(); + m_conv16.release_tensors(); + return m_down_out; +} + +void DMCHTLEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv10.set_param(get_submodule_state_dict(state_dict, "conv1.0.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "conv1.1.")); + m_conv12.set_param(get_submodule_state_dict(state_dict, "conv1.2.")); + m_conv13.set_param(get_submodule_state_dict(state_dict, "conv1.3.")); + m_conv14.set_param(get_submodule_state_dict(state_dict, "conv1.4.")); + m_conv15.set_param(get_submodule_state_dict(state_dict, "conv1.5.")); + m_conv16.set_param(get_submodule_state_dict(state_dict, "conv1.6.")); + m_down_weight = state_dict.at("down.weight"); + m_down_bias = state_dict.at("down.bias"); +} + +at::Tensor DMCHTLFeatureAdaptorIProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCHTLFeatureAdaptorIProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTLFeatureAdaptorIProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); +} + +at::Tensor DMCHTLFeatureAdaptorMProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + out = m_conv4.forward(out); + out = m_conv5.forward(out); + out = m_conv6.forward(out); + out = m_conv7.forward(out); + out = m_conv8.forward(out); + out = m_conv9.forward(out); + return out; +} + +at::Tensor DMCHTLFeatureAdaptorMProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out); + out = m_conv4.pre_allocate_tensors(out); + out = m_conv5.pre_allocate_tensors(out); + out = m_conv6.pre_allocate_tensors(out); + out = m_conv7.pre_allocate_tensors(out); + out = m_conv8.pre_allocate_tensors(out); + out = m_conv9.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + m_conv4.release_tensors(); + m_conv5.release_tensors(); + m_conv6.release_tensors(); + m_conv7.release_tensors(); + m_conv8.release_tensors(); + m_conv9.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTLFeatureAdaptorMProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); + m_conv4.set_param(get_submodule_state_dict(state_dict, "conv.4.")); + m_conv5.set_param(get_submodule_state_dict(state_dict, "conv.5.")); + m_conv6.set_param(get_submodule_state_dict(state_dict, "conv.6.")); + m_conv7.set_param(get_submodule_state_dict(state_dict, "conv.7.")); + m_conv8.set_param(get_submodule_state_dict(state_dict, "conv.8.")); + m_conv9.set_param(get_submodule_state_dict(state_dict, "conv.9.")); +} + +at::Tensor DMCHTLFeatureExtractorProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + return out; +} + +at::Tensor DMCHTLFeatureExtractorProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTLFeatureExtractorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); +} + +at::Tensor DMCHTLHyperDecoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCHTLHyperDecoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTLHyperDecoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0."), true); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), true); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); +} + +at::Tensor DMCHTLHyperEncoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCHTLHyperEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTLHyperEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), true); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2."), true); +} + +at::Tensor DMCHTLPriorFusionProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCHTLPriorFusionProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_conv3_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_conv3 = m_conv3_weight.size(0); + m_conv3_out = g_tensor_pool.empty({ 1, ch_conv3, H, W }, options); + // x is a cat parameter, will be further used + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCHTLPriorFusionProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +at::Tensor DMCHTLReconHeadProxy::forward_reset(const at::Tensor& x) +{ + constexpr int conv_index = g_frame_delay - 1; + const int sm = get_gpu_sm(); + auto out = m_conv0[conv_index].forward(x); + out = m_conv1[conv_index].forward(out); + out = m_conv2[conv_index].forward(out); + out = m_conv3[conv_index].forward(out); + out = m_conv4[conv_index].forward(out); + out = conv1x1_bias(sm, out, m_head_weight[conv_index], m_head_bias[conv_index], + m_head_out[conv_index]); + return out; +} + +std::tuple, at::Tensor> DMCHTLReconHeadProxy::forward(const at::Tensor& x) +{ + at::Tensor for_reset; + const int sm = get_gpu_sm(); + auto all_out = std::vector(g_frame_delay); + for (int i = 0; i < g_frame_delay; i++) { + auto out = m_conv0[i].forward(x); + out = m_conv1[i].forward(out); + out = m_conv2[i].forward(out); + out = m_conv3[i].forward(out); + out = m_conv4[i].forward(out); + out = conv1x1_bias(sm, out, m_head_weight[i], m_head_bias[i], m_head_out[i]); + if (i == g_frame_delay - 1) { + for_reset = out; + } + out = pixel_shuffle_8_cuda(out, true, m_shuffle_out[i]); + all_out[i] = out; + } + return { all_out, for_reset }; +} + +at::Tensor DMCHTLReconHeadProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_head_weight[0].options().memory_format(at::MemoryFormat::ChannelsLast); + const int C = m_head_weight[0].size(0); + for (int i = 0; i < g_frame_delay; i++) { + if (i != g_frame_delay - 1) { + m_head_out[i] = g_tensor_pool.empty({ 1, C, H, W }, options); + } else { + m_head_out[i] = out_buf; + } + m_shuffle_out[i] = at::empty({ 1, C / 64, H * 8, W * 8 }, options); + + auto out = m_conv0[i].pre_allocate_tensors(x, true); // must not modify! + out = m_conv1[i].pre_allocate_tensors(out); + out = m_conv2[i].pre_allocate_tensors(out); + out = m_conv3[i].pre_allocate_tensors(out); + out = m_conv4[i].pre_allocate_tensors(out); + if (i != g_frame_delay - 1) { + g_tensor_pool.release(m_head_out[i]); + } + m_conv0[i].release_tensors(); + m_conv1[i].release_tensors(); + m_conv2[i].release_tensors(); + m_conv3[i].release_tensors(); + m_conv4[i].release_tensors(); + } + return m_head_out[g_frame_delay - 1]; +} + +void DMCHTLReconHeadProxy::set_param(const std::map& state_dict) +{ + for (int i = 0; i < g_frame_delay; i++) { + m_conv0[i].set_param(get_submodule_state_dict(state_dict, "conv." + std::to_string(i) + ".0.")); + m_conv1[i].set_param(get_submodule_state_dict(state_dict, "conv." + std::to_string(i) + ".1.")); + m_conv2[i].set_param(get_submodule_state_dict(state_dict, "conv." + std::to_string(i) + ".2.")); + m_conv3[i].set_param(get_submodule_state_dict(state_dict, "conv." + std::to_string(i) + ".3.")); + m_conv4[i].set_param(get_submodule_state_dict(state_dict, "conv." + std::to_string(i) + ".4.")); + m_head_weight[i] = state_dict.at("conv." + std::to_string(i) + ".5.weight"); + m_head_bias[i] = state_dict.at("conv." + std::to_string(i) + ".5.bias"); + } +} + +at::Tensor DMCHTLSpatialPriorProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCHTLSpatialPriorProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + m_conv3_out = out_buf; + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCHTLSpatialPriorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +at::Tensor DMCHTLTemporalPriorEncoderProxy::forward(const at::Tensor& x) +{ + return m_conv.forward(x); +} + +at::Tensor DMCHTLTemporalPriorEncoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv.pre_allocate_tensors(x, out_buf); + m_conv.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTLTemporalPriorEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv.set_param(get_submodule_state_dict(state_dict, "conv."), true); +} + +DMCHTLProxy::DMCHTLProxy() +{ + CUDA_CHECK(cudaMallocHost((void**)&m_size_ptr, sizeof(int))); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y_ready, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_z_ready, cudaEventDisableTiming)); + m_thread = std::thread(&DMCHTLProxy::worker, this); +} + +DMCHTLProxy::~DMCHTLProxy() +{ + { + std::lock_guard lk(m_mutex_pending); + m_finish = true; + } + m_cv_pending.notify_all(); + if (m_thread.joinable()) { + m_thread.join(); + } + cudaEventDestroy(m_event_y); + cudaEventDestroy(m_event_y_ready); + cudaEventDestroy(m_event_z_ready); + cudaFreeHost(m_size_ptr); + + clear_cuda_graph(); +} + +void DMCHTLProxy::worker() +{ + at::cuda::CUDAStream high_priority_stream = at::cuda::getStreamFromPool(true); + at::cuda::CUDAStreamGuard guard(high_priority_stream); + + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending || m_finish; }); + if (m_finish) { + break; + } + m_pending = false; + lk.unlock(); + + if (m_pending_work == DMCWorkType::Encode) { + m_entropy_encoder.reset(); + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + + // build_index_enc and conditional_index for each of the 4 mask steps + // Process in reverse order (3,2,1,0) to match Python encode order + int total_symbol_count = 0; + for (int i = 3; i >= 0; i--) { + auto out = conditional_index_part2_cuda(m_y_symbol[i], m_y_size[i], m_size_ptr); + m_y_to_encode_size[i] = *m_size_ptr; + total_symbol_count += *m_size_ptr; + CUDA_CHECK(cudaMemcpyAsync(m_y_to_encode[i]->data(), out.data_ptr(), + (*m_size_ptr) * sizeof(int16_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + } + CUDA_CHECK(cudaStreamSynchronize(at::cuda::getCurrentCUDAStream())); + + m_entropy_coder_parallel = compute_ec_parallel(total_symbol_count); + m_entropy_encoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + + // Encode in reverse order (3,2,1,0) to match Python + for (int i = 3; i >= 0; i--) { + m_entropy_encoder.encode_y(m_y_to_encode[i], m_y_to_encode_size[i]); + } + + auto t = tensor_to_vector_1d(m_z_hat_io); + m_entropy_encoder.encode_z(t, m_qp * g_ch_z, g_ch_z); + m_entropy_encoder.flush(); + } else if (m_pending_work == DMCWorkType::DecodeZ) { + m_entropy_decoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + m_entropy_decoder.set_stream(m_bit_stream, m_bit_stream_size); + const int z_num = g_ch_z * m_z_height * m_z_width; + m_entropy_decoder.decode_z(z_num, m_qp * g_ch_z, g_ch_z); + + auto z_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_z_hat_io.data_ptr(), z_cpu->data(), + z_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_z_ready, at::cuda::getCurrentCUDAStream())); + } else if (m_pending_work == DMCWorkType::DecodeY) { + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + auto out = conditional_index_part2_cuda(m_y_indexes, m_y_indexes_size, m_size_ptr); + const int y_num = *m_size_ptr; + CUDA_CHECK(cudaMemcpyAsync(m_y_to_decode->data(), out.data_ptr(), + y_num * sizeof(uint8_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + + m_entropy_decoder.decode_y(m_y_to_decode, y_num); + + auto y_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_y_decoded.data_ptr(), y_cpu->data(), + y_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_y_ready, at::cuda::getCurrentCUDAStream())); + } else { + assert(false); + } + + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + } +} + +void DMCHTLProxy::add_ref_feature_from_frame(const at::Tensor& frame, const bool apply_adaptor) +{ + pre_allocate_tensors(frame); + // must NOT use cuda graph becase frame.data_ptr() is non-const + m_feature_i = pixel_unshuffle_cuda(frame, 8, m_feature_i); + if (apply_adaptor) { + m_memory = m_feature_adaptor_i.forward(m_feature_i); + m_ctx = m_feature_extractor.forward(m_memory); + } + m_memory_has_value = apply_adaptor; +} + +py::tuple DMCHTLProxy::compress(const at::Tensor& x, const int qp, const bool reset_feature_memory, + const int padding_b, const int padding_r) +{ + m_result_ready = false; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + // must NOT use cuda graph becase x.data_ptr() is non-const + m_enc_unshuffle_out = pad_and_unshuffle_8_cuda(x, padding_b, padding_r, m_enc_unshuffle_out); + + // ----------- start of lambda_enc_0 ----------- + auto lambda_enc_0 = [&](const int qp) { + // need to output [m_z_hat_io, m_y_symbol[0..3], m_y_size[0..3]] for cpu thread + auto y = m_encoder.forward(m_cat_encoder, m_q_encoder[qp]); + auto y_pad = pad_for_y(y, m_y_pad); + auto z = m_hyper_encoder.forward(y_pad); + std::tie(m_z_hat, m_z_hat_io) = round_z_cuda(z, m_z_hat, m_z_hat_io); + m_temporal_input = multiply_with_broadcast_cuda(m_memory, m_q_feature[qp], m_temporal_input); + m_temporal_params = m_temporal_prior_encoder.forward(m_temporal_input); + m_hyper_params_pad4 = m_hyper_decoder.forward(m_z_hat); + m_hyper_params = crop_hyper_params(m_hyper_params_pad4, m_temporal_params.size(2), + m_temporal_params.size(3), m_hyper_params); + m_common_params = m_y_prior_fusion.forward(m_cat_prior_fusion); + + auto [q_dec, scales, means] = chunk_tensors_3(m_common_params); + y = divide_with_clamp_min_inplace_cuda(y, q_dec); + + const int sm = get_gpu_sm(); + m_reduced_params = conv1x1_bias(sm, m_common_params, m_y_spatial_prior_reduction.weight, + m_y_spatial_prior_reduction.bias, m_reduced_params); + + // Step 0: process with mask_0 + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_0, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[0], m_y_size[0], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[0], m_y_size[0], m_y_num); + + // copy y_hat to y_hat_so_far (first 256 channels of m_cat_spatial_prior_adaptor) + m_y_hat_so_far.copy_(m_y_hat); + + // Step 1: adaptor_1 → spatial_prior → chunk2 → new scales, means + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_1.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_1, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[1], m_y_size[1], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[1], m_y_size[1], m_y_num); + + // y_hat_so_far += y_hat_1 + m_y_hat_so_far.add_(m_y_hat); + + // Step 2: adaptor_2 → spatial_prior → chunk2 → new scales, means + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_2.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_2, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[2], m_y_size[2], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[2], m_y_size[2], m_y_num); + + // y_hat_so_far += y_hat_2 + m_y_hat_so_far.add_(m_y_hat); + + // Step 3: adaptor_3 → spatial_prior → chunk2 → final add_and_multiply + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_3.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_3, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[3], m_y_size[3], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[3], m_y_size[3], m_y_num); + + // y_hat_final = add_and_multiply_with_clamp_min_inplace(y_hat_3, y_hat_so_far, q_dec) + // swap args so result is in m_y_hat (decoder's pre-allocated input) + m_y_hat = add_and_multiply_with_clamp_min_inplace_cuda(m_y_hat, m_y_hat_so_far, q_dec); + }; + + run(lambda_enc_0, m_gexec_enc_0, m_qp); + // ------------ end of lambda_enc_0 ------------ + + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::Encode; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_enc_1 ----------- + auto lambda_enc_1 = [&](const int qp, const bool reset_feature_memory) { + m_feature_p = m_decoder.forward(m_y_hat, m_cat_decoder, m_q_decoder[qp]); + add_ref_feature_and_apply_adaptor(m_feature_p, reset_feature_memory); + }; + + run(lambda_enc_1, m_gexec_enc_1, m_qp, reset_feature_memory); + // ------------ end of lambda_enc_1 ------------ + + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (m_result_ready) { + return py::make_tuple(m_entropy_encoder.get_encoded_stream(), m_entropy_coder_parallel); + } + return py::make_tuple(py::array_t(0), 1); +} + +std::vector DMCHTLProxy::decompress(const py::array_t& bit_stream, + const int qp, const int height, const int width, + const int entropy_coder_parallel, + const bool reset_feature_memory) +{ + m_result_ready = false; + m_entropy_coder_parallel = entropy_coder_parallel; + py::buffer_info bit_stream_buf = bit_stream.request(); + m_bit_stream = static_cast(bit_stream_buf.ptr); + m_bit_stream_size = static_cast(bit_stream.size()); + m_z_height = (height + 63) / 64; + m_z_width = (width + 63) / 64; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeZ; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_dec_0 ----------- + auto lambda_dec_0 = [&](const int qp, const bool memory_has_value) { + apply_feature_adaptor(memory_has_value); + m_temporal_input = multiply_with_broadcast_cuda(m_memory, m_q_feature[qp], m_temporal_input); + m_temporal_params = m_temporal_prior_encoder.forward(m_temporal_input); + }; + + run(lambda_dec_0, m_gexec_dec_0, m_qp, m_memory_has_value); + // ------------ end of lambda_dec_0 ------------ + + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (!m_result_ready) { + return std::vector(); + } + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_z_ready)); + + at::Tensor q_dec; + at::Tensor scales; + at::Tensor means; + // ----------- start of lambda_dec_1 ----------- + auto lambda_dec_1 = [&]() { + m_z_hat = int8_to_dtype_cuda(m_z_hat_io, m_dtype, g_ch_z, m_z_height, m_z_width, m_z_hat); + m_hyper_params_pad4 = m_hyper_decoder.forward(m_z_hat); + m_hyper_params = crop_hyper_params(m_hyper_params_pad4, m_temporal_params.size(2), + m_temporal_params.size(3), m_hyper_params); + m_common_params = m_y_prior_fusion.forward(m_cat_prior_fusion); + + const int sm = get_gpu_sm(); + m_reduced_params = conv1x1_bias(sm, m_common_params, m_y_spatial_prior_reduction.weight, + m_y_spatial_prior_reduction.bias, m_reduced_params); + + m_ctx = m_feature_extractor.forward(m_memory); + + std::tie(q_dec, scales, means) = chunk_tensors_3(m_common_params); + // Step 0: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_0, m_y_indexes_skip_cond, m_y_indexes_num); + }; + + run(lambda_dec_1, m_gexec_dec_1); + // ------------ end of lambda_dec_1 ------------ + + // Step 0: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_2 ----------- + auto lambda_dec_2 = [&]() { + // Step 0: recover + restore + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + m_y_hat_so_far = restore_y_4x_cuda(m_y_q_r, means, m_mask_0, m_y_hat_so_far); + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_1.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + // Step 1: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_1, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_2, m_gexec_dec_2); + // ------------ end of lambda_dec_2 ------------ + + // Step 1: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_3 ----------- + auto lambda_dec_3 = [&]() { + // Step 1: recover + restore + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + restore_y_4x_and_add_inplace_cuda(m_y_q_r, means, m_mask_1, m_y_hat_so_far); + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_2.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + // Step 2: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_2, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_3, m_gexec_dec_3); + // ------------ end of lambda_dec_3 ------------ + + // Step 2: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_4 ----------- + auto lambda_dec_4 = [&]() { + // Step 2: recover + restore + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + restore_y_4x_and_add_inplace_cuda(m_y_q_r, means, m_mask_2, m_y_hat_so_far); + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_3.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + // Step 3: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_3, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_4, m_gexec_dec_4); + // ------------ end of lambda_dec_4 ------------ + + // Step 3: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_5 ----------- + auto lambda_dec_5 = [&](const int qp) { + // Step 3: recover + restore (QP-dependent due to q_dec) + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + m_y_hat = restore_y_4x_cuda(m_y_q_r, means, m_mask_3, m_y_hat); + // swap args so result is in m_y_hat (decoder's pre-allocated input) + m_y_hat = add_and_multiply_with_clamp_min_inplace_cuda(m_y_hat, m_y_hat_so_far, q_dec); + // decoder + recon_head + m_feature_p = m_decoder.forward(m_y_hat, m_cat_decoder, m_q_decoder[qp]); + std::tie(m_x_hat, m_feature_i) = + m_recon_head.forward(m_feature_p); // m_feature_i is also updated for reset purpose; + }; + + run(lambda_dec_5, m_gexec_dec_5, m_qp); + // ------------ end of lambda_dec_5 ------------ + + m_memory_has_value = !reset_feature_memory; // host operation. must be outside of cuda graph + + return m_x_hat; +} + +void DMCHTLProxy::set_param(const std::map& state_dict, + const float skip_threshold) +{ + m_device = state_dict.at("q_decoder").device(); + m_dtype = state_dict.at("q_decoder").scalar_type(); + auto q_encoder = state_dict.at("q_encoder"); + auto q_decoder = state_dict.at("q_decoder"); + auto q_feature = state_dict.at("q_feature"); + for (int i = 0; i < g_qp_num; i++) { + m_q_encoder[i] = q_encoder.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_decoder[i] = q_decoder.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_feature[i] = q_feature.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + } + m_encoder.set_param(get_submodule_state_dict(state_dict, "encoder.")); + m_hyper_encoder.set_param(get_submodule_state_dict(state_dict, "hyper_encoder.")); + m_temporal_prior_encoder.set_param( + get_submodule_state_dict(state_dict, "temporal_prior_encoder.")); + m_hyper_decoder.set_param(get_submodule_state_dict(state_dict, "hyper_decoder.")); + m_y_prior_fusion.set_param(get_submodule_state_dict(state_dict, "y_prior_fusion.")); + m_y_spatial_prior_reduction.set_param(state_dict, "y_spatial_prior_reduction."); + m_y_spatial_prior_adaptor_1.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_1.")); + m_y_spatial_prior_adaptor_2.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_2.")); + m_y_spatial_prior_adaptor_3.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_3.")); + m_y_spatial_prior.set_param(get_submodule_state_dict(state_dict, "y_spatial_prior.")); + m_decoder.set_param(get_submodule_state_dict(state_dict, "decoder.")); + m_feature_adaptor_i.set_param(get_submodule_state_dict(state_dict, "feature_adaptor_i.")); + m_feature_adaptor_m.set_param(get_submodule_state_dict(state_dict, "feature_adaptor_m.")); + m_feature_extractor.set_param(get_submodule_state_dict(state_dict, "feature_extractor.")); + m_recon_head.set_param(get_submodule_state_dict(state_dict, "recon_head.")); + + m_skip_threshold = skip_threshold; + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); + + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); +} + +void DMCHTLProxy::add_ref_feature_and_apply_adaptor(const at::Tensor& feature, + const bool reset_feature_memory) +{ + if (reset_feature_memory) { + auto out = m_recon_head.forward_reset(feature); + m_memory = m_feature_adaptor_i.forward(out); + } else { + m_memory = m_feature_adaptor_m.forward(m_cat_feature_adaptor_m); + } + m_ctx = m_feature_extractor.forward(m_memory); +} + +void DMCHTLProxy::apply_feature_adaptor(const bool memory_has_value) +{ + if (memory_has_value) { + m_memory = m_feature_adaptor_m.forward(m_cat_feature_adaptor_m); + } else { + m_memory = m_feature_adaptor_i.forward(m_feature_i); + } +} + +void DMCHTLProxy::clear_cuda_graph() +{ + for (int i = 0; i < g_qp_num; ++i) { + destroy_cuda_graph_exec(m_gexec_enc_0[i]); + for (int j = 0; j < 2; ++j) { + destroy_cuda_graph_exec(m_gexec_enc_1[i][j]); + } + for (int j = 0; j < 2; ++j) { + destroy_cuda_graph_exec(m_gexec_dec_0[i][j]); + } + destroy_cuda_graph_exec(m_gexec_dec_5[i]); + } + destroy_cuda_graph_exec(m_gexec_dec_1); + destroy_cuda_graph_exec(m_gexec_dec_2); + destroy_cuda_graph_exec(m_gexec_dec_3); + destroy_cuda_graph_exec(m_gexec_dec_4); +} + +at::Tensor DMCHTLProxy::decode_y_step_build_index(const at::Tensor& scales, const at::Tensor& mask, + at::Tensor& skip_cond_out, at::Tensor& indexes_num_out) +{ + m_scales_r = single_part_for_reading_4x_cuda(scales, mask, m_scales_r); + std::tie(m_y_indexes_prev, skip_cond_out) = build_index_dec_cuda( + m_scales_r, m_skip_threshold, at::nullopt, 0, m_y_indexes_prev, skip_cond_out); + std::tie(m_y_indexes, m_y_indexes_size, indexes_num_out) = conditional_index_part1_cuda( + m_y_indexes_prev, skip_cond_out, m_y_indexes, m_y_indexes_size, indexes_num_out); + return m_y_indexes; +} + +std::tuple DMCHTLProxy::get_mask_4x(const at::Tensor& y) +{ + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + auto m = at::ones({ 1, C / 4, H, W }, y.options().dtype(at::kBool)); + auto m0 = get_one_mask(torch::tensor({ { 1, 0 }, { 0, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m1 = get_one_mask(torch::tensor({ { 0, 1 }, { 0, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m2 = get_one_mask(torch::tensor({ { 0, 0 }, { 1, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m3 = get_one_mask(torch::tensor({ { 0, 0 }, { 0, 1 } }, y.options().dtype(at::kBool)), H, W); + + auto mask_0 = + at::cat({ m * m0, m * m1, m * m2, m * m3 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_1 = + at::cat({ m * m3, m * m2, m * m1, m * m0 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_2 = + at::cat({ m * m2, m * m3, m * m0, m * m1 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_3 = + at::cat({ m * m1, m * m0, m * m3, m * m2 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + + return { mask_0, mask_1, mask_2, mask_3 }; +} + +void DMCHTLProxy::pre_allocate_tensors(const at::Tensor& frame) +{ + int H = frame.size(2); + int W = frame.size(3); + H = (H + 16 - 1) / 16 * 16; + W = (W + 16 - 1) / 16 * 16; + const int H8 = H / 8; + const int W8 = W / 8; + if (m_H8 == H8 && m_W8 == W8) { + return; + } + + m_H8 = H8; + m_W8 = W8; + clear_cuda_graph(); + g_tensor_pool.clear(H8, W8); + + auto options = frame.options().memory_format(at::MemoryFormat::ChannelsLast); + const int H16 = H8 / 2; + const int W16 = W8 / 2; + auto [padR, padB] = get_padding_size(H16, W16, 4); + const int H16_pad4 = H16 + padB; + const int W16_pad4 = W16 + padR; + const int H64 = H16_pad4 / 4; + const int W64 = W16_pad4 / 4; + + const std::vector feature_i_shape = { 1, g_ch_src_d_intra, H8, W8 }; + const std::vector memory_shape = { 1, g_ch_m, H8, W8 }; + const std::vector y_shape = { 1, g_ch_y, H16, W16 }; + const std::vector y_pad_shape = { 1, g_ch_y, H16_pad4, W16_pad4 }; + const std::vector z_shape = { 1, g_ch_z, H64, W64 }; + + auto y = at::empty(y_shape, options); + + // pre allocate masks + std::tie(m_mask_0, m_mask_1, m_mask_2, m_mask_3) = get_mask_4x(y); + + // pre allocate entropy coder buffers + const int y_quarter_numel = g_ch_y / 4 * H16 * W16; + for (int i = 0; i < 4; i++) { + m_y_to_encode[i] = std::make_shared>(y_quarter_numel); + } + + // + // pre allocate concatenated tensors + // + + // 1. deal with m_cat_encoder, m_cat_decoder, m_enc_unshuffle_out, m_decoder_up_out, and m_ctx + assert(g_ch_src_d > g_ch_d); + at::Tensor tensor_placeholder; + m_cat_encoder = at::empty({ 1, g_ch_src_d + g_ch_d, H8, W8 }, options); + std::tie(tensor_placeholder, m_cat_decoder) = + split_tensors_2(m_cat_encoder, g_ch_src_d - g_ch_d, g_ch_d * 2); + std::tie(tensor_placeholder, m_decoder_up_out, m_ctx) = + split_tensors_3(m_cat_encoder, g_ch_src_d - g_ch_d, g_ch_d, g_ch_d); + std::tie(m_enc_unshuffle_out, m_ctx) = split_tensors_2(m_cat_encoder, g_ch_src_d, g_ch_d); + + // 2. deal with m_cat_feature_adaptor_m, m_memory, and m_feature_p + m_cat_feature_adaptor_m = at::empty({ 1, g_ch_m + g_ch_d, H8, W8 }, options); + std::tie(m_memory, m_feature_p) = split_tensors_2(m_cat_feature_adaptor_m, g_ch_m, g_ch_d); + + // 3. deal with m_cat_prior_fusion, m_hyper_params, and m_temporal_params + m_cat_prior_fusion = at::empty({ 1, g_ch_y * 3, H16, W16 }, options); + std::tie(m_hyper_params, m_temporal_params) = + split_tensors_2(m_cat_prior_fusion, g_ch_y, g_ch_y * 2); + m_hyper_params_pad4 = (padR == 0 && padB == 0) ? m_hyper_params : at::empty(y_pad_shape, options); + + // 4. deal with m_cat_spatial_prior_adaptor, m_y_hat_so_far, and m_reduced_params + m_cat_spatial_prior_adaptor = at::empty({ 1, g_ch_y * 2, H16, W16 }, options); + std::tie(m_y_hat_so_far, m_reduced_params) = + split_tensors_2(m_cat_spatial_prior_adaptor, g_ch_y, g_ch_y); + + // pre allocate other tensors + m_feature_i = at::empty(feature_i_shape, options); + m_temporal_input = at::empty(memory_shape, options); + + m_z_hat = at::empty(z_shape, options.dtype(at::kHalf)); + m_z_hat_io = at::empty(z_shape, options.dtype(at::kChar)); + + m_spatial_prior_out = at::empty({ 1, g_ch_y * 2, H16, W16 }, options); + m_y_q = at::empty_like(y); + m_y_hat = at::empty_like(y); + m_s_hat = at::empty_like(y); + + m_y_q_w = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_s_w = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_y_symbol_prev = at::empty({ y_quarter_numel }, y.options().dtype(at::kShort)); + m_skip_cond = at::empty({ y_quarter_numel }, y.options().dtype(at::kBool)); + { + const int block_num_quarter = + (y_quarter_numel + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + m_y_num = + at::empty({ block_num_quarter, COND_KERNEL_THREAD_NUM1 }, y.options().dtype(at::kInt)); + } + for (int i = 0; i < 4; i++) { + m_y_symbol[i] = at::empty({ y_quarter_numel }, y.options().dtype(at::kShort)); + m_y_size[i] = at::empty({ 1 }, y.options().dtype(at::kInt)); + } + + // decompress-only buffers + m_y_q_r = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_scales_r = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_y_decoded = at::empty({ y_quarter_numel }, y.options().dtype(at::kChar)); + m_y_to_decode = std::make_shared>(y_quarter_numel); + m_y_indexes = at::empty({ y_quarter_numel }, y.options().dtype(at::kByte)); + m_y_indexes_prev = at::empty_like(m_y_indexes); + m_y_indexes_skip_cond = at::empty({ y_quarter_numel }, y.options().dtype(at::kBool)); + { + const int block_num_quarter = + (y_quarter_numel + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + m_y_indexes_size = at::empty({ 1 }, y.options().dtype(at::kInt)); + m_y_indexes_num = + at::empty({ block_num_quarter, COND_KERNEL_THREAD_NUM1 }, y.options().dtype(at::kInt)); + } + + // pre allocate modules + m_y = m_encoder.pre_allocate_tensors(m_cat_encoder); + m_y_pad = (padR == 0 && padB == 0) ? m_y : at::empty(y_pad_shape, options); + auto enc_z = m_hyper_encoder.pre_allocate_tensors(m_y_pad); + m_temporal_params = + m_temporal_prior_encoder.pre_allocate_tensors(m_temporal_input, m_temporal_params); + m_hyper_params_pad4 = m_hyper_decoder.pre_allocate_tensors(m_z_hat, m_hyper_params_pad4); + m_common_params = m_y_prior_fusion.pre_allocate_tensors(m_cat_prior_fusion); + auto adaptor_out = + m_y_spatial_prior_adaptor_1.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true); + m_y_spatial_prior_adaptor_2.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true, adaptor_out); + m_y_spatial_prior_adaptor_3.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true, adaptor_out); + m_spatial_prior_out = m_y_spatial_prior.pre_allocate_tensors(adaptor_out, m_spatial_prior_out); + m_feature_p = m_decoder.pre_allocate_tensors(m_y_hat, m_decoder_up_out, m_cat_decoder, m_feature_p); + m_memory = m_feature_adaptor_i.pre_allocate_tensors(m_feature_i, m_memory); + m_memory = m_feature_adaptor_m.pre_allocate_tensors(m_cat_feature_adaptor_m, m_memory); + m_ctx = m_feature_extractor.pre_allocate_tensors(m_memory, m_ctx); + m_feature_i = m_recon_head.pre_allocate_tensors( + m_feature_p, m_feature_i); // the recon is not used in cuda graph, only use feature for reset +} diff --git a/src/layers/extensions/inference/dmc_htl_proxy.h b/src/layers/extensions/inference/dmc_htl_proxy.h new file mode 100644 index 0000000..9b18396 --- /dev/null +++ b/src/layers/extensions/inference/dmc_htl_proxy.h @@ -0,0 +1,375 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include "dmc_common.h" + +class DMCHTLDecoderProxy { +public: + DMCHTLDecoderProxy() = default; + ~DMCHTLDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& conv1_input, const at::Tensor& quant); + at::Tensor forward_part1(const at::Tensor& x); + at::Tensor forward_part2(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x, at::Tensor& up_out_buf, + at::Tensor& conv1_input_buf, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + SubpelConv2xProxy m_up; + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv12; + DepthConvBlockProxy m_conv13; + DepthConvBlockProxy m_conv14; + DepthConvBlockProxy m_conv15; + DepthConvBlockProxy m_conv16; + DepthConvBlockProxy m_conv17; + DepthConvBlockProxy m_conv18; + DepthConvBlockProxy m_conv19; + DepthConvBlockProxy m_conv1a; + + // for cuda graphs + at::Tensor m_conv1_out; +}; + +class DMCHTLEncoderProxy { +public: + DMCHTLEncoderProxy() = default; + ~DMCHTLEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv12; + DepthConvBlockProxy m_conv13; + DepthConvBlockProxy m_conv14; + DepthConvBlockProxy m_conv15; + DepthConvBlockProxy m_conv16; + at::Tensor m_down_weight; + at::Tensor m_down_bias; + + // for cuda graph + at::Tensor m_down_out; +}; + +class DMCHTLFeatureAdaptorIProxy { +public: + DMCHTLFeatureAdaptorIProxy() = default; + ~DMCHTLFeatureAdaptorIProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; +}; + +class DMCHTLFeatureAdaptorMProxy { +public: + DMCHTLFeatureAdaptorMProxy() = default; + ~DMCHTLFeatureAdaptorMProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; + DepthConvBlockProxy m_conv4; + DepthConvBlockProxy m_conv5; + DepthConvBlockProxy m_conv6; + DepthConvBlockProxy m_conv7; + DepthConvBlockProxy m_conv8; + DepthConvBlockProxy m_conv9; +}; + +class DMCHTLFeatureExtractorProxy { +public: + DMCHTLFeatureExtractorProxy() = default; + ~DMCHTLFeatureExtractorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; +}; + +class DMCHTLHyperDecoderProxy { +public: + DMCHTLHyperDecoderProxy() = default; + ~DMCHTLHyperDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockUpsampleProxy m_conv0; + ResidualBlockUpsampleProxy m_conv1; + DepthConvBlockProxy m_conv2; +}; + +class DMCHTLHyperEncoderProxy { +public: + DMCHTLHyperEncoderProxy() = default; + ~DMCHTLHyperEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + ResidualBlockWithStride2Proxy m_conv1; + ResidualBlockWithStride2Proxy m_conv2; +}; + +class DMCHTLPriorFusionProxy { +public: + DMCHTLPriorFusionProxy() = default; + ~DMCHTLPriorFusionProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graphs + at::Tensor m_conv3_out; +}; + +class DMCHTLReconHeadProxy { +public: + static constexpr int g_frame_delay = 8; + DMCHTLReconHeadProxy() = default; + ~DMCHTLReconHeadProxy() = default; + + at::Tensor forward_reset(const at::Tensor& x); + std::tuple, at::Tensor> forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0[g_frame_delay]; + DepthConvBlockProxy m_conv1[g_frame_delay]; + DepthConvBlockProxy m_conv2[g_frame_delay]; + DepthConvBlockProxy m_conv3[g_frame_delay]; + DepthConvBlockProxy m_conv4[g_frame_delay]; + at::Tensor m_head_weight[g_frame_delay]; + at::Tensor m_head_bias[g_frame_delay]; + + // for cuda graphs + at::Tensor m_head_out[g_frame_delay]; + at::Tensor m_shuffle_out[g_frame_delay]; +}; + +class DMCHTLSpatialPriorProxy { +public: + DMCHTLSpatialPriorProxy() = default; + ~DMCHTLSpatialPriorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graphs + at::Tensor m_conv3_out; +}; + +class DMCHTLTemporalPriorEncoderProxy { +public: + DMCHTLTemporalPriorEncoderProxy() = default; + ~DMCHTLTemporalPriorEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockWithStride2Proxy m_conv; +}; + +class DMCHTLProxy : public DMCCommon { +public: + static constexpr int g_frame_delay = 8; + static constexpr int g_ch_src_d_intra = 3 * 8 * 8; + static constexpr int g_ch_src_d = g_ch_src_d_intra * g_frame_delay; + static constexpr int g_ch_y = 256; + static constexpr int g_ch_z = 128; + static constexpr int g_ch_d = 512; + static constexpr int g_ch_m = 512; + static constexpr int g_ch_recon = 256; + + DMCHTLProxy(); + ~DMCHTLProxy(); + +private: + void worker(); + +public: + void add_ref_feature_from_frame(const at::Tensor& frame, const bool apply_adaptor); + py::tuple compress(const at::Tensor& x, const int qp, const bool reset_feature_memory, + const int padding_b, const int padding_r); + std::vector decompress(const py::array_t& bit_stream, const int qp, + const int height, const int width, + const int entropy_coder_parallel, + const bool reset_feature_memory); + void set_param(const std::map& state_dict, const float skip_threshold); + +private: + void add_ref_feature_and_apply_adaptor(const at::Tensor& feature, const bool reset_feature_memory); + void apply_feature_adaptor(const bool memory_none); + + // cuda graph related + void clear_cuda_graph(); + + // helper functions + at::Tensor decode_y_step_build_index(const at::Tensor& scales, const at::Tensor& mask, + at::Tensor& skip_cond_out, at::Tensor& indexes_num_out); + std::tuple get_mask_4x(const at::Tensor& y); + + // compress and decompress components + void pre_allocate_tensors(const at::Tensor& frame); + +private: + at::Tensor m_q_encoder[g_qp_num]; + at::Tensor m_q_decoder[g_qp_num]; + at::Tensor m_q_feature[g_qp_num]; + + DMCHTLEncoderProxy m_encoder; + DMCHTLHyperEncoderProxy m_hyper_encoder; + DMCHTLTemporalPriorEncoderProxy m_temporal_prior_encoder; + DMCHTLHyperDecoderProxy m_hyper_decoder; + DMCHTLPriorFusionProxy m_y_prior_fusion; + ConvParam m_y_spatial_prior_reduction; + DepthConvBlockProxy m_y_spatial_prior_adaptor_1; + DepthConvBlockProxy m_y_spatial_prior_adaptor_2; + DepthConvBlockProxy m_y_spatial_prior_adaptor_3; + DMCHTLSpatialPriorProxy m_y_spatial_prior; + DMCHTLDecoderProxy m_decoder; + DMCHTLFeatureAdaptorIProxy m_feature_adaptor_i; + DMCHTLFeatureAdaptorMProxy m_feature_adaptor_m; + DMCHTLFeatureExtractorProxy m_feature_extractor; + DMCHTLReconHeadProxy m_recon_head; + + float m_skip_threshold{ 0.f }; + + bool m_finish{ false }; + bool m_result_ready{ false }; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + bool m_pending{ false }; + DMCWorkType m_pending_work; + + uint8_t* m_bit_stream{ nullptr }; + int m_bit_stream_size{ 0 }; + int m_z_width{ 0 }; + int m_z_height{ 0 }; + + cudaEvent_t m_event_y; + cudaEvent_t m_event_y_ready; + cudaEvent_t m_event_z_ready; + int* m_size_ptr{ nullptr }; + + int m_qp{ 0 }; + std::shared_ptr> m_y_to_encode[4]{ nullptr }; + int m_y_to_encode_size[4]{ 0 }; + + at::ScalarType m_dtype; + at::Device m_device{ at::kCUDA }; + + // for cuda graph + int m_H8{ 0 }; + int m_W8{ 0 }; + cudaGraphExec_t m_gexec_enc_0[g_qp_num]{ nullptr }; + cudaGraphExec_t m_gexec_enc_1[g_qp_num][2]{ nullptr }; + cudaGraphExec_t m_gexec_dec_0[g_qp_num][2]{ nullptr }; + cudaGraphExec_t m_gexec_dec_1{ nullptr }; + cudaGraphExec_t m_gexec_dec_2{ nullptr }; + cudaGraphExec_t m_gexec_dec_3{ nullptr }; + cudaGraphExec_t m_gexec_dec_4{ nullptr }; + cudaGraphExec_t m_gexec_dec_5[g_qp_num]{ nullptr }; + bool m_memory_has_value{ true }; + at::Tensor m_mask_0; + at::Tensor m_mask_1; + at::Tensor m_mask_2; + at::Tensor m_mask_3; + at::Tensor m_enc_unshuffle_out; + at::Tensor m_feature_i; // output of image frame unshuffle or recon_head reset + at::Tensor m_feature_p; // output of decoder + at::Tensor m_memory; // output of both feature_adaptor_i and feature_adaptor_m + at::Tensor m_ctx; + at::Tensor m_temporal_input; + at::Tensor m_temporal_params; + at::Tensor m_y; + at::Tensor m_y_pad; + at::Tensor m_hyper_params; + at::Tensor m_hyper_params_pad4; + at::Tensor m_common_params; // no allocation + at::Tensor m_z_hat; + at::Tensor m_z_hat_io; + at::Tensor m_spatial_prior_out; + at::Tensor m_reduced_params; + at::Tensor m_y_q; + at::Tensor m_y_hat; + at::Tensor m_s_hat; + at::Tensor m_y_hat_so_far; // view into m_cat_spatial_prior_adaptor + at::Tensor m_y_q_w; + at::Tensor m_s_w; + at::Tensor m_y_symbol[4]; + at::Tensor m_y_symbol_prev; + at::Tensor m_skip_cond; + at::Tensor m_y_size[4]; + at::Tensor m_y_num; + // decode-only + at::Tensor m_scales_r; + at::Tensor m_y_q_r; + at::Tensor m_y_decoded; + at::Tensor m_y_indexes; + at::Tensor m_y_indexes_prev; + at::Tensor m_y_indexes_skip_cond; + at::Tensor m_y_indexes_size; + at::Tensor m_y_indexes_num; + std::shared_ptr> m_y_to_decode; + at::Tensor m_decoder_up_out; + std::vector m_x_hat; // no allocation. length: g_frame_delay + + // 5 concatenated tensors + at::Tensor m_cat_encoder; + at::Tensor m_cat_decoder; + at::Tensor m_cat_feature_adaptor_m; + at::Tensor m_cat_prior_fusion; + at::Tensor m_cat_spatial_prior_adaptor; +}; diff --git a/src/layers/extensions/inference/dmc_hts_proxy.cpp b/src/layers/extensions/inference/dmc_hts_proxy.cpp new file mode 100644 index 0000000..a78b8fc --- /dev/null +++ b/src/layers/extensions/inference/dmc_hts_proxy.cpp @@ -0,0 +1,1000 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include +#include + +#include "common_cpp.h" +#include "cuda_check.h" +#include "def_cutlass.h" +#include "def_elementwise.h" +#include "dmc_hts_proxy.h" +#include "memory_pool.h" + +at::Tensor DMCHTSDecoderProxy::forward(const at::Tensor& x, const at::Tensor& conv1_input, + const at::Tensor& quant) +{ + auto out = forward_part1(x); + out = forward_part2(conv1_input, quant); + return out; +} + +at::Tensor DMCHTSDecoderProxy::forward_part1(const at::Tensor& x) +{ + return m_up.forward(x); +} + +at::Tensor DMCHTSDecoderProxy::forward_part2(const at::Tensor& x, const at::Tensor& quant) +{ + auto out = m_conv10.forward(x); + out = m_conv11.forward(out); + out = m_conv12.forward(out); + out = m_conv13.forward(out); + out = m_conv14.forward(out); + out = m_conv15.forward(out); + out = m_conv16.forward(out, quant); + return out; +} + +at::Tensor DMCHTSDecoderProxy::pre_allocate_tensors(at::Tensor& x, at::Tensor& up_out_buf, + at::Tensor& conv1_input_buf, + const at::Tensor& out_buf) +{ + m_up.pre_allocate_tensors(x, up_out_buf); + m_conv1_out = out_buf; + auto out = m_conv10.pre_allocate_tensors(conv1_input_buf, true); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv12.pre_allocate_tensors(out); + out = m_conv13.pre_allocate_tensors(out); + out = m_conv14.pre_allocate_tensors(out); + out = m_conv15.pre_allocate_tensors(out); + out = m_conv16.pre_allocate_tensors(out, false, m_conv1_out); + + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv12.release_tensors(); + m_conv13.release_tensors(); + m_conv14.release_tensors(); + m_conv15.release_tensors(); + m_conv16.release_tensors(); + g_tensor_pool.set_reusable(m_conv1_out, false); + return m_conv1_out; +} + +void DMCHTSDecoderProxy::set_param(const std::map& state_dict) +{ + m_up.set_param(get_submodule_state_dict(state_dict, "up.")); + m_conv10.set_param(get_submodule_state_dict(state_dict, "conv1.0.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "conv1.1.")); + m_conv12.set_param(get_submodule_state_dict(state_dict, "conv1.2.")); + m_conv13.set_param(get_submodule_state_dict(state_dict, "conv1.3.")); + m_conv14.set_param(get_submodule_state_dict(state_dict, "conv1.4.")); + m_conv15.set_param(get_submodule_state_dict(state_dict, "conv1.5.")); + m_conv16.set_param(get_submodule_state_dict(state_dict, "conv1.6.")); +} + +at::Tensor DMCHTSEncoderProxy::forward(const at::Tensor& x, const at::Tensor& quant) +{ + const int sm = get_gpu_sm(); + auto out = m_conv10.forward(x); + out = m_conv11.forward(out); + out = m_conv12.forward(out); + out = m_conv13.forward(out); + out = m_conv14.forward(out); + out = m_conv15.forward(out, quant); + out = conv_bias(sm, out, m_down_weight, m_down_bias, 2, m_down_out); + return out; +} + +at::Tensor DMCHTSEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_down_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_down = m_down_weight.size(0); + m_down_out = g_tensor_pool.empty({ 1, ch_down, H / 2, W / 2 }, options); + auto out = m_conv10.pre_allocate_tensors(x, true); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv12.pre_allocate_tensors(out); + out = m_conv13.pre_allocate_tensors(out); + out = m_conv14.pre_allocate_tensors(out); + out = m_conv15.pre_allocate_tensors(out); + + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv12.release_tensors(); + m_conv13.release_tensors(); + m_conv14.release_tensors(); + m_conv15.release_tensors(); + return m_down_out; +} + +void DMCHTSEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv10.set_param(get_submodule_state_dict(state_dict, "conv1.0.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "conv1.1.")); + m_conv12.set_param(get_submodule_state_dict(state_dict, "conv1.2.")); + m_conv13.set_param(get_submodule_state_dict(state_dict, "conv1.3.")); + m_conv14.set_param(get_submodule_state_dict(state_dict, "conv1.4.")); + m_conv15.set_param(get_submodule_state_dict(state_dict, "conv1.5.")); + m_down_weight = state_dict.at("down.weight"); + m_down_bias = state_dict.at("down.bias"); +} + +at::Tensor DMCHTSFeatureAdaptorIProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + return out; +} + +at::Tensor DMCHTSFeatureAdaptorIProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTSFeatureAdaptorIProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); +} + +at::Tensor DMCHTSFeatureAdaptorMProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + out = m_conv4.forward(out); + out = m_conv5.forward(out); + return out; +} + +at::Tensor DMCHTSFeatureAdaptorMProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out); + out = m_conv4.pre_allocate_tensors(out); + out = m_conv5.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + m_conv4.release_tensors(); + m_conv5.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTSFeatureAdaptorMProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); + m_conv4.set_param(get_submodule_state_dict(state_dict, "conv.4.")); + m_conv5.set_param(get_submodule_state_dict(state_dict, "conv.5.")); +} + +at::Tensor DMCHTSFeatureExtractorProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + out = m_conv4.forward(out); + return out; +} + +at::Tensor DMCHTSFeatureExtractorProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out); + out = m_conv4.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + m_conv4.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTSFeatureExtractorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); + m_conv4.set_param(get_submodule_state_dict(state_dict, "conv.4.")); +} + +at::Tensor DMCHTSHyperDecoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCHTSHyperDecoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTSHyperDecoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0."), false); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), false); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); +} + +at::Tensor DMCHTSHyperEncoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCHTSHyperEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTSHyperEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), false); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2."), false); +} + +at::Tensor DMCHTSPriorFusionProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCHTSPriorFusionProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_conv3_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_conv3 = m_conv3_weight.size(0); + m_conv3_out = g_tensor_pool.empty({ 1, ch_conv3, H, W }, options); + // x is a cat parameter, will be further used + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCHTSPriorFusionProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +std::tuple, at::Tensor> DMCHTSReconHeadProxy::forward(const at::Tensor& x) +{ + at::Tensor for_reset; + const int sm = get_gpu_sm(); + auto all_out = std::vector(g_frame_delay); + at::Tensor common_out; + for (int i = 0; i < g_frame_delay; i++) { + if (i % 2 == 0) { + common_out = m_conv1_0[i / 2].forward(x); + } + auto out = m_conv2_0[i].forward(common_out); + out = m_conv2_1[i].forward(out); + out = m_conv2_2[i].forward(out); + out = conv1x1_bias(sm, out, m_head_weight[i], m_head_bias[i], m_head_out[i]); + if (i == g_frame_delay - 1) { + for_reset = out; + } + out = pixel_shuffle_8_cuda(out, true, m_shuffle_out[i]); + all_out[i] = out; + } + return { all_out, for_reset }; +} + +at::Tensor DMCHTSReconHeadProxy::forward_reset(const at::Tensor& x) +{ + constexpr int conv1_index = g_frame_delay / 2 - 1; + constexpr int conv2_index = g_frame_delay - 1; + const int sm = get_gpu_sm(); + auto out = m_conv1_0[conv1_index].forward(x); + out = m_conv2_0[conv2_index].forward(out); + out = m_conv2_1[conv2_index].forward(out); + out = m_conv2_2[conv2_index].forward(out); + out = conv1x1_bias(sm, out, m_head_weight[conv2_index], m_head_bias[conv2_index], + m_head_out[conv2_index]); + return out; +} + +at::Tensor DMCHTSReconHeadProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_head_weight[0].options().memory_format(at::MemoryFormat::ChannelsLast); + const int C = m_head_weight[0].size(0); + at::Tensor common_out; + for (int i = 0; i < g_frame_delay; i++) { + if (i % 2 == 0) { + common_out = m_conv1_0[i / 2].pre_allocate_tensors(x, true); // must not modify! + } + if (i != g_frame_delay - 1) { + m_head_out[i] = g_tensor_pool.empty({ 1, C, H, W }, options); + } else { + m_head_out[i] = out_buf; + } + m_shuffle_out[i] = at::empty({ 1, C / 64, H * 8, W * 8 }, options); + + auto out = m_conv2_0[i].pre_allocate_tensors(common_out, true); // must not modify! + out = m_conv2_1[i].pre_allocate_tensors(out); + out = m_conv2_2[i].pre_allocate_tensors(out); + if (i % 2 == 1) { + m_conv1_0[i / 2].release_tensors(); + g_tensor_pool.release(common_out); + } + if (i != g_frame_delay - 1) { + g_tensor_pool.release(m_head_out[i]); + } + m_conv2_0[i].release_tensors(); + m_conv2_1[i].release_tensors(); + m_conv2_2[i].release_tensors(); + } + return m_head_out[g_frame_delay - 1]; +} + +void DMCHTSReconHeadProxy::set_param(const std::map& state_dict) +{ + for (int i = 0; i < g_frame_delay / 2; i++) { + m_conv1_0[i].set_param( + get_submodule_state_dict(state_dict, "conv1." + std::to_string(i) + ".0.")); + } + for (int i = 0; i < g_frame_delay; i++) { + m_conv2_0[i].set_param( + get_submodule_state_dict(state_dict, "conv2." + std::to_string(i) + ".0.")); + m_conv2_1[i].set_param( + get_submodule_state_dict(state_dict, "conv2." + std::to_string(i) + ".1.")); + m_conv2_2[i].set_param( + get_submodule_state_dict(state_dict, "conv2." + std::to_string(i) + ".2.")); + m_head_weight[i] = state_dict.at("conv2." + std::to_string(i) + ".3.weight"); + m_head_bias[i] = state_dict.at("conv2." + std::to_string(i) + ".3.bias"); + } +} + +at::Tensor DMCHTSSpatialPriorProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCHTSSpatialPriorProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + m_conv3_out = out_buf; + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCHTSSpatialPriorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +at::Tensor DMCHTSTemporalPriorEncoderProxy::forward(const at::Tensor& x) +{ + return m_conv.forward(x); +} + +at::Tensor DMCHTSTemporalPriorEncoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv.pre_allocate_tensors(x, out_buf); + m_conv.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCHTSTemporalPriorEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv.set_param(get_submodule_state_dict(state_dict, "conv."), false); +} + +DMCHTSProxy::DMCHTSProxy() +{ + CUDA_CHECK(cudaMallocHost((void**)&m_size_ptr, sizeof(int))); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_z_ready, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y_ready, cudaEventDisableTiming)); + m_thread = std::thread(&DMCHTSProxy::worker, this); +} + +DMCHTSProxy::~DMCHTSProxy() +{ + { + std::lock_guard lk(m_mutex_pending); + m_finish = true; + } + m_cv_pending.notify_all(); + if (m_thread.joinable()) { + m_thread.join(); + } + cudaEventDestroy(m_event_y); + cudaEventDestroy(m_event_z_ready); + cudaEventDestroy(m_event_y_ready); + cudaFreeHost(m_size_ptr); + + clear_cuda_graph(); +} + +void DMCHTSProxy::add_ref_feature_from_frame(const at::Tensor& frame, const bool apply_adaptor) +{ + pre_allocate_tensors(frame); + // must NOT use cuda graph becase frame.data_ptr() is non-const + m_feature_i = pixel_unshuffle_cuda(frame, 8, m_feature_i); + if (apply_adaptor) { + m_memory = m_feature_adaptor_i.forward(m_feature_i); + m_ctx = m_feature_extractor.forward(m_memory); + } + m_memory_has_value = apply_adaptor; +} + +py::tuple DMCHTSProxy::compress(const at::Tensor& x, const int qp, const bool reset_feature_memory, + const int padding_b, const int padding_r) +{ + m_result_ready = false; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + // must NOT use cuda graph becase x.data_ptr() is non-const + m_enc_unshuffle_out = pad_and_unshuffle_8_cuda(x, padding_b, padding_r, m_enc_unshuffle_out); + + // ----------- start of lambda_enc_0 ----------- + auto lambda_enc_0 = [&](const int qp) { + // need to output [m_z_hat_io, m_y_symbol, m_y_size] for cpu thread + auto y = m_encoder.forward(m_cat_encoder, m_q_encoder[qp]); + auto y_pad = pad_for_y(y, m_y_pad); + auto z = m_hyper_encoder.forward(y_pad); + std::tie(m_z_hat, m_z_hat_io) = round_z_cuda(z, m_z_hat, m_z_hat_io); + m_temporal_input = multiply_with_broadcast_cuda(m_memory, m_q_feature[qp], m_temporal_input); + m_temporal_params = m_temporal_prior_encoder.forward(m_temporal_input); + m_hyper_params_pad4 = m_hyper_decoder.forward(m_z_hat); + m_hyper_params = crop_hyper_params(m_hyper_params_pad4, m_temporal_params.size(2), + m_temporal_params.size(3), m_hyper_params); + m_common_params = m_y_prior_fusion.forward(m_cat_prior_fusion); + + auto [q_dec, scales, means] = chunk_tensors_3(m_common_params); + y = divide_with_clamp_min_inplace_cuda(y, q_dec); + + const int sm = get_gpu_sm(); + m_reduced_params = conv1x1_bias(sm, m_common_params, m_y_spatial_prior_reduction.weight, + m_y_spatial_prior_reduction.bias, m_reduced_params); + std::tie(m_y_q, m_y_hat) = process_with_mask_no_scale_cuda( + y, scales, means, m_mask_0, m_skip_threshold, 0, m_y_q, m_y_hat); + + m_means = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_1.forward(m_cat_spatial_prior_adaptor)); + std::tie(m_y_q, m_y_hat) = process_with_mask_no_scale_add_inplace_cuda( + y, scales, m_means, m_mask_1, m_y_q, m_y_hat, m_skip_threshold, 0); + + m_means = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_2.forward(m_cat_spatial_prior_adaptor)); + std::tie(m_y_q, m_y_hat) = process_with_mask_no_scale_add_inplace_cuda( + y, scales, m_means, m_mask_2, m_y_q, m_y_hat, m_skip_threshold, 0); + + m_means = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_3.forward(m_cat_spatial_prior_adaptor)); + std::tie(m_y_q, m_y_hat) = process_with_mask_no_scale_add_and_multiply_inplace_cuda( + y, scales, m_means, m_mask_3, m_y_q, m_y_hat, q_dec, m_skip_threshold, 0); + + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q, scales, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol, m_y_size, m_y_num) = + conditional_index_part1_cuda(m_y_symbol_prev, m_skip_cond, m_y_symbol, m_y_size, m_y_num); + }; + + run(lambda_enc_0, m_gexec_enc_0, m_qp); + // ------------ end of lambda_enc_0 ------------ + + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::Encode; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_enc_1 ----------- + auto lambda_enc_1 = [&](const int qp, const bool reset_feature_memory) { + m_feature_p = m_decoder.forward(m_y_hat, m_cat_decoder, m_q_decoder[qp]); + add_ref_feature_and_apply_adaptor(m_feature_p, reset_feature_memory); + }; + + run(lambda_enc_1, m_gexec_enc_1, m_qp, reset_feature_memory); + // ------------ end of lambda_enc_1 ------------ + + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (m_result_ready) { + return py::make_tuple(m_entropy_encoder.get_encoded_stream(), m_entropy_coder_parallel); + } + return py::make_tuple(py::array_t(0), 1); +} + +std::vector DMCHTSProxy::decompress(const py::array_t& bit_stream, + const int qp, const int height, const int width, + const int entropy_coder_parallel, + const bool reset_feature_memory) +{ + m_result_ready = false; + m_entropy_coder_parallel = entropy_coder_parallel; + py::buffer_info bit_stream_buf = bit_stream.request(); + m_bit_stream = static_cast(bit_stream_buf.ptr); + m_bit_stream_size = static_cast(bit_stream.size()); + m_z_height = (height + 63) / 64; + m_z_width = (width + 63) / 64; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeZ; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_dec_0 ----------- + auto lambda_dec_0 = [&](const int qp, const bool memory_has_value) { + apply_feature_adaptor(memory_has_value); + m_temporal_input = multiply_with_broadcast_cuda(m_memory, m_q_feature[qp], m_temporal_input); + m_temporal_params = m_temporal_prior_encoder.forward(m_temporal_input); + }; + + run(lambda_dec_0, m_gexec_dec_0, m_qp, m_memory_has_value); + // ------------ end of lambda_dec_0 ------------ + + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (!m_result_ready) { + return std::vector(); + } + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_z_ready)); + + at::Tensor q_dec; + at::Tensor scales; + at::Tensor means; + // ----------- start of lambda_dec_1 ----------- + auto lambda_dec_1 = [&]() { + // need to output [m_y_indexes, m_y_size] for cpu thread + m_z_hat = int8_to_dtype_cuda(m_z_hat_io, m_dtype, g_ch_z, m_z_height, m_z_width, m_z_hat); + m_hyper_params_pad4 = m_hyper_decoder.forward(m_z_hat); + m_hyper_params = crop_hyper_params(m_hyper_params_pad4, m_temporal_params.size(2), + m_temporal_params.size(3), m_hyper_params); + m_common_params = m_y_prior_fusion.forward(m_cat_prior_fusion); + std::tie(q_dec, scales, means) = chunk_tensors_3(m_common_params); + std::tie(m_y_indexes_prev, m_skip_cond) = build_index_dec_cuda( + scales, m_skip_threshold, at::nullopt, 0, m_y_indexes_prev, m_skip_cond); + std::tie(m_y_indexes, m_y_size, m_y_num) = + conditional_index_part1_cuda(m_y_indexes_prev, m_skip_cond, m_y_indexes, m_y_size, m_y_num); + }; + + run(lambda_dec_1, m_gexec_dec_1); + // ------------ end of lambda_dec_1 ------------ + + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_dec_2 ----------- + auto lambda_dec_2 = [&]() { m_ctx = m_feature_extractor.forward(m_memory); }; + + run(lambda_dec_2, m_gexec_dec_2); + // ------------ end of lambda_dec_2 ------------ + + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (!m_result_ready) { + return std::vector(); + } + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_3 ----------- + auto lambda_dec_3 = [&](const int qp) { + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_skip_cond, m_y_num, + m_dtype, m_y_q_r); + m_y_hat = restore_y_cuda(m_y_q_r, means, m_mask_0, m_y_hat); + + const int sm = get_gpu_sm(); + m_reduced_params = conv1x1_bias(sm, m_common_params, m_y_spatial_prior_reduction.weight, + m_y_spatial_prior_reduction.bias, m_reduced_params); + + m_means = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_1.forward(m_cat_spatial_prior_adaptor)); + m_y_hat = restore_y_and_add_inplace_cuda(m_y_q_r, m_means, m_mask_1, m_y_hat); + + m_means = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_2.forward(m_cat_spatial_prior_adaptor)); + m_y_hat = restore_y_and_add_inplace_cuda(m_y_q_r, m_means, m_mask_2, m_y_hat); + + m_means = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_3.forward(m_cat_spatial_prior_adaptor)); + + m_y_hat = restore_y_and_add_multiply_inplace_cuda(m_y_q_r, m_means, m_mask_3, m_y_hat, q_dec); + + // decoder + recon_head + m_feature_p = m_decoder.forward(m_y_hat, m_cat_decoder, m_q_decoder[qp]); + std::tie(m_x_hat, m_feature_i) = + m_recon_head.forward(m_feature_p); // m_feature_i is also updated for reset purpose; + }; + + run(lambda_dec_3, m_gexec_dec_3, m_qp); + // ------------ end of lambda_dec_3 ------------ + + m_memory_has_value = !reset_feature_memory; // host operation. must be outside of cuda graph + + return m_x_hat; +} + +void DMCHTSProxy::set_param(const std::map& state_dict, + const float skip_threshold) +{ + m_device = state_dict.at("q_decoder").device(); + m_dtype = state_dict.at("q_decoder").scalar_type(); + auto q_encoder = state_dict.at("q_encoder"); + auto q_decoder = state_dict.at("q_decoder"); + auto q_feature = state_dict.at("q_feature"); + for (int i = 0; i < g_qp_num; i++) { + m_q_encoder[i] = q_encoder.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_decoder[i] = q_decoder.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_feature[i] = q_feature.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + } + m_encoder.set_param(get_submodule_state_dict(state_dict, "encoder.")); + m_hyper_encoder.set_param(get_submodule_state_dict(state_dict, "hyper_encoder.")); + m_temporal_prior_encoder.set_param( + get_submodule_state_dict(state_dict, "temporal_prior_encoder.")); + m_hyper_decoder.set_param(get_submodule_state_dict(state_dict, "hyper_decoder.")); + m_y_prior_fusion.set_param(get_submodule_state_dict(state_dict, "y_prior_fusion.")); + m_y_spatial_prior_reduction.set_param(state_dict, "y_spatial_prior_reduction."); + m_y_spatial_prior_adaptor_1.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_1.")); + m_y_spatial_prior_adaptor_2.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_2.")); + m_y_spatial_prior_adaptor_3.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_3.")); + m_y_spatial_prior.set_param(get_submodule_state_dict(state_dict, "y_spatial_prior.")); + m_decoder.set_param(get_submodule_state_dict(state_dict, "decoder.")); + m_feature_adaptor_i.set_param(get_submodule_state_dict(state_dict, "feature_adaptor_i.")); + m_feature_adaptor_m.set_param(get_submodule_state_dict(state_dict, "feature_adaptor_m.")); + m_feature_extractor.set_param(get_submodule_state_dict(state_dict, "feature_extractor.")); + m_recon_head.set_param(get_submodule_state_dict(state_dict, "recon_head.")); + + m_skip_threshold = skip_threshold; + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); + + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); +} + +void DMCHTSProxy::worker() +{ + at::cuda::CUDAStream high_priority_stream = at::cuda::getStreamFromPool(true); + at::cuda::CUDAStreamGuard guard(high_priority_stream); + + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending || m_finish; }); + if (m_finish) { + break; + } + m_pending = false; + lk.unlock(); + + if (m_pending_work == DMCWorkType::Encode) { + m_entropy_encoder.reset(); + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + + auto out = conditional_index_part2_cuda(m_y_symbol, m_y_size, m_size_ptr); + CUDA_CHECK(cudaMemcpyAsync(m_y_to_encode->data(), out.data_ptr(), + (*m_size_ptr) * sizeof(int16_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaStreamSynchronize(at::cuda::getCurrentCUDAStream())); + m_entropy_coder_parallel = compute_ec_parallel(*m_size_ptr); + m_entropy_encoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + m_entropy_encoder.encode_y(m_y_to_encode, *m_size_ptr); + + auto t = tensor_to_vector_1d(m_z_hat_io); + m_entropy_encoder.encode_z(t, m_qp * g_ch_z, g_ch_z); + m_entropy_encoder.flush(); + } else if (m_pending_work == DMCWorkType::DecodeZ) { + m_entropy_decoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + m_entropy_decoder.set_stream(m_bit_stream, m_bit_stream_size); + const int z_num = g_ch_z * m_z_height * m_z_width; + m_entropy_decoder.decode_z(z_num, m_qp * g_ch_z, g_ch_z); + + auto z_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_z_hat_io.data_ptr(), z_cpu->data(), + z_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_z_ready, at::cuda::getCurrentCUDAStream())); + } else if (m_pending_work == DMCWorkType::DecodeY) { + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + auto out = conditional_index_part2_cuda(m_y_indexes, m_y_size, m_size_ptr); + const int y_num = *m_size_ptr; + CUDA_CHECK(cudaMemcpyAsync(m_y_to_decode->data(), out.data_ptr(), + y_num * sizeof(uint8_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + + m_entropy_decoder.decode_y(m_y_to_decode, y_num); + + auto y_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_y_decoded.data_ptr(), y_cpu->data(), + y_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_y_ready, at::cuda::getCurrentCUDAStream())); + } else { + assert(false); + } + + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + } +} + +void DMCHTSProxy::add_ref_feature_and_apply_adaptor(const at::Tensor& feature, + const bool reset_feature_memory) +{ + if (reset_feature_memory) { + auto out = m_recon_head.forward_reset(feature); + m_memory = m_feature_adaptor_i.forward(out); + } else { + m_memory = m_feature_adaptor_m.forward(m_cat_feature_adaptor_m); + } + m_ctx = m_feature_extractor.forward(m_memory); +} + +void DMCHTSProxy::apply_feature_adaptor(const bool memory_has_value) +{ + if (memory_has_value) { + m_memory = m_feature_adaptor_m.forward(m_cat_feature_adaptor_m); + } else { + m_memory = m_feature_adaptor_i.forward(m_feature_i); + } +} + +void DMCHTSProxy::clear_cuda_graph() +{ + for (int i = 0; i < g_qp_num; ++i) { + destroy_cuda_graph_exec(m_gexec_enc_0[i]); + for (int j = 0; j < 2; ++j) { + destroy_cuda_graph_exec(m_gexec_enc_1[i][j]); + } + destroy_cuda_graph_exec(m_gexec_dec_3[i]); + for (int j = 0; j < 2; ++j) { + destroy_cuda_graph_exec(m_gexec_dec_0[i][j]); + } + } + destroy_cuda_graph_exec(m_gexec_dec_1); + destroy_cuda_graph_exec(m_gexec_dec_2); +} + +std::tuple DMCHTSProxy::get_mask_4x(const at::Tensor& y) +{ + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + auto m = at::ones({ 1, C / 4, H, W }, y.options().dtype(at::kBool)); + auto m0 = get_one_mask(torch::tensor({ { 1, 0 }, { 0, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m1 = get_one_mask(torch::tensor({ { 0, 1 }, { 0, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m2 = get_one_mask(torch::tensor({ { 0, 0 }, { 1, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m3 = get_one_mask(torch::tensor({ { 0, 0 }, { 0, 1 } }, y.options().dtype(at::kBool)), H, W); + + auto mask_0 = + at::cat({ m * m0, m * m1, m * m2, m * m3 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_1 = + at::cat({ m * m3, m * m2, m * m1, m * m0 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_2 = + at::cat({ m * m2, m * m3, m * m0, m * m1 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_3 = + at::cat({ m * m1, m * m0, m * m3, m * m2 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + + return { mask_0, mask_1, mask_2, mask_3 }; +} + +void DMCHTSProxy::pre_allocate_tensors(const at::Tensor& frame) +{ + int H = frame.size(2); + int W = frame.size(3); + H = (H + 16 - 1) / 16 * 16; + W = (W + 16 - 1) / 16 * 16; + const int H8 = H / 8; + const int W8 = W / 8; + if (m_H8 == H8 && m_W8 == W8) { + return; + } + + m_H8 = H8; + m_W8 = W8; + clear_cuda_graph(); + g_tensor_pool.clear(H8, W8); + + auto options = frame.options().memory_format(at::MemoryFormat::ChannelsLast); + const int H16 = H8 / 2; + const int W16 = W8 / 2; + auto [padR, padB] = get_padding_size(H16, W16, 4); + const int H16_pad4 = H16 + padB; + const int W16_pad4 = W16 + padR; + const int H64 = H16_pad4 / 4; + const int W64 = W16_pad4 / 4; + + const std::vector feature_i_shape = { 1, g_ch_src_d_intra, H8, W8 }; + const std::vector memory_shape = { 1, g_ch_m, H8, W8 }; + const std::vector y_shape = { 1, g_ch_y, H16, W16 }; + const std::vector y_pad_shape = { 1, g_ch_y, H16_pad4, W16_pad4 }; + const std::vector z_shape = { 1, g_ch_z, H64, W64 }; + + auto y = at::empty(y_shape, options); + + // pre allocate tensors + std::tie(m_mask_0, m_mask_1, m_mask_2, m_mask_3) = get_mask_4x(y); + m_y_decoded = at::empty({ y.numel() }, y.options().dtype(at::kChar)); + m_y_to_decode = std::make_shared>(y.numel()); + m_y_to_encode = std::make_shared>(y.numel()); + + // + // pre allocate concatenated tensors + // + + // 1. deal with m_cat_encoder, m_cat_decoder, m_enc_unshuffle_out, m_decoder_up_out, and m_ctx + assert(g_ch_src_d > g_ch_d); + at::Tensor tensor_placeholder; + m_cat_encoder = at::empty({ 1, g_ch_src_d + g_ch_d, H8, W8 }, options); + std::tie(tensor_placeholder, m_cat_decoder) = + split_tensors_2(m_cat_encoder, g_ch_src_d - g_ch_d, g_ch_d * 2); + std::tie(tensor_placeholder, m_decoder_up_out, m_ctx) = + split_tensors_3(m_cat_encoder, g_ch_src_d - g_ch_d, g_ch_d, g_ch_d); + std::tie(m_enc_unshuffle_out, m_ctx) = split_tensors_2(m_cat_encoder, g_ch_src_d, g_ch_d); + + // 2. deal with m_cat_feature_adaptor_m, m_memory, and m_feature_p + m_cat_feature_adaptor_m = at::empty({ 1, g_ch_m + g_ch_d, H8, W8 }, options); + std::tie(m_memory, m_feature_p) = split_tensors_2(m_cat_feature_adaptor_m, g_ch_m, g_ch_d); + + // 3. deal with m_cat_prior_fusion, m_hyper_params, and m_temporal_params + m_cat_prior_fusion = at::empty({ 1, g_ch_y * 3, H16, W16 }, options); + std::tie(m_hyper_params, m_temporal_params) = + split_tensors_2(m_cat_prior_fusion, g_ch_y, g_ch_y * 2); + m_hyper_params_pad4 = (padR == 0 && padB == 0) ? m_hyper_params : at::empty(y_pad_shape, options); + + // 4. deal with m_cat_spatial_prior_adaptor, m_y_hat, and m_reduced_params + m_cat_spatial_prior_adaptor = at::empty({ 1, g_ch_y * 2, H16, W16 }, options); + std::tie(m_y_hat, m_reduced_params) = split_tensors_2(m_cat_spatial_prior_adaptor, g_ch_y, g_ch_y); + + // pre allocate other tensors + m_feature_i = at::empty(feature_i_shape, options); + m_temporal_input = at::empty(memory_shape, options); + + m_z_hat = at::empty(z_shape, options.dtype(at::kHalf)); + m_z_hat_io = at::empty(z_shape, options.dtype(at::kChar)); + + m_means = at::empty_like(y); + m_y_q = at::empty_like(y); + m_y_q_r = at::empty_like(y); + + m_y_symbol = at::empty({ y.numel() }, y.options().dtype(at::kShort)); + m_y_symbol_prev = at::empty_like(m_y_symbol); + m_y_indexes = at::empty({ y.numel() }, y.options().dtype(at::kByte)); + m_y_indexes_prev = at::empty_like(m_y_indexes); + m_skip_cond = at::empty({ y.numel() }, y.options().dtype(at::kBool)); + + const int block_num = (y.numel() + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + m_y_size = at::empty({ 1 }, y.options().dtype(at::kInt)); + m_y_num = at::empty({ block_num, COND_KERNEL_THREAD_NUM1 }, y.options().dtype(at::kInt)); + + // pre allocate modules + m_y = m_encoder.pre_allocate_tensors(m_cat_encoder); + m_y_pad = (padR == 0 && padB == 0) ? m_y : at::empty(y_pad_shape, options); + m_hyper_encoder.pre_allocate_tensors(m_y_pad); + m_temporal_prior_encoder.pre_allocate_tensors(m_temporal_input, m_temporal_params); + m_hyper_decoder.pre_allocate_tensors(m_z_hat, m_hyper_params_pad4); + m_common_params = m_y_prior_fusion.pre_allocate_tensors(m_cat_prior_fusion); + auto adaptor_out = + m_y_spatial_prior_adaptor_1.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true); + m_y_spatial_prior_adaptor_2.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true, adaptor_out); + m_y_spatial_prior_adaptor_3.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true, adaptor_out); + m_y_spatial_prior.pre_allocate_tensors(adaptor_out, m_means); + m_decoder.pre_allocate_tensors(m_y_hat, m_decoder_up_out, m_cat_decoder, m_feature_p); + m_feature_adaptor_i.pre_allocate_tensors(m_feature_i, m_memory); + m_feature_adaptor_m.pre_allocate_tensors(m_cat_feature_adaptor_m, m_memory); + m_feature_extractor.pre_allocate_tensors(m_memory, m_ctx); + m_recon_head.pre_allocate_tensors( + m_feature_p, m_feature_i); // the recon is not used in cuda graph, only use feature for reset +} diff --git a/src/layers/extensions/inference/dmc_hts_proxy.h b/src/layers/extensions/inference/dmc_hts_proxy.h new file mode 100644 index 0000000..e9d428e --- /dev/null +++ b/src/layers/extensions/inference/dmc_hts_proxy.h @@ -0,0 +1,355 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include "dmc_common.h" + +class DMCHTSDecoderProxy { +public: + DMCHTSDecoderProxy() = default; + ~DMCHTSDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& conv1_input, const at::Tensor& quant); + at::Tensor forward_part1(const at::Tensor& x); + at::Tensor forward_part2(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x, at::Tensor& up_out_buf, + at::Tensor& conv1_input_buf, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + SubpelConv2xProxy m_up; + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv12; + DepthConvBlockProxy m_conv13; + DepthConvBlockProxy m_conv14; + DepthConvBlockProxy m_conv15; + DepthConvBlockProxy m_conv16; + + // for cuda graphs + at::Tensor m_conv1_out; +}; + +class DMCHTSEncoderProxy { +public: + DMCHTSEncoderProxy() = default; + ~DMCHTSEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv12; + DepthConvBlockProxy m_conv13; + DepthConvBlockProxy m_conv14; + DepthConvBlockProxy m_conv15; + at::Tensor m_down_weight; + at::Tensor m_down_bias; + + // for cuda graph + at::Tensor m_down_out; +}; + +class DMCHTSFeatureAdaptorIProxy { +public: + DMCHTSFeatureAdaptorIProxy() = default; + ~DMCHTSFeatureAdaptorIProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; +}; + +class DMCHTSFeatureAdaptorMProxy { +public: + DMCHTSFeatureAdaptorMProxy() = default; + ~DMCHTSFeatureAdaptorMProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; + DepthConvBlockProxy m_conv4; + DepthConvBlockProxy m_conv5; +}; + +class DMCHTSFeatureExtractorProxy { +public: + DMCHTSFeatureExtractorProxy() = default; + ~DMCHTSFeatureExtractorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; + DepthConvBlockProxy m_conv4; +}; + +class DMCHTSHyperDecoderProxy { +public: + DMCHTSHyperDecoderProxy() = default; + ~DMCHTSHyperDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockUpsampleProxy m_conv0; + ResidualBlockUpsampleProxy m_conv1; + DepthConvBlockProxy m_conv2; +}; + +class DMCHTSHyperEncoderProxy { +public: + DMCHTSHyperEncoderProxy() = default; + ~DMCHTSHyperEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + ResidualBlockWithStride2Proxy m_conv1; + ResidualBlockWithStride2Proxy m_conv2; +}; + +class DMCHTSPriorFusionProxy { +public: + DMCHTSPriorFusionProxy() = default; + ~DMCHTSPriorFusionProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graphs + at::Tensor m_conv3_out; +}; + +class DMCHTSReconHeadProxy { +public: + static constexpr int g_frame_delay = 8; + DMCHTSReconHeadProxy() = default; + ~DMCHTSReconHeadProxy() = default; + + std::tuple, at::Tensor> forward(const at::Tensor& x); + at::Tensor forward_reset(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv1_0[g_frame_delay / 2]; + DepthConvBlockProxy m_conv2_0[g_frame_delay]; + DepthConvBlockProxy m_conv2_1[g_frame_delay]; + DepthConvBlockProxy m_conv2_2[g_frame_delay]; + at::Tensor m_head_weight[g_frame_delay]; + at::Tensor m_head_bias[g_frame_delay]; + + // for cuda graphs + at::Tensor m_head_out[g_frame_delay]; + at::Tensor m_shuffle_out[g_frame_delay]; +}; + +class DMCHTSSpatialPriorProxy { +public: + DMCHTSSpatialPriorProxy() = default; + ~DMCHTSSpatialPriorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graphs + at::Tensor m_conv3_out; +}; + +class DMCHTSTemporalPriorEncoderProxy { +public: + DMCHTSTemporalPriorEncoderProxy() = default; + ~DMCHTSTemporalPriorEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockWithStride2Proxy m_conv; +}; + +class DMCHTSProxy : public DMCCommon { +public: + static constexpr int g_frame_delay = 8; + static constexpr int g_ch_src_d_intra = 3 * 8 * 8; + static constexpr int g_ch_src_d = g_ch_src_d_intra * g_frame_delay; + static constexpr int g_ch_y = 256; + static constexpr int g_ch_z = 128; + static constexpr int g_ch_d = 512; + static constexpr int g_ch_m = 512; + static constexpr int g_ch_recon = 256; + + DMCHTSProxy(); + ~DMCHTSProxy(); + + void add_ref_feature_from_frame(const at::Tensor& frame, const bool apply_adaptor); + py::tuple compress(const at::Tensor& x, const int qp, const bool reset_feature_memory, + const int padding_b, const int padding_r); + std::vector decompress(const py::array_t& bit_stream, const int qp, + const int height, const int width, + const int entropy_coder_parallel, + const bool reset_feature_memory); + void set_param(const std::map& state_dict, const float skip_threshold); + +private: + void worker(); + +public: +private: + // compress and decompress components + void add_ref_feature_and_apply_adaptor(const at::Tensor& feature, const bool reset_feature_memory); + void apply_feature_adaptor(const bool memory_none); + + // cuda graph related + void clear_cuda_graph(); + + // helper functions + std::tuple get_mask_4x(const at::Tensor& y); + + void pre_allocate_tensors(const at::Tensor& frame); + +private: + at::Tensor m_q_encoder[g_qp_num]; + at::Tensor m_q_decoder[g_qp_num]; + at::Tensor m_q_feature[g_qp_num]; + + DMCHTSEncoderProxy m_encoder; + DMCHTSHyperEncoderProxy m_hyper_encoder; + DMCHTSTemporalPriorEncoderProxy m_temporal_prior_encoder; + DMCHTSHyperDecoderProxy m_hyper_decoder; + DMCHTSPriorFusionProxy m_y_prior_fusion; + ConvParam m_y_spatial_prior_reduction; + DepthConvBlockProxy m_y_spatial_prior_adaptor_1; + DepthConvBlockProxy m_y_spatial_prior_adaptor_2; + DepthConvBlockProxy m_y_spatial_prior_adaptor_3; + DMCHTSSpatialPriorProxy m_y_spatial_prior; + DMCHTSDecoderProxy m_decoder; + DMCHTSFeatureAdaptorIProxy m_feature_adaptor_i; + DMCHTSFeatureAdaptorMProxy m_feature_adaptor_m; + DMCHTSFeatureExtractorProxy m_feature_extractor; + DMCHTSReconHeadProxy m_recon_head; + + float m_skip_threshold{ 0.f }; + + bool m_finish{ false }; + bool m_result_ready{ false }; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + bool m_pending{ false }; + DMCWorkType m_pending_work; + + uint8_t* m_bit_stream{ nullptr }; + int m_bit_stream_size{ 0 }; + int m_z_width{ 0 }; + int m_z_height{ 0 }; + + cudaEvent_t m_event_y; + cudaEvent_t m_event_z_ready; + cudaEvent_t m_event_y_ready; + int* m_size_ptr{ nullptr }; + + int m_qp{ 0 }; + std::shared_ptr> m_y_to_encode{ nullptr }; + std::shared_ptr> m_y_to_decode{ nullptr }; + + at::ScalarType m_dtype; + at::Device m_device{ at::kCUDA }; + + // for cuda graph + int m_H8{ 0 }; + int m_W8{ 0 }; + cudaGraphExec_t m_gexec_enc_0[g_qp_num]{ nullptr }; + cudaGraphExec_t m_gexec_enc_1[g_qp_num][2]{ nullptr }; + cudaGraphExec_t m_gexec_dec_0[g_qp_num][2]{ nullptr }; + cudaGraphExec_t m_gexec_dec_1{ nullptr }; + cudaGraphExec_t m_gexec_dec_2{ nullptr }; + cudaGraphExec_t m_gexec_dec_3[g_qp_num]{ nullptr }; + bool m_memory_has_value{ true }; + at::Tensor m_mask_0; + at::Tensor m_mask_1; + at::Tensor m_mask_2; + at::Tensor m_mask_3; + at::Tensor m_enc_unshuffle_out; + at::Tensor m_feature_i; // output of image frame unshuffle or recon_head reset + at::Tensor m_feature_p; // output of decoder + at::Tensor m_memory; // output of both feature_adaptor_i and feature_adaptor_m + at::Tensor m_ctx; + at::Tensor m_temporal_input; + at::Tensor m_temporal_params; + at::Tensor m_y; + at::Tensor m_y_pad; + at::Tensor m_hyper_params; + at::Tensor m_hyper_params_pad4; + at::Tensor m_common_params; // no allocation + at::Tensor m_z_hat; + at::Tensor m_z_hat_io; + at::Tensor m_means; + at::Tensor m_reduced_params; + at::Tensor m_y_q; + at::Tensor m_y_q_r; // only for decompress + at::Tensor m_y_hat; + at::Tensor m_y_symbol; + at::Tensor m_y_symbol_prev; + at::Tensor m_y_indexes; + at::Tensor m_y_indexes_prev; + at::Tensor m_skip_cond; + at::Tensor m_y_decoded; + at::Tensor m_y_size; + at::Tensor m_y_num; + at::Tensor m_decoder_up_out; + std::vector m_x_hat; // no allocation. length: g_frame_delay + + // 5 concatenated tensors + at::Tensor m_cat_encoder; + at::Tensor m_cat_decoder; + at::Tensor m_cat_feature_adaptor_m; + at::Tensor m_cat_prior_fusion; + at::Tensor m_cat_spatial_prior_adaptor; +}; diff --git a/src/layers/extensions/inference/dmc_ld_proxy.cpp b/src/layers/extensions/inference/dmc_ld_proxy.cpp new file mode 100644 index 0000000..4dfe494 --- /dev/null +++ b/src/layers/extensions/inference/dmc_ld_proxy.cpp @@ -0,0 +1,862 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include +#include + +#include "common_cpp.h" +#include "cuda_check.h" +#include "def_cutlass.h" +#include "def_elementwise.h" +#include "dmc_ld_proxy.h" +#include "memory_pool.h" + +at::Tensor DMCLDDecoderProxy::forward(const at::Tensor& x, const at::Tensor& conv1_input, + const at::Tensor& quant) +{ + auto out = forward_part1(x); + out = forward_part2(conv1_input, quant); + return out; +} + +at::Tensor DMCLDDecoderProxy::forward_part1(const at::Tensor& x) +{ + return m_up.forward(x); +} + +at::Tensor DMCLDDecoderProxy::forward_part2(const at::Tensor& x, const at::Tensor& quant) +{ + const int sm = get_gpu_sm(); + auto out = m_conv10.forward(x); + out = m_conv11.forward(out); + out = m_conv12.forward(out); + out = conv1x1_bias_with_quant(sm, out, m_conv2_weight, m_conv2_bias, quant, m_conv2_out); + return out; +} + +at::Tensor DMCLDDecoderProxy::pre_allocate_tensors(at::Tensor& x, at::Tensor& up_out_buf, + at::Tensor& conv1_input_buf, + const at::Tensor& out_buf) +{ + m_up.pre_allocate_tensors(x, up_out_buf); + m_conv2_out = out_buf; + auto out = m_conv10.pre_allocate_tensors(conv1_input_buf, true); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv12.pre_allocate_tensors(out); + + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv12.release_tensors(); + return m_conv2_out; +} + +void DMCLDDecoderProxy::set_param(const std::map& state_dict) +{ + m_up.set_param(get_submodule_state_dict(state_dict, "up.")); + m_conv10.set_param(get_submodule_state_dict(state_dict, "conv1.0.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "conv1.1.")); + m_conv12.set_param(get_submodule_state_dict(state_dict, "conv1.2.")); + m_conv2_weight = state_dict.at("conv2.weight"); + m_conv2_bias = state_dict.at("conv2.bias"); +} + +at::Tensor DMCLDEncoderProxy::forward(const at::Tensor& x, const at::Tensor& quant) +{ + const int sm = get_gpu_sm(); + auto out = m_conv10.forward(x); + out = m_conv11.forward(out); + out = m_conv2.forward(out, quant); + out = conv_bias(sm, out, m_down_weight, m_down_bias, 2, m_down_out); + return out; +} + +at::Tensor DMCLDEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_down_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_down = m_down_weight.size(0); + m_down_out = g_tensor_pool.empty({ 1, ch_down, H / 2, W / 2 }, options); + auto out = m_conv10.pre_allocate_tensors(x, true); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv2.release_tensors(); + return m_down_out; +} + +void DMCLDEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv10.set_param(get_submodule_state_dict(state_dict, "conv1.0.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "conv1.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv2.")); + m_down_weight = state_dict.at("down.weight"); + m_down_bias = state_dict.at("down.bias"); +} + +at::Tensor DMCLDFeatureAdaptorIProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + return out; +} + +at::Tensor DMCLDFeatureAdaptorIProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCLDFeatureAdaptorIProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); +} + +at::Tensor DMCLDFeatureAdaptorMProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + return out; +} + +at::Tensor DMCLDFeatureAdaptorMProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCLDFeatureAdaptorMProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); +} + +at::Tensor DMCLDFeatureExtractorProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + out = m_conv4.forward(out); + return out; +} + +at::Tensor DMCLDFeatureExtractorProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out); + out = m_conv4.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + m_conv4.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCLDFeatureExtractorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "conv.3.")); + m_conv4.set_param(get_submodule_state_dict(state_dict, "conv.4.")); +} + +at::Tensor DMCLDHyperDecoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCLDHyperDecoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out, false, out_buf); + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCLDHyperDecoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0."), false); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), false); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); +} + +at::Tensor DMCLDHyperEncoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCLDHyperEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCLDHyperEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), false); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2."), false); +} + +at::Tensor DMCLDPriorFusionProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCLDPriorFusionProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + m_conv3_out = out_buf; + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCLDPriorFusionProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +at::Tensor DMCLDReconHeadProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_head_weight, m_head_bias, m_head_out); + out = pixel_shuffle_8_cuda(out, true, m_shuffle_out); + return out; +} + +at::Tensor DMCLDReconHeadProxy::forward_reset(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_head_weight, m_head_bias, m_head_out); + return out; +} + +at::Tensor DMCLDReconHeadProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_head_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int C = m_head_weight.size(0); + m_head_out = out_buf; + m_shuffle_out = at::empty({ 1, C / 64, H * 8, W * 8 }, options); + auto out = m_conv0.pre_allocate_tensors(x, true); // must not modify! + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_shuffle_out; +} + +void DMCLDReconHeadProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_head_weight = state_dict.at("head.weight"); + m_head_bias = state_dict.at("head.bias"); +} + +at::Tensor DMCLDSpatialPriorProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = conv1x1_bias(sm, out, m_conv2_weight, m_conv2_bias, m_conv2_out); + return out; +} + +at::Tensor DMCLDSpatialPriorProxy::pre_allocate_tensors(at::Tensor& x, at::Tensor& out_buf) +{ + m_conv2_out = out_buf; + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + return m_conv2_out; +} + +void DMCLDSpatialPriorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2_weight = state_dict.at("conv.2.weight"); + m_conv2_bias = state_dict.at("conv.2.bias"); +} + +at::Tensor DMCLDTemporalPriorEncoderProxy::forward(const at::Tensor& x) +{ + return m_conv.forward(x); +} + +at::Tensor DMCLDTemporalPriorEncoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv.pre_allocate_tensors(x, out_buf); + m_conv.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCLDTemporalPriorEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv.set_param(get_submodule_state_dict(state_dict, "conv."), false); +} + +DMCLDProxy::DMCLDProxy() +{ + CUDA_CHECK(cudaMallocHost((void**)&m_size_ptr, sizeof(int))); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_z_ready, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y_ready, cudaEventDisableTiming)); + m_thread = std::thread(&DMCLDProxy::worker, this); +} + +DMCLDProxy::~DMCLDProxy() +{ + { + std::lock_guard lk(m_mutex_pending); + m_finish = true; + } + m_cv_pending.notify_all(); + if (m_thread.joinable()) { + m_thread.join(); + } + cudaEventDestroy(m_event_y); + cudaEventDestroy(m_event_z_ready); + cudaEventDestroy(m_event_y_ready); + cudaFreeHost(m_size_ptr); + + clear_cuda_graph(); +} + +void DMCLDProxy::add_ref_feature_from_frame(const at::Tensor& frame, const bool apply_adaptor) +{ + pre_allocate_tensors(frame); + // must NOT use cuda graph becase frame.data_ptr() is non-const + m_feature_i = pixel_unshuffle_cuda(frame, 8, m_feature_i); + if (apply_adaptor) { + m_memory = m_feature_adaptor_i.forward(m_feature_i); + m_ctx = m_feature_extractor.forward(m_memory); + m_temporal_params = m_temporal_prior_encoder.forward(m_memory); + } + m_memory_has_value = apply_adaptor; +} + +py::tuple DMCLDProxy::compress(const at::Tensor& x, const int qp, const bool reset_feature_memory, + const int padding_b, const int padding_r) +{ + m_result_ready = false; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + // must NOT use cuda graph becase x.data_ptr() is non-const + m_enc_unshuffle_out = pad_and_unshuffle_8_cuda(x, padding_b, padding_r, m_enc_unshuffle_out); + + // ----------- start of lambda_enc_0 ----------- + auto lambda_enc_0 = [&](const int qp) { + // need to output [m_z_hat_io, m_y_symbol, m_y_size] for cpu thread + auto y = m_encoder.forward(m_cat_encoder, m_q_encoder[qp]); + auto y_pad = pad_for_y(y, m_y_pad); + auto z = m_hyper_encoder.forward(y_pad); + std::tie(m_z_hat, m_z_hat_io) = round_z_cuda(z, m_z_hat, m_z_hat_io); + m_hyper_params_pad4 = m_hyper_decoder.forward(m_z_hat); + m_hyper_params = crop_hyper_params(m_hyper_params_pad4, m_temporal_params.size(2), + m_temporal_params.size(3), m_hyper_params); + m_temporal_params = multiply_with_broadcast_cuda(m_temporal_params, m_q_feature[qp], + m_temporal_params); // inplace + m_common_params = m_y_prior_fusion.forward(m_cat_prior_fusion); + + auto [q_dec, scales, means] = chunk_tensors_3(m_common_params); + y = divide_with_clamp_min_inplace_cuda(y, q_dec); + std::tie(m_y_q, m_y_hat) = process_with_mask_no_scale_cuda( + y, scales, means, m_mask_0, m_skip_threshold, 0, m_y_q, m_y_hat); + m_means = m_y_spatial_prior.forward(m_cat_spatial_prior); + std::tie(m_y_q, m_y_hat) = process_with_mask_no_scale_add_and_multiply_inplace_cuda( + y, scales, m_means, m_mask_1, m_y_q, m_y_hat, q_dec, m_skip_threshold, 0); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q, scales, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol, m_y_size, m_y_num) = + conditional_index_part1_cuda(m_y_symbol_prev, m_skip_cond, m_y_symbol, m_y_size, m_y_num); + }; + + run(lambda_enc_0, m_gexec_enc_0, m_qp); + // ------------ end of lambda_enc_0 ------------ + + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::Encode; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_enc_1 ----------- + auto lambda_enc_1 = [&](const int qp, const bool reset_feature_memory) { + m_feature_p = m_decoder.forward(m_y_hat, m_cat_decoder, m_q_decoder[qp]); + add_ref_feature_and_apply_adaptor(m_feature_p, reset_feature_memory); + m_temporal_params = m_temporal_prior_encoder.forward(m_memory); + }; + + run(lambda_enc_1, m_gexec_enc_1, m_qp, reset_feature_memory); + // ------------ end of lambda_enc_1 ------------ + + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (m_result_ready) { + return py::make_tuple(m_entropy_encoder.get_encoded_stream(), m_entropy_coder_parallel); + } + return py::make_tuple(py::array_t(0), 1); +} + +at::Tensor DMCLDProxy::decompress(const py::array_t& bit_stream, const int qp, + const int height, const int width, + const int entropy_coder_parallel, const bool reset_feature_memory) +{ + m_result_ready = false; + m_entropy_coder_parallel = entropy_coder_parallel; + py::buffer_info bit_stream_buf = bit_stream.request(); + m_bit_stream = static_cast(bit_stream_buf.ptr); + m_bit_stream_size = static_cast(bit_stream.size()); + m_z_height = (height + 63) / 64; + m_z_width = (width + 63) / 64; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeZ; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_dec_0 ----------- + auto lambda_dec_0 = [&](const bool memory_has_value) { + apply_feature_adaptor(memory_has_value); + m_temporal_params = m_temporal_prior_encoder.forward(m_memory); + }; + + run(lambda_dec_0, m_gexec_dec_0, m_memory_has_value); + // ------------ end of lambda_dec_0 ------------ + + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (!m_result_ready) { + return at::Tensor(); + } + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_z_ready)); + + at::Tensor q_dec; + at::Tensor scales; + at::Tensor means; + // ----------- start of lambda_dec_1 ----------- + auto lambda_dec_1 = [&](const int qp) { + // need to output [m_y_indexes, m_y_size] for cpu thread + m_z_hat = int8_to_dtype_cuda(m_z_hat_io, m_dtype, g_ch_z, m_z_height, m_z_width, m_z_hat); + m_hyper_params_pad4 = m_hyper_decoder.forward(m_z_hat); + m_hyper_params = crop_hyper_params(m_hyper_params_pad4, m_temporal_params.size(2), + m_temporal_params.size(3), m_hyper_params); + m_temporal_params = multiply_with_broadcast_cuda(m_temporal_params, m_q_feature[qp], + m_temporal_params); // inplace + m_common_params = m_y_prior_fusion.forward(m_cat_prior_fusion); + std::tie(q_dec, scales, means) = chunk_tensors_3(m_common_params); + std::tie(m_y_indexes_prev, m_skip_cond) = build_index_dec_cuda( + scales, m_skip_threshold, at::nullopt, 0, m_y_indexes_prev, m_skip_cond); + std::tie(m_y_indexes, m_y_size, m_y_num) = + conditional_index_part1_cuda(m_y_indexes_prev, m_skip_cond, m_y_indexes, m_y_size, m_y_num); + }; + + run(lambda_dec_1, m_gexec_dec_1, m_qp); + // ------------ end of lambda_dec_1 ------------ + + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_dec_2 ----------- + auto lambda_dec_2 = [&]() { m_ctx = m_feature_extractor.forward(m_memory); }; + + run(lambda_dec_2, m_gexec_dec_2); + // ------------ end of lambda_dec_2 ------------ + + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (!m_result_ready) { + return at::Tensor(); + } + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_3 ----------- + auto lambda_dec_3 = [&](const int qp) { + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_skip_cond, m_y_num, + m_dtype, m_y_q_r); + m_y_hat = restore_y_cuda(m_y_q_r, means, m_mask_0, m_y_hat); + m_means = m_y_spatial_prior.forward(m_cat_spatial_prior); + m_y_hat = restore_y_and_add_multiply_inplace_cuda(m_y_q_r, m_means, m_mask_1, m_y_hat, q_dec); + // decoder + recon_head + m_feature_p = m_decoder.forward(m_y_hat, m_cat_decoder, m_q_decoder[qp]); + m_x_hat = m_recon_head.forward(m_feature_p); // m_feature_i is also updated for reset purpose + }; + + run(lambda_dec_3, m_gexec_dec_3, m_qp); + // ------------ end of lambda_dec_3 ------------ + + m_memory_has_value = !reset_feature_memory; // host operation. must be outside of cuda graph + + return m_x_hat; +} + +void DMCLDProxy::set_param(const std::map& state_dict, const float skip_threshold) +{ + m_device = state_dict.at("q_decoder").device(); + m_dtype = state_dict.at("q_decoder").scalar_type(); + auto q_encoder = state_dict.at("q_encoder"); + auto q_decoder = state_dict.at("q_decoder"); + auto q_feature = state_dict.at("q_feature"); + for (int i = 0; i < g_qp_num; i++) { + m_q_encoder[i] = q_encoder.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_decoder[i] = q_decoder.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_feature[i] = q_feature.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + } + m_encoder.set_param(get_submodule_state_dict(state_dict, "encoder.")); + m_hyper_encoder.set_param(get_submodule_state_dict(state_dict, "hyper_encoder.")); + m_temporal_prior_encoder.set_param( + get_submodule_state_dict(state_dict, "temporal_prior_encoder.")); + m_hyper_decoder.set_param(get_submodule_state_dict(state_dict, "hyper_decoder.")); + m_y_prior_fusion.set_param(get_submodule_state_dict(state_dict, "y_prior_fusion.")); + m_y_spatial_prior.set_param(get_submodule_state_dict(state_dict, "y_spatial_prior.")); + m_decoder.set_param(get_submodule_state_dict(state_dict, "decoder.")); + m_feature_adaptor_i.set_param(get_submodule_state_dict(state_dict, "feature_adaptor_i.")); + m_feature_adaptor_m.set_param(get_submodule_state_dict(state_dict, "feature_adaptor_m.")); + m_feature_extractor.set_param(get_submodule_state_dict(state_dict, "feature_extractor.")); + m_recon_head.set_param(get_submodule_state_dict(state_dict, "recon_head.")); + + m_skip_threshold = skip_threshold; + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); + + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); +} + +void DMCLDProxy::add_ref_feature_and_apply_adaptor(const at::Tensor& feature, + const bool reset_feature_memory) +{ + if (reset_feature_memory) { + auto out = m_recon_head.forward_reset(feature); + m_memory = m_feature_adaptor_i.forward(out); + } else { + m_memory = m_feature_adaptor_m.forward(m_cat_feature_adaptor_m); + } + m_ctx = m_feature_extractor.forward(m_memory); +} + +void DMCLDProxy::apply_feature_adaptor(const bool memory_has_value) +{ + if (memory_has_value) { + m_memory = m_feature_adaptor_m.forward(m_cat_feature_adaptor_m); + } else { + m_memory = m_feature_adaptor_i.forward(m_feature_i); + } +} + +void DMCLDProxy::clear_cuda_graph() +{ + for (int i = 0; i < g_qp_num; ++i) { + destroy_cuda_graph_exec(m_gexec_enc_0[i]); + for (int j = 0; j < 2; ++j) { + destroy_cuda_graph_exec(m_gexec_enc_1[i][j]); + } + } + for (int i = 0; i < 2; ++i) { + destroy_cuda_graph_exec(m_gexec_dec_0[i]); + } + destroy_cuda_graph_exec(m_gexec_dec_2); + for (int i = 0; i < g_qp_num; ++i) { + destroy_cuda_graph_exec(m_gexec_dec_1[i]); + destroy_cuda_graph_exec(m_gexec_dec_3[i]); + } +} + +std::tuple DMCLDProxy::get_mask_2x(const at::Tensor& y) +{ + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + auto m = at::ones({ 1, C / 2, H, W }, y.options().dtype(at::kBool)); + auto m0 = get_one_mask(torch::tensor({ { 1, 0 }, { 0, 1 } }, y.options().dtype(at::kBool)), H, W); + auto m1 = get_one_mask(torch::tensor({ { 0, 1 }, { 1, 0 } }, y.options().dtype(at::kBool)), H, W); + + auto mask_0 = at::cat({ m * m0, m * m1 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_1 = at::cat({ m * m1, m * m0 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + + return { mask_0, mask_1 }; +} + +void DMCLDProxy::pre_allocate_tensors(const at::Tensor& frame) +{ + int H = frame.size(2); + int W = frame.size(3); + H = (H + 16 - 1) / 16 * 16; + W = (W + 16 - 1) / 16 * 16; + const int H8 = H / 8; + const int W8 = W / 8; + if (m_H8 == H8 && m_W8 == W8) { + return; + } + + m_H8 = H8; + m_W8 = W8; + clear_cuda_graph(); + g_tensor_pool.clear(H8, W8); + + auto options = frame.options().memory_format(at::MemoryFormat::ChannelsLast); + const int H16 = H8 / 2; + const int W16 = W8 / 2; + auto [padR, padB] = get_padding_size(H16, W16, 4); + const int H16_pad4 = H16 + padB; + const int W16_pad4 = W16 + padR; + const int H64 = H16_pad4 / 4; + const int W64 = W16_pad4 / 4; + + const std::vector feature_i_shape = { 1, g_ch_src_d, H8, W8 }; + const std::vector y_shape = { 1, g_ch_y, H16, W16 }; + const std::vector y_pad_shape = { 1, g_ch_y, H16_pad4, W16_pad4 }; + const std::vector z_shape = { 1, g_ch_z, H64, W64 }; + + auto y = at::empty(y_shape, options); + + // pre allocate tensors + std::tie(m_mask_0, m_mask_1) = get_mask_2x(y); + m_y_decoded = at::empty({ y.numel() }, y.options().dtype(at::kChar)); + m_y_to_decode = std::make_shared>(y.numel()); + m_y_to_encode = std::make_shared>(y.numel()); + + // + // pre allocate concatenated tensors + // + + // 1. deal with m_cat_encoder, m_cat_decoder, m_enc_unshuffle_out, m_decoder_up_out, and m_ctx + assert(g_ch_d > g_ch_src_d); + at::Tensor tensor_placeholder; + m_cat_decoder = at::empty({ 1, g_ch_d + g_ch_m, H8, W8 }, options); + std::tie(tensor_placeholder, m_cat_encoder) = + split_tensors_2(m_cat_decoder, g_ch_d - g_ch_src_d, g_ch_src_d + g_ch_m); + std::tie(tensor_placeholder, m_enc_unshuffle_out, m_ctx) = + split_tensors_3(m_cat_decoder, g_ch_d - g_ch_src_d, g_ch_src_d, g_ch_m); + std::tie(m_decoder_up_out, m_ctx) = split_tensors_2(m_cat_decoder, g_ch_d, g_ch_m); + + // 2. deal with m_cat_feature_adaptor_m, m_memory, and m_feature_p + m_cat_feature_adaptor_m = at::empty({ 1, g_ch_m + g_ch_d, H8, W8 }, options); + std::tie(m_memory, m_feature_p) = split_tensors_2(m_cat_feature_adaptor_m, g_ch_m, g_ch_d); + + // 3. deal with m_cat_prior_fusion, m_hyper_params, and m_temporal_params + m_cat_prior_fusion = at::empty({ 1, g_ch_y * 3, H16, W16 }, options); + std::tie(m_hyper_params, m_temporal_params) = + split_tensors_2(m_cat_prior_fusion, g_ch_y, g_ch_y * 2); + m_hyper_params_pad4 = (padR == 0 && padB == 0) ? m_hyper_params : at::empty(y_pad_shape, options); + + // 4. deal with m_cat_spatial_prior, m_y_hat, and m_common_params + m_cat_spatial_prior = at::empty({ 1, g_ch_y * 4, H16, W16 }, options); + std::tie(m_y_hat, m_common_params) = split_tensors_2(m_cat_spatial_prior, g_ch_y, g_ch_y * 3); + + // pre allocate other tensors + m_feature_i = g_tensor_pool.empty(feature_i_shape, options); + + m_z_hat = at::empty(z_shape, options.dtype(at::kHalf)); + m_z_hat_io = at::empty(z_shape, options.dtype(at::kChar)); + + m_means = at::empty_like(y); + m_y_q = at::empty_like(y); + m_y_q_r = at::empty_like(y); + + m_y_symbol = at::empty({ y.numel() }, y.options().dtype(at::kShort)); + m_y_symbol_prev = at::empty_like(m_y_symbol); + m_y_indexes = at::empty({ y.numel() }, y.options().dtype(at::kByte)); + m_y_indexes_prev = at::empty_like(m_y_indexes); + m_skip_cond = at::empty({ y.numel() }, y.options().dtype(at::kBool)); + + const int block_num = (y.numel() + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + m_y_size = at::empty({ 1 }, y.options().dtype(at::kInt)); + m_y_num = at::empty({ block_num, COND_KERNEL_THREAD_NUM1 }, y.options().dtype(at::kInt)); + + // pre allocate modules + m_y = m_encoder.pre_allocate_tensors(m_cat_encoder); + m_y_pad = (padR == 0 && padB == 0) ? m_y : at::empty(y_pad_shape, options); + m_hyper_encoder.pre_allocate_tensors(m_y_pad); + m_temporal_prior_encoder.pre_allocate_tensors(m_memory, m_temporal_params); + m_hyper_decoder.pre_allocate_tensors(m_z_hat, m_hyper_params_pad4); + m_y_prior_fusion.pre_allocate_tensors(m_cat_prior_fusion, m_common_params); + m_y_spatial_prior.pre_allocate_tensors(m_cat_spatial_prior, m_means); + m_decoder.pre_allocate_tensors(m_y_hat, m_decoder_up_out, m_cat_decoder, m_feature_p); + m_feature_adaptor_i.pre_allocate_tensors(m_feature_i, m_memory); + m_feature_adaptor_m.pre_allocate_tensors(m_cat_feature_adaptor_m, m_memory); + m_feature_extractor.pre_allocate_tensors(m_memory, m_ctx); + m_x_hat = m_recon_head.pre_allocate_tensors(m_feature_p, m_feature_i); +} + +void DMCLDProxy::worker() +{ + at::cuda::CUDAStream high_priority_stream = at::cuda::getStreamFromPool(true); + at::cuda::CUDAStreamGuard guard(high_priority_stream); + + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending || m_finish; }); + if (m_finish) { + break; + } + m_pending = false; + lk.unlock(); + + if (m_pending_work == DMCWorkType::Encode) { + m_entropy_encoder.reset(); + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + + auto out = conditional_index_part2_cuda(m_y_symbol, m_y_size, m_size_ptr); + CUDA_CHECK(cudaMemcpyAsync(m_y_to_encode->data(), out.data_ptr(), + (*m_size_ptr) * sizeof(int16_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaStreamSynchronize(at::cuda::getCurrentCUDAStream())); + m_entropy_coder_parallel = compute_ec_parallel(*m_size_ptr); + m_entropy_encoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + m_entropy_encoder.encode_y(m_y_to_encode, *m_size_ptr); + + auto t = tensor_to_vector_1d(m_z_hat_io); + m_entropy_encoder.encode_z(t, m_qp * g_ch_z, g_ch_z); + m_entropy_encoder.flush(); + } else if (m_pending_work == DMCWorkType::DecodeZ) { + m_entropy_decoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + m_entropy_decoder.set_stream(m_bit_stream, m_bit_stream_size); + const int z_num = g_ch_z * m_z_height * m_z_width; + m_entropy_decoder.decode_z(z_num, m_qp * g_ch_z, g_ch_z); + + auto z_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_z_hat_io.data_ptr(), z_cpu->data(), + z_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_z_ready, at::cuda::getCurrentCUDAStream())); + } else if (m_pending_work == DMCWorkType::DecodeY) { + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + auto out = conditional_index_part2_cuda(m_y_indexes, m_y_size, m_size_ptr); + const int y_num = *m_size_ptr; + CUDA_CHECK(cudaMemcpyAsync(m_y_to_decode->data(), out.data_ptr(), + y_num * sizeof(uint8_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + + m_entropy_decoder.decode_y(m_y_to_decode, y_num); + + auto y_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_y_decoded.data_ptr(), y_cpu->data(), + y_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_y_ready, at::cuda::getCurrentCUDAStream())); + } else { + assert(false); + } + + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + } +} diff --git a/src/layers/extensions/inference/dmc_ld_proxy.h b/src/layers/extensions/inference/dmc_ld_proxy.h new file mode 100644 index 0000000..2ae1207 --- /dev/null +++ b/src/layers/extensions/inference/dmc_ld_proxy.h @@ -0,0 +1,330 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include "dmc_common.h" + +class DMCLDDecoderProxy { +public: + DMCLDDecoderProxy() = default; + ~DMCLDDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& conv1_input, const at::Tensor& quant); + at::Tensor forward_part1(const at::Tensor& x); + at::Tensor forward_part2(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x, at::Tensor& up_out_buf, + at::Tensor& conv1_input_buf, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + SubpelConv2xProxy m_up; + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv12; + at::Tensor m_conv2_weight; + at::Tensor m_conv2_bias; + + // for cuda graphs + at::Tensor m_conv2_out; +}; + +class DMCLDEncoderProxy { +public: + DMCLDEncoderProxy() = default; + ~DMCLDEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv2; + at::Tensor m_down_weight; + at::Tensor m_down_bias; + + // for cuda graph + at::Tensor m_down_out; +}; + +class DMCLDFeatureAdaptorIProxy { +public: + DMCLDFeatureAdaptorIProxy() = default; + ~DMCLDFeatureAdaptorIProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; +}; + +class DMCLDFeatureAdaptorMProxy { +public: + DMCLDFeatureAdaptorMProxy() = default; + ~DMCLDFeatureAdaptorMProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; +}; + +class DMCLDFeatureExtractorProxy { +public: + DMCLDFeatureExtractorProxy() = default; + ~DMCLDFeatureExtractorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; + DepthConvBlockProxy m_conv4; +}; + +class DMCLDHyperDecoderProxy { +public: + DMCLDHyperDecoderProxy() = default; + ~DMCLDHyperDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockUpsampleProxy m_conv0; + ResidualBlockUpsampleProxy m_conv1; + DepthConvBlockProxy m_conv2; +}; + +class DMCLDHyperEncoderProxy { +public: + DMCLDHyperEncoderProxy() = default; + ~DMCLDHyperEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + ResidualBlockWithStride2Proxy m_conv1; + ResidualBlockWithStride2Proxy m_conv2; +}; + +class DMCLDPriorFusionProxy { +public: + DMCLDPriorFusionProxy() = default; + ~DMCLDPriorFusionProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graphs + at::Tensor m_conv3_out; +}; + +class DMCLDReconHeadProxy { +public: + DMCLDReconHeadProxy() = default; + ~DMCLDReconHeadProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor forward_reset(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_head_weight; + at::Tensor m_head_bias; + + // for cuda graphs + at::Tensor m_head_out; + at::Tensor m_shuffle_out; +}; + +class DMCLDSpatialPriorProxy { +public: + DMCLDSpatialPriorProxy() = default; + ~DMCLDSpatialPriorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + at::Tensor m_conv2_weight; + at::Tensor m_conv2_bias; + + // for cuda graphs + at::Tensor m_conv2_out; +}; + +class DMCLDTemporalPriorEncoderProxy { +public: + DMCLDTemporalPriorEncoderProxy() = default; + ~DMCLDTemporalPriorEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockWithStride2Proxy m_conv; +}; + +class DMCLDProxy : public DMCCommon { +public: + static constexpr int g_ch_src_d = 3 * 8 * 8; + static constexpr int g_ch_y = 128; + static constexpr int g_ch_z = 128; + static constexpr int g_ch_d = 256; + static constexpr int g_ch_m = 256; + + DMCLDProxy(); + ~DMCLDProxy(); + + void add_ref_feature_from_frame(const at::Tensor& frame, const bool apply_adaptor); + py::tuple compress(const at::Tensor& x, const int qp, const bool reset_feature_memory, + const int padding_b, const int padding_r); + at::Tensor decompress(const py::array_t& bit_stream, const int qp, const int height, + const int width, const int entropy_coder_parallel, + const bool reset_feature_memory); + void set_param(const std::map& state_dict, const float skip_threshold); + +private: + // compress and decompress components + void add_ref_feature_and_apply_adaptor(const at::Tensor& feature, const bool reset_feature_memory); + void apply_feature_adaptor(const bool memory_none); + + // cuda graph related + void clear_cuda_graph(); + + // helper functions + std::tuple get_mask_2x(const at::Tensor& y); + + void pre_allocate_tensors(const at::Tensor& frame); + void worker(); + +private: + at::Tensor m_q_encoder[g_qp_num]; + at::Tensor m_q_decoder[g_qp_num]; + at::Tensor m_q_feature[g_qp_num]; + + DMCLDEncoderProxy m_encoder; + DMCLDHyperEncoderProxy m_hyper_encoder; + DMCLDTemporalPriorEncoderProxy m_temporal_prior_encoder; + DMCLDHyperDecoderProxy m_hyper_decoder; + DMCLDPriorFusionProxy m_y_prior_fusion; + DMCLDSpatialPriorProxy m_y_spatial_prior; + DMCLDDecoderProxy m_decoder; + DMCLDFeatureAdaptorIProxy m_feature_adaptor_i; + DMCLDFeatureAdaptorMProxy m_feature_adaptor_m; + DMCLDFeatureExtractorProxy m_feature_extractor; + DMCLDReconHeadProxy m_recon_head; + + float m_skip_threshold{ 0.f }; + + bool m_finish{ false }; + bool m_result_ready{ false }; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + bool m_pending{ false }; + DMCWorkType m_pending_work; + + uint8_t* m_bit_stream{ nullptr }; + int m_bit_stream_size{ 0 }; + int m_z_width{ 0 }; + int m_z_height{ 0 }; + + cudaEvent_t m_event_y; + cudaEvent_t m_event_z_ready; + cudaEvent_t m_event_y_ready; + int* m_size_ptr{ nullptr }; + + int m_qp{ 0 }; + std::shared_ptr> m_y_to_encode{ nullptr }; + std::shared_ptr> m_y_to_decode{ nullptr }; + + at::ScalarType m_dtype; + at::Device m_device{ at::kCUDA }; + + // for cuda graph + int m_H8{ 0 }; + int m_W8{ 0 }; + cudaGraphExec_t m_gexec_enc_0[g_qp_num]{ nullptr }; + cudaGraphExec_t m_gexec_enc_1[g_qp_num][2]{ nullptr }; + cudaGraphExec_t m_gexec_dec_0[2]{ nullptr }; + cudaGraphExec_t m_gexec_dec_1[g_qp_num]{ nullptr }; + cudaGraphExec_t m_gexec_dec_2{ nullptr }; + cudaGraphExec_t m_gexec_dec_3[g_qp_num]{ nullptr }; + bool m_memory_has_value{ true }; + at::Tensor m_mask_0; + at::Tensor m_mask_1; + at::Tensor m_enc_unshuffle_out; + at::Tensor m_feature_i; // output of both image frame unshuffle and recon_head reset + at::Tensor m_feature_p; // output of decoder + at::Tensor m_memory; // output of both feature_adaptor_i and feature_adaptor_m + at::Tensor m_ctx; + at::Tensor m_temporal_params; + at::Tensor m_y; + at::Tensor m_y_pad; + at::Tensor m_hyper_params; + at::Tensor m_hyper_params_pad4; + at::Tensor m_z_hat; + at::Tensor m_z_hat_io; + at::Tensor m_common_params; + at::Tensor m_means; + at::Tensor m_y_q; + at::Tensor m_y_q_r; // only for decompress + at::Tensor m_y_hat; + at::Tensor m_y_symbol; + at::Tensor m_y_symbol_prev; + at::Tensor m_y_indexes; + at::Tensor m_y_indexes_prev; + at::Tensor m_skip_cond; + at::Tensor m_y_decoded; + at::Tensor m_y_size; + at::Tensor m_y_num; + at::Tensor m_decoder_up_out; + at::Tensor m_x_hat; // no allocation + + // 5 concatenated tensors + at::Tensor m_cat_encoder; + at::Tensor m_cat_decoder; + at::Tensor m_cat_feature_adaptor_m; + at::Tensor m_cat_prior_fusion; + at::Tensor m_cat_spatial_prior; +}; diff --git a/src/layers/extensions/inference/dmci_proxy.cpp b/src/layers/extensions/inference/dmci_proxy.cpp new file mode 100644 index 0000000..416e776 --- /dev/null +++ b/src/layers/extensions/inference/dmci_proxy.cpp @@ -0,0 +1,882 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include +#include + +#include "common_cpp.h" +#include "cuda_check.h" +#include "def_cutlass.h" +#include "def_elementwise.h" +#include "dmci_proxy.h" +#include "memory_pool.h" + +at::Tensor DMCIDecoderProxy::forward(const at::Tensor& x, const at::Tensor& quant) +{ + auto out = m_up.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = m_conv3.forward(out); + out = m_conv4.forward(out); + out = m_conv5.forward(out); + out = m_conv6.forward(out); + out = m_conv7.forward(out); + out = m_conv8.forward(out); + out = m_conv9.forward(out); + out = m_conv10.forward(out); + out = m_conv11.forward(out); + out = m_conv12.forward(out); + out = multiply_with_broadcast_cuda(out, quant, out); + out = m_dec_2.forward(out); + out = pixel_shuffle_8_cuda(out, true, m_shuffle_out); + return out; +} + +at::Tensor DMCIDecoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = x.options().memory_format(at::MemoryFormat::ChannelsLast); + // dec_2 output channels = g_ch_src = 192, pixel_shuffle_8 → 192/64 = 3 + m_shuffle_out = at::empty({ 1, 3, H * 2 * 8, W * 2 * 8 }, options); + auto out = m_up.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + out = m_conv3.pre_allocate_tensors(out); + out = m_conv4.pre_allocate_tensors(out); + out = m_conv5.pre_allocate_tensors(out); + out = m_conv6.pre_allocate_tensors(out); + out = m_conv7.pre_allocate_tensors(out); + out = m_conv8.pre_allocate_tensors(out); + out = m_conv9.pre_allocate_tensors(out); + out = m_conv10.pre_allocate_tensors(out); + out = m_conv11.pre_allocate_tensors(out); + out = m_conv12.pre_allocate_tensors(out); + out = m_dec_2.pre_allocate_tensors(out); + + m_up.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + m_conv3.release_tensors(); + m_conv4.release_tensors(); + m_conv5.release_tensors(); + m_conv6.release_tensors(); + m_conv7.release_tensors(); + m_conv8.release_tensors(); + m_conv9.release_tensors(); + m_conv10.release_tensors(); + m_conv11.release_tensors(); + m_conv12.release_tensors(); + m_dec_2.release_tensors(); + return m_shuffle_out; +} + +void DMCIDecoderProxy::set_param(const std::map& state_dict) +{ + m_up.set_param(get_submodule_state_dict(state_dict, "dec_1.0."), true); + m_conv1.set_param(get_submodule_state_dict(state_dict, "dec_1.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "dec_1.2.")); + m_conv3.set_param(get_submodule_state_dict(state_dict, "dec_1.3.")); + m_conv4.set_param(get_submodule_state_dict(state_dict, "dec_1.4.")); + m_conv5.set_param(get_submodule_state_dict(state_dict, "dec_1.5.")); + m_conv6.set_param(get_submodule_state_dict(state_dict, "dec_1.6.")); + m_conv7.set_param(get_submodule_state_dict(state_dict, "dec_1.7.")); + m_conv8.set_param(get_submodule_state_dict(state_dict, "dec_1.8.")); + m_conv9.set_param(get_submodule_state_dict(state_dict, "dec_1.9.")); + m_conv10.set_param(get_submodule_state_dict(state_dict, "dec_1.10.")); + m_conv11.set_param(get_submodule_state_dict(state_dict, "dec_1.11.")); + m_conv12.set_param(get_submodule_state_dict(state_dict, "dec_1.12.")); + m_dec_2.set_param(get_submodule_state_dict(state_dict, "dec_2.")); +} + +at::Tensor DMCIEncoderProxy::forward(const at::Tensor& x, const at::Tensor& quant) +{ + const int sm = get_gpu_sm(); + auto out = m_enc_1.forward(x); + out = multiply_with_broadcast_cuda(out, quant, out); + out = m_enc_2_0.forward(out); + out = m_enc_2_1.forward(out); + out = m_enc_2_2.forward(out); + out = m_enc_2_3.forward(out); + out = m_enc_2_4.forward(out); + out = m_enc_2_5.forward(out); + out = conv_bias(sm, out, m_down_weight, m_down_bias, 2, m_down_out); + return out; +} + +at::Tensor DMCIEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_down_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_down = m_down_weight.size(0); + m_down_out = g_tensor_pool.empty({ 1, ch_down, H / 2, W / 2 }, options); + auto out = m_enc_1.pre_allocate_tensors(x, true); + out = m_enc_2_0.pre_allocate_tensors(out); + out = m_enc_2_1.pre_allocate_tensors(out); + out = m_enc_2_2.pre_allocate_tensors(out); + out = m_enc_2_3.pre_allocate_tensors(out); + out = m_enc_2_4.pre_allocate_tensors(out); + out = m_enc_2_5.pre_allocate_tensors(out); + + m_enc_1.release_tensors(); + m_enc_2_0.release_tensors(); + m_enc_2_1.release_tensors(); + m_enc_2_2.release_tensors(); + m_enc_2_3.release_tensors(); + m_enc_2_4.release_tensors(); + m_enc_2_5.release_tensors(); + return m_down_out; +} + +void DMCIEncoderProxy::set_param(const std::map& state_dict) +{ + m_enc_1.set_param(get_submodule_state_dict(state_dict, "enc_1.")); + m_enc_2_0.set_param(get_submodule_state_dict(state_dict, "enc_2.0.")); + m_enc_2_1.set_param(get_submodule_state_dict(state_dict, "enc_2.1.")); + m_enc_2_2.set_param(get_submodule_state_dict(state_dict, "enc_2.2.")); + m_enc_2_3.set_param(get_submodule_state_dict(state_dict, "enc_2.3.")); + m_enc_2_4.set_param(get_submodule_state_dict(state_dict, "enc_2.4.")); + m_enc_2_5.set_param(get_submodule_state_dict(state_dict, "enc_2.5.")); + m_down_weight = state_dict.at("enc_2.6.weight"); + m_down_bias = state_dict.at("enc_2.6.bias"); +} + +at::Tensor DMCIHyperDecoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCIHyperDecoderProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + auto out = m_conv0.pre_allocate_tensors(x); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out, false, out_buf); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCIHyperDecoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0."), true); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), true); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); +} + +at::Tensor DMCIHyperEncoderProxy::forward(const at::Tensor& x) +{ + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + return out; +} + +at::Tensor DMCIHyperEncoderProxy::pre_allocate_tensors(at::Tensor& x) +{ + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + g_tensor_pool.set_reusable(out, false); + return out; +} + +void DMCIHyperEncoderProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1."), true); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2."), true); +} + +at::Tensor DMCISpatialPriorProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCISpatialPriorProxy::pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf) +{ + m_conv3_out = out_buf; + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCISpatialPriorProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +at::Tensor DMCIYPriorFusionProxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = m_conv0.forward(x); + out = m_conv1.forward(out); + out = m_conv2.forward(out); + out = conv1x1_bias(sm, out, m_conv3_weight, m_conv3_bias, m_conv3_out); + return out; +} + +at::Tensor DMCIYPriorFusionProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_conv3_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_conv3 = m_conv3_weight.size(0); + m_conv3_out = g_tensor_pool.empty({ 1, ch_conv3, H, W }, options); + auto out = m_conv0.pre_allocate_tensors(x, true); + out = m_conv1.pre_allocate_tensors(out); + out = m_conv2.pre_allocate_tensors(out); + + m_conv0.release_tensors(); + m_conv1.release_tensors(); + m_conv2.release_tensors(); + return m_conv3_out; +} + +void DMCIYPriorFusionProxy::set_param(const std::map& state_dict) +{ + m_conv0.set_param(get_submodule_state_dict(state_dict, "conv.0.")); + m_conv1.set_param(get_submodule_state_dict(state_dict, "conv.1.")); + m_conv2.set_param(get_submodule_state_dict(state_dict, "conv.2.")); + m_conv3_weight = state_dict.at("conv.3.weight"); + m_conv3_bias = state_dict.at("conv.3.bias"); +} + +DMCIProxy::DMCIProxy() +{ + CUDA_CHECK(cudaMallocHost((void**)&m_size_ptr, sizeof(int))); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_z_ready, cudaEventDisableTiming)); + CUDA_CHECK(cudaEventCreateWithFlags(&m_event_y_ready, cudaEventDisableTiming)); + m_thread = std::thread(&DMCIProxy::worker, this); +} + +DMCIProxy::~DMCIProxy() +{ + { + std::lock_guard lk(m_mutex_pending); + m_finish = true; + } + m_cv_pending.notify_all(); + if (m_thread.joinable()) { + m_thread.join(); + } + cudaEventDestroy(m_event_y); + cudaEventDestroy(m_event_z_ready); + cudaEventDestroy(m_event_y_ready); + cudaFreeHost(m_size_ptr); + + clear_cuda_graph(); +} + +py::tuple DMCIProxy::compress(const at::Tensor& x, const int qp, const int padding_b, const int padding_r) +{ + pre_allocate_tensors(x.size(2), x.size(3)); + m_result_ready = false; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + // must NOT use cuda graph because x.data_ptr() is non-const + m_enc_unshuffle_out = pad_and_unshuffle_8_cuda(x, padding_b, padding_r, m_enc_unshuffle_out); + + // ----------- start of lambda_enc_0 ----------- + auto lambda_enc_0 = [&](const int qp) { + // encoder → y + auto y = m_encoder.forward(m_enc_unshuffle_out, m_q_scale_enc[qp]); + auto y_pad = pad_for_y(y, m_y_pad); + // hyper encoder → z → z_hat + auto z = m_hyper_encoder.forward(y_pad); + std::tie(m_z_hat, m_z_hat_io) = round_z_cuda(z, m_z_hat, m_z_hat_io); + // hyper decoder → prior fusion → crop → common_params + m_hyper_params = m_hyper_decoder.forward(m_z_hat); + auto params = m_y_prior_fusion.forward(m_hyper_params); + const int yH = y.size(2); + const int yW = y.size(3); + params = crop_hyper_params(params, yH, yW, m_cropped_params); + + // separate prior: scales, means are views of common_params + auto [scales, means] = chunk_tensors_2(params); + + // y_enc = y * q_scale_y_enc (inplace) + y = multiply_with_broadcast_cuda(y, m_q_scale_y_enc[qp], y); + + // reduction for spatial prior + const int sm = get_gpu_sm(); + m_reduced_params = conv1x1_bias(sm, params, m_y_spatial_prior_reduction.weight, + m_y_spatial_prior_reduction.bias, m_reduced_params); + + // Step 0: process with mask_0 + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_0, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[0], m_y_size[0], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[0], m_y_size[0], m_y_num); + + // copy y_hat to y_hat_so_far (first 256 channels of m_cat_spatial_prior_adaptor) + m_y_hat_so_far.copy_(m_y_hat); + + // Step 1: adaptor_1 → spatial_prior → new scales, means + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_1.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_1, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[1], m_y_size[1], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[1], m_y_size[1], m_y_num); + + // y_hat_so_far += y_hat_1 + m_y_hat_so_far.add_(m_y_hat); + + // Step 2: adaptor_2 → spatial_prior → new scales, means + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_2.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_2, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[2], m_y_size[2], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[2], m_y_size[2], m_y_num); + + // y_hat_so_far += y_hat_2 + m_y_hat_so_far.add_(m_y_hat); + + // Step 3: adaptor_3 → spatial_prior → new scales, means + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_3.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + std::tie(m_y_q, m_y_hat, m_s_hat) = process_with_mask_cuda( + y, scales, means, m_mask_3, m_skip_threshold, 0, m_y_q, m_y_hat, m_s_hat); + m_y_q_w = single_part_for_writing_4x_cuda(m_y_q, m_y_q_w); + m_s_w = single_part_for_writing_4x_cuda(m_s_hat, m_s_w); + std::tie(m_y_symbol_prev, m_skip_cond) = build_index_enc_cuda( + m_y_q_w, m_s_w, m_skip_threshold, at::nullopt, 0, m_y_symbol_prev, m_skip_cond); + std::tie(m_y_symbol[3], m_y_size[3], m_y_num) = conditional_index_part1_cuda( + m_y_symbol_prev, m_skip_cond, m_y_symbol[3], m_y_size[3], m_y_num); + + // y_hat_final = (y_hat_so_far + y_hat_3) * q_scale_y_dec + m_y_hat = + add_and_multiply_broadcast_cuda(m_y_hat_so_far, m_y_hat, m_q_scale_y_dec[qp], m_y_hat); + }; + + run(lambda_enc_0, m_gexec_enc_0, m_qp); + // ------------ end of lambda_enc_0 ------------ + + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::Encode; + } + m_cv_pending.notify_one(); + + // ----------- start of lambda_enc_1 ----------- + auto lambda_enc_1 = [&](const int qp) { + m_x_hat = m_decoder.forward(m_y_hat, m_q_scale_dec[qp]); + }; + + run(lambda_enc_1, m_gexec_enc_1, m_qp); + // ------------ end of lambda_enc_1 ------------ + + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (m_result_ready) { + return py::make_tuple(m_entropy_encoder.get_encoded_stream(), m_x_hat, m_entropy_coder_parallel); + } + return py::make_tuple(py::array_t(0), at::Tensor(), 1); +} + +at::Tensor DMCIProxy::decompress(const py::array_t& bit_stream, const int qp, + const int height, const int width, const int entropy_coder_parallel) +{ + pre_allocate_tensors(height, width); + m_result_ready = false; + m_entropy_coder_parallel = entropy_coder_parallel; + py::buffer_info bit_stream_buf = bit_stream.request(); + m_bit_stream = static_cast(bit_stream_buf.ptr); + m_bit_stream_size = static_cast(bit_stream.size()); + m_z_height = (height + 63) / 64; + m_z_width = (width + 63) / 64; + m_qp = qp; + + auto stream = at::cuda::getCurrentCUDAStream(); + + // Signal worker to decode Z + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeZ; + } + m_cv_pending.notify_one(); + + // Wait for Z decode + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + if (!m_result_ready) { + return at::Tensor(); + } + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_z_ready)); + + at::Tensor scales; + at::Tensor means; + + // ----------- start of lambda_dec_0 ----------- + auto lambda_dec_0 = [&]() { + // int8_to_fp16 → hyper_dec → prior_fusion → crop → chunk2 → reduction + m_z_hat = int8_to_dtype_cuda(m_z_hat_io, m_dtype, g_ch_z, m_z_height, m_z_width, m_z_hat); + m_hyper_params = m_hyper_decoder.forward(m_z_hat); + auto params = m_y_prior_fusion.forward(m_hyper_params); + const int yH = (height + 15) / 16; + const int yW = (width + 15) / 16; + params = crop_hyper_params(params, yH, yW, m_cropped_params); + std::tie(scales, means) = chunk_tensors_2(params); + const int sm = get_gpu_sm(); + m_reduced_params = conv1x1_bias(sm, params, m_y_spatial_prior_reduction.weight, + m_y_spatial_prior_reduction.bias, m_reduced_params); + // Step 0: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_0, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_0, m_gexec_dec_0); + // ------------ end of lambda_dec_0 ------------ + + // Step 0: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_1 ----------- + auto lambda_dec_1 = [&]() { + // Step 0: recover + restore + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + m_y_hat_so_far = restore_y_4x_cuda(m_y_q_r, means, m_mask_0, m_y_hat_so_far); + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_1.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + // Step 1: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_1, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_1, m_gexec_dec_1); + // ------------ end of lambda_dec_1 ------------ + + // Step 1: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_2 ----------- + auto lambda_dec_2 = [&]() { + // Step 1: recover + restore + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + restore_y_4x_and_add_inplace_cuda(m_y_q_r, means, m_mask_1, m_y_hat_so_far); + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_2.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + // Step 2: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_2, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_2, m_gexec_dec_2); + // ------------ end of lambda_dec_2 ------------ + + // Step 2: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_3 ----------- + auto lambda_dec_3 = [&]() { + // Step 2: recover + restore + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + restore_y_4x_and_add_inplace_cuda(m_y_q_r, means, m_mask_2, m_y_hat_so_far); + m_spatial_prior_out = m_y_spatial_prior.forward( + m_y_spatial_prior_adaptor_3.forward(m_cat_spatial_prior_adaptor)); + std::tie(scales, means) = chunk_tensors_2(m_spatial_prior_out); + // Step 3: build index + m_y_indexes = + decode_y_step_build_index(scales, m_mask_3, m_y_indexes_skip_cond, m_y_indexes_num); + }; + run(lambda_dec_3, m_gexec_dec_3); + // ------------ end of lambda_dec_3 ------------ + + // Step 3: entropy (worker thread) + CUDA_CHECK(cudaEventRecord(m_event_y, stream)); + { + std::unique_lock lk(m_mutex_pending); + m_pending = true; + m_pending_work = DMCWorkType::DecodeY; + } + m_cv_pending.notify_one(); + { + std::unique_lock lk(m_mutex_result); + m_cv_result.wait(lk, [this] { return m_result_ready || m_finish; }); + m_result_ready = false; + } + CUDA_CHECK(cudaStreamWaitEvent(stream, m_event_y_ready)); + + // ----------- start of lambda_dec_4 ----------- + auto lambda_dec_4 = [&](const int qp) { + // Step 3: recover + restore (QP-dependent due to q_scale_y_dec) + m_y_q_r = conditional_recover_with_type_conversion_cuda(m_y_decoded, m_y_indexes_skip_cond, + m_y_indexes_num, m_dtype, m_y_q_r); + m_y_hat = restore_y_4x_add_and_multiply_broadcast_cuda( + m_y_q_r, means, m_mask_3, m_y_hat_so_far, m_q_scale_y_dec[qp], m_y_hat); + // decoder + m_x_hat = m_decoder.forward(m_y_hat, m_q_scale_dec[qp]); + }; + run(lambda_dec_4, m_gexec_dec_4, m_qp); + // ------------ end of lambda_dec_4 ------------ + + return m_x_hat; +} + +void DMCIProxy::set_param(const std::map& state_dict, const float skip_threshold) +{ + m_device = state_dict.at("q_scale_dec").device(); + m_dtype = state_dict.at("q_scale_dec").scalar_type(); + auto q_scale_enc = state_dict.at("q_scale_enc"); + auto q_scale_dec = state_dict.at("q_scale_dec"); + auto q_scale_y_enc = state_dict.at("q_scale_y_enc"); + auto q_scale_y_dec = state_dict.at("q_scale_y_dec"); + for (int i = 0; i < g_qp_num; i++) { + m_q_scale_enc[i] = q_scale_enc.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_scale_dec[i] = q_scale_dec.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_scale_y_enc[i] = + q_scale_y_enc.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + m_q_scale_y_dec[i] = + q_scale_y_dec.index({ at::indexing::Slice(i, i + 1), at::indexing::Slice(), + at::indexing::None, at::indexing::None }); + } + m_encoder.set_param(get_submodule_state_dict(state_dict, "enc.")); + m_hyper_encoder.set_param(get_submodule_state_dict(state_dict, "hyper_enc.")); + m_hyper_decoder.set_param(get_submodule_state_dict(state_dict, "hyper_dec.")); + m_y_prior_fusion.set_param(get_submodule_state_dict(state_dict, "y_prior_fusion.")); + m_y_spatial_prior_reduction.set_param(state_dict, "y_spatial_prior_reduction."); + m_y_spatial_prior_adaptor_1.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_1.")); + m_y_spatial_prior_adaptor_2.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_2.")); + m_y_spatial_prior_adaptor_3.set_param( + get_submodule_state_dict(state_dict, "y_spatial_prior_adaptor_3.")); + m_y_spatial_prior.set_param(get_submodule_state_dict(state_dict, "y_spatial_prior.")); + m_decoder.set_param(get_submodule_state_dict(state_dict, "dec.")); + + m_skip_threshold = skip_threshold; + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_encoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); + + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("bit_estimator_z.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("bit_estimator_z.cdf_length")), 0); + m_entropy_decoder.set_cdf( + tensor_to_vector_1d(state_dict.at("gaussian_encoder.quantized_cdf")), + tensor_to_vector_1d(state_dict.at("gaussian_encoder.cdf_length")), 1); +} + +void DMCIProxy::clear_cuda_graph() +{ + for (int i = 0; i < g_qp_num; ++i) { + destroy_cuda_graph_exec(m_gexec_enc_0[i]); + destroy_cuda_graph_exec(m_gexec_enc_1[i]); + destroy_cuda_graph_exec(m_gexec_dec_4[i]); + } + destroy_cuda_graph_exec(m_gexec_dec_0); + destroy_cuda_graph_exec(m_gexec_dec_1); + destroy_cuda_graph_exec(m_gexec_dec_2); + destroy_cuda_graph_exec(m_gexec_dec_3); +} + +at::Tensor DMCIProxy::decode_y_step_build_index(const at::Tensor& scales, const at::Tensor& mask, + at::Tensor& skip_cond_out, at::Tensor& indexes_num_out) +{ + m_scales_r = single_part_for_reading_4x_cuda(scales, mask, m_scales_r); + std::tie(m_y_indexes_prev, skip_cond_out) = build_index_dec_cuda( + m_scales_r, m_skip_threshold, at::nullopt, 0, m_y_indexes_prev, skip_cond_out); + std::tie(m_y_indexes, m_y_indexes_size, indexes_num_out) = conditional_index_part1_cuda( + m_y_indexes_prev, skip_cond_out, m_y_indexes, m_y_indexes_size, indexes_num_out); + return m_y_indexes; +} + +std::tuple DMCIProxy::get_mask_4x(const at::Tensor& y) +{ + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + auto m = at::ones({ 1, C / 4, H, W }, y.options().dtype(at::kBool)); + auto m0 = get_one_mask(torch::tensor({ { 1, 0 }, { 0, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m1 = get_one_mask(torch::tensor({ { 0, 1 }, { 0, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m2 = get_one_mask(torch::tensor({ { 0, 0 }, { 1, 0 } }, y.options().dtype(at::kBool)), H, W); + auto m3 = get_one_mask(torch::tensor({ { 0, 0 }, { 0, 1 } }, y.options().dtype(at::kBool)), H, W); + + auto mask_0 = + at::cat({ m * m0, m * m1, m * m2, m * m3 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_1 = + at::cat({ m * m3, m * m2, m * m1, m * m0 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_2 = + at::cat({ m * m2, m * m3, m * m0, m * m1 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + auto mask_3 = + at::cat({ m * m1, m * m0, m * m3, m * m2 }, 1).contiguous(at::MemoryFormat::ChannelsLast); + + return { mask_0, mask_1, mask_2, mask_3 }; +} + +void DMCIProxy::pre_allocate_tensors(const int height, const int width) +{ + int H = height; + int W = width; + H = (H + 16 - 1) / 16 * 16; + W = (W + 16 - 1) / 16 * 16; + const int H8 = H / 8; + const int W8 = W / 8; + if (m_H8 == H8 && m_W8 == W8) { + return; + } + + m_H8 = H8; + m_W8 = W8; + clear_cuda_graph(); + g_tensor_pool.clear(H8, W8); + + auto options = at::TensorOptions().device(m_device).dtype(m_dtype).memory_format( + at::MemoryFormat::ChannelsLast); + const int H16 = H8 / 2; + const int W16 = W8 / 2; + auto [padR, padB] = get_padding_size(H16, W16, 4); + const int H16_pad4 = H16 + padB; + const int W16_pad4 = W16 + padR; + const int H64 = H16_pad4 / 4; + const int W64 = W16_pad4 / 4; + + const std::vector y_shape = { 1, g_ch_y, H16, W16 }; + const std::vector y_pad_shape = { 1, g_ch_y, H16_pad4, W16_pad4 }; + const std::vector z_shape = { 1, g_ch_z, H64, W64 }; + + auto y = at::empty(y_shape, options); + + // pre allocate masks + std::tie(m_mask_0, m_mask_1, m_mask_2, m_mask_3) = get_mask_4x(y); + const int y_quarter_numel = y.numel() / 4; + m_y_decoded = at::empty({ y_quarter_numel }, y.options().dtype(at::kChar)); + m_y_to_decode = std::make_shared>(y_quarter_numel); + for (int i = 0; i < 4; i++) { + m_y_to_encode[i] = std::make_shared>(y_quarter_numel); + } + + // pre allocate concatenated tensor for spatial prior adaptor + m_cat_spatial_prior_adaptor = at::empty({ 1, g_ch_y * 2, H16, W16 }, options); + std::tie(m_y_hat_so_far, m_reduced_params) = + split_tensors_2(m_cat_spatial_prior_adaptor, g_ch_y, g_ch_y); + + // pre allocate other tensors + m_enc_unshuffle_out = at::empty({ 1, g_ch_src, H8, W8 }, options); + m_z_hat = at::empty(z_shape, options.dtype(at::kHalf)); + m_z_hat_io = at::empty(z_shape, options.dtype(at::kChar)); + m_hyper_params = at::empty({ 1, g_ch_y, H16_pad4, W16_pad4 }, options); + m_cropped_params = at::empty({ 1, g_ch_y * 2, H16, W16 }, options); + m_y_q = at::empty_like(y); + m_y_hat = at::empty_like(y); + m_s_hat = at::empty_like(y); + m_y_q_r = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_scales_r = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_spatial_prior_out = at::empty({ 1, g_ch_y * 2, H16, W16 }, options); + + m_y_q_w = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_s_w = at::empty({ 1, g_ch_y / 4, H16, W16 }, options); + m_y_symbol_prev = at::empty({ y_quarter_numel }, y.options().dtype(at::kShort)); + m_skip_cond = at::empty({ y_quarter_numel }, y.options().dtype(at::kBool)); + { + const int block_num = + (y_quarter_numel + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + m_y_num = at::empty({ block_num, COND_KERNEL_THREAD_NUM1 }, y.options().dtype(at::kInt)); + } + for (int i = 0; i < 4; i++) { + m_y_symbol[i] = at::empty({ y_quarter_numel }, y.options().dtype(at::kShort)); + m_y_size[i] = at::empty({ 1 }, y.options().dtype(at::kInt)); + } + + // decompress-only buffers + m_y_indexes = at::empty({ y_quarter_numel }, y.options().dtype(at::kByte)); + m_y_indexes_prev = at::empty_like(m_y_indexes); + m_y_indexes_skip_cond = at::empty({ y_quarter_numel }, y.options().dtype(at::kBool)); + { + const int block_num = + (y_quarter_numel + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + m_y_indexes_size = at::empty({ 1 }, y.options().dtype(at::kInt)); + m_y_indexes_num = + at::empty({ block_num, COND_KERNEL_THREAD_NUM1 }, y.options().dtype(at::kInt)); + } + + // pre allocate sub-module tensors + m_y = m_encoder.pre_allocate_tensors(m_enc_unshuffle_out); + m_y_pad = (padR == 0 && padB == 0) ? m_y : at::empty(y_pad_shape, options); + m_hyper_encoder.pre_allocate_tensors(m_y_pad); + m_hyper_decoder.pre_allocate_tensors(m_z_hat, m_hyper_params); + m_y_prior_fusion.pre_allocate_tensors(m_hyper_params); + // m_cropped_params stays at unpadded size [1, 512, H16, W16] for crop_hyper_params output + auto adaptor_out = + m_y_spatial_prior_adaptor_1.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true); + m_y_spatial_prior_adaptor_2.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true, adaptor_out); + m_y_spatial_prior_adaptor_3.pre_allocate_tensors(m_cat_spatial_prior_adaptor, true, adaptor_out); + m_y_spatial_prior.pre_allocate_tensors(adaptor_out, m_spatial_prior_out); + m_x_hat = m_decoder.pre_allocate_tensors(m_y_hat); +} + +void DMCIProxy::worker() +{ + at::cuda::CUDAStream high_priority_stream = at::cuda::getStreamFromPool(true); + at::cuda::CUDAStreamGuard guard(high_priority_stream); + + while (!m_finish) { + std::unique_lock lk(m_mutex_pending); + m_cv_pending.wait(lk, [this] { return m_pending || m_finish; }); + if (m_finish) { + break; + } + m_pending = false; + lk.unlock(); + + if (m_pending_work == DMCWorkType::Encode) { + m_entropy_encoder.reset(); + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + + // build_index_enc and conditional_index for each of the 4 mask steps + // Process in reverse order (3,2,1,0) to match Python encode order + int total_symbol_count = 0; + for (int i = 3; i >= 0; i--) { + auto out = conditional_index_part2_cuda(m_y_symbol[i], m_y_size[i], m_size_ptr); + m_y_to_encode_size[i] = *m_size_ptr; + total_symbol_count += *m_size_ptr; + CUDA_CHECK(cudaMemcpyAsync(m_y_to_encode[i]->data(), out.data_ptr(), + (*m_size_ptr) * sizeof(int16_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + } + CUDA_CHECK(cudaStreamSynchronize(at::cuda::getCurrentCUDAStream())); + + m_entropy_coder_parallel = compute_ec_parallel(total_symbol_count); + m_entropy_encoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + + // Encode in reverse order (3,2,1,0) to match Python + for (int i = 3; i >= 0; i--) { + m_entropy_encoder.encode_y(m_y_to_encode[i], m_y_to_encode_size[i]); + } + + auto t = tensor_to_vector_1d(m_z_hat_io); + m_entropy_encoder.encode_z(t, m_qp * g_ch_z, g_ch_z); + m_entropy_encoder.flush(); + } else if (m_pending_work == DMCWorkType::DecodeZ) { + m_entropy_decoder.set_entropy_coder_parallel(m_entropy_coder_parallel); + m_entropy_decoder.set_stream(m_bit_stream, m_bit_stream_size); + const int z_num = g_ch_z * m_z_height * m_z_width; + m_entropy_decoder.decode_z(z_num, m_qp * g_ch_z, g_ch_z); + + auto z_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_z_hat_io.data_ptr(), z_cpu->data(), + z_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_z_ready, at::cuda::getCurrentCUDAStream())); + } else if (m_pending_work == DMCWorkType::DecodeY) { + CUDA_CHECK(cudaStreamWaitEvent(at::cuda::getCurrentCUDAStream(), m_event_y)); + auto out = conditional_index_part2_cuda(m_y_indexes, m_y_indexes_size, m_size_ptr); + const int y_num = *m_size_ptr; + CUDA_CHECK(cudaMemcpyAsync(m_y_to_decode->data(), out.data_ptr(), + y_num * sizeof(uint8_t), cudaMemcpyDeviceToHost, + at::cuda::getCurrentCUDAStream())); + + m_entropy_decoder.decode_y(m_y_to_decode, y_num); + + auto y_cpu = m_entropy_decoder.get_decoded_tensor_cpp(); + CUDA_CHECK(cudaMemcpyAsync(m_y_decoded.data_ptr(), y_cpu->data(), + y_num * sizeof(int8_t), cudaMemcpyHostToDevice, + at::cuda::getCurrentCUDAStream())); + CUDA_CHECK(cudaEventRecord(m_event_y_ready, at::cuda::getCurrentCUDAStream())); + } else { + assert(false); + } + + { + std::lock_guard lk_result(m_mutex_result); + m_result_ready = true; + } + m_cv_result.notify_one(); + } +} diff --git a/src/layers/extensions/inference/dmci_proxy.h b/src/layers/extensions/inference/dmci_proxy.h new file mode 100644 index 0000000..8bc12a4 --- /dev/null +++ b/src/layers/extensions/inference/dmci_proxy.h @@ -0,0 +1,254 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include "dmc_common.h" +#include "layers_proxy.h" + +class DMCIDecoderProxy { +public: + DMCIDecoderProxy() = default; + ~DMCIDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + ResidualBlockUpsampleProxy m_up; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + DepthConvBlockProxy m_conv3; + DepthConvBlockProxy m_conv4; + DepthConvBlockProxy m_conv5; + DepthConvBlockProxy m_conv6; + DepthConvBlockProxy m_conv7; + DepthConvBlockProxy m_conv8; + DepthConvBlockProxy m_conv9; + DepthConvBlockProxy m_conv10; + DepthConvBlockProxy m_conv11; + DepthConvBlockProxy m_conv12; + DepthConvBlockProxy m_dec_2; + + // for cuda graph + at::Tensor m_shuffle_out; +}; + +class DMCIEncoderProxy { +public: + DMCIEncoderProxy() = default; + ~DMCIEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::Tensor& quant); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_enc_1; + DepthConvBlockProxy m_enc_2_0; + DepthConvBlockProxy m_enc_2_1; + DepthConvBlockProxy m_enc_2_2; + DepthConvBlockProxy m_enc_2_3; + DepthConvBlockProxy m_enc_2_4; + DepthConvBlockProxy m_enc_2_5; + at::Tensor m_down_weight; + at::Tensor m_down_bias; + + // for cuda graph + at::Tensor m_down_out; +}; + +class DMCIHyperDecoderProxy { +public: + DMCIHyperDecoderProxy() = default; + ~DMCIHyperDecoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + ResidualBlockUpsampleProxy m_conv0; + ResidualBlockUpsampleProxy m_conv1; + DepthConvBlockProxy m_conv2; +}; + +class DMCIHyperEncoderProxy { +public: + DMCIHyperEncoderProxy() = default; + ~DMCIHyperEncoderProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + ResidualBlockWithStride2Proxy m_conv1; + ResidualBlockWithStride2Proxy m_conv2; +}; + +class DMCISpatialPriorProxy { +public: + DMCISpatialPriorProxy() = default; + ~DMCISpatialPriorProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, const at::Tensor& out_buf); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graph + at::Tensor m_conv3_out; +}; + +class DMCIYPriorFusionProxy { +public: + DMCIYPriorFusionProxy() = default; + ~DMCIYPriorFusionProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void set_param(const std::map& state_dict); + +private: + DepthConvBlockProxy m_conv0; + DepthConvBlockProxy m_conv1; + DepthConvBlockProxy m_conv2; + at::Tensor m_conv3_weight; + at::Tensor m_conv3_bias; + + // for cuda graph + at::Tensor m_conv3_out; +}; + +class DMCIProxy : public DMCCommon { +public: + static constexpr int g_ch_src = 3 * 8 * 8; + static constexpr int g_ch_enc_dec = 384; + static constexpr int g_ch_y = 256; + static constexpr int g_ch_z = 128; + + DMCIProxy(); + ~DMCIProxy(); + + py::tuple compress(const at::Tensor& x, const int qp, const int padding_b, const int padding_r); + at::Tensor decompress(const py::array_t& bit_stream, const int qp, const int height, + const int width, const int entropy_coder_parallel); + void set_param(const std::map& state_dict, const float skip_threshold); + +private: + // cuda graph related + void clear_cuda_graph(); + + at::Tensor decode_y_step_build_index(const at::Tensor& scales, const at::Tensor& mask, + at::Tensor& skip_cond_out, at::Tensor& indexes_num_out); + + // helper functions + std::tuple get_mask_4x(const at::Tensor& y); + + void pre_allocate_tensors(const int height, const int width); + + void worker(); + +private: + at::Tensor m_q_scale_enc[g_qp_num]; + at::Tensor m_q_scale_dec[g_qp_num]; + at::Tensor m_q_scale_y_enc[g_qp_num]; + at::Tensor m_q_scale_y_dec[g_qp_num]; + + DMCIEncoderProxy m_encoder; + DMCIHyperEncoderProxy m_hyper_encoder; + DMCIHyperDecoderProxy m_hyper_decoder; + DMCIYPriorFusionProxy m_y_prior_fusion; + ConvParam m_y_spatial_prior_reduction; + DepthConvBlockProxy m_y_spatial_prior_adaptor_1; + DepthConvBlockProxy m_y_spatial_prior_adaptor_2; + DepthConvBlockProxy m_y_spatial_prior_adaptor_3; + DMCISpatialPriorProxy m_y_spatial_prior; + DMCIDecoderProxy m_decoder; + + float m_skip_threshold{ 0.f }; + + bool m_finish{ false }; + bool m_result_ready{ false }; + std::thread m_thread; + std::mutex m_mutex_result; + std::mutex m_mutex_pending; + std::condition_variable m_cv_pending; + std::condition_variable m_cv_result; + bool m_pending{ false }; + DMCWorkType m_pending_work; + + uint8_t* m_bit_stream{ nullptr }; + int m_bit_stream_size{ 0 }; + int m_z_width{ 0 }; + int m_z_height{ 0 }; + + cudaEvent_t m_event_y; + cudaEvent_t m_event_z_ready; + cudaEvent_t m_event_y_ready; + int* m_size_ptr{ nullptr }; + + int m_qp{ 0 }; + std::shared_ptr> m_y_to_encode[4]{ nullptr }; + std::shared_ptr> m_y_to_decode{ nullptr }; + int m_y_to_encode_size[4]{ 0 }; + + at::ScalarType m_dtype; + at::Device m_device{ at::kCUDA }; + + // for cuda graph + int m_H8{ 0 }; + int m_W8{ 0 }; + cudaGraphExec_t m_gexec_enc_0[g_qp_num]{ nullptr }; + cudaGraphExec_t m_gexec_enc_1[g_qp_num]{ nullptr }; + cudaGraphExec_t m_gexec_dec_0{ nullptr }; + cudaGraphExec_t m_gexec_dec_1{ nullptr }; + cudaGraphExec_t m_gexec_dec_2{ nullptr }; + cudaGraphExec_t m_gexec_dec_3{ nullptr }; + cudaGraphExec_t m_gexec_dec_4[g_qp_num]{ nullptr }; + at::Tensor m_mask_0; + at::Tensor m_mask_1; + at::Tensor m_mask_2; + at::Tensor m_mask_3; + at::Tensor m_enc_unshuffle_out; + at::Tensor m_y; + at::Tensor m_y_pad; + at::Tensor m_z_hat; + at::Tensor m_z_hat_io; + at::Tensor m_hyper_params; + at::Tensor m_cropped_params; + at::Tensor m_y_q; + at::Tensor m_y_hat; + at::Tensor m_s_hat; + at::Tensor m_reduced_params; + at::Tensor m_y_q_w; + at::Tensor m_s_w; + at::Tensor m_y_symbol[4]; + at::Tensor m_y_symbol_prev; + at::Tensor m_skip_cond; + at::Tensor m_y_size[4]; + at::Tensor m_y_num; + at::Tensor m_x_hat; + at::Tensor m_y_q_r; + at::Tensor m_scales_r; + at::Tensor m_y_decoded; + at::Tensor m_y_indexes; + at::Tensor m_y_indexes_prev; + at::Tensor m_y_indexes_skip_cond; + at::Tensor m_y_indexes_size; + at::Tensor m_y_indexes_num; + at::Tensor m_spatial_prior_out; + + // concatenated tensor for spatial prior adaptor input + at::Tensor m_cat_spatial_prior_adaptor; + at::Tensor m_y_hat_so_far; // view into m_cat_spatial_prior_adaptor +}; diff --git a/src/layers/extensions/inference/elementwise/cat_and_pad.cu b/src/layers/extensions/inference/elementwise/cat_and_pad.cu new file mode 100644 index 0000000..f2cf456 --- /dev/null +++ b/src/layers/extensions/inference/elementwise/cat_and_pad.cu @@ -0,0 +1,110 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "../common_cu.h" +#include "../def_elementwise.h" + +__global__ void pad_and_unshuffle_8_kernel(GPUTensor4D out, const GPUTensor4D x, + const int padB, const int padR, const CudaCHW chw) +{ + // C, H, and W are the shape of output tensor + const auto [c, h, w] = global_idx_chw(); + const int originalH = chw.H * 8 - padB; + const int originalW = chw.W * 8 - padR; + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + const int src_c0 = c0 / (8 * 8); + const int src_c1 = c1 / (8 * 8); + int src_h0 = h * 8 + (c0 % (8 * 8)) / 8; + int src_h1 = h * 8 + (c1 % (8 * 8)) / 8; + int src_w0 = w * 8 + (c0 % (8 * 8)) % 8; + int src_w1 = w * 8 + (c1 % (8 * 8)) % 8; + src_h0 = min(src_h0, originalH - 1); + src_h1 = min(src_h1, originalH - 1); + src_w0 = min(src_w0, originalW - 1); + src_w1 = min(src_w1, originalW - 1); + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + store2(&out[0][c0][h][w], x[0][src_c0][src_h0][src_w0], x[0][src_c1][src_h1][src_w1]); + } +} + +at::Tensor pad_and_unshuffle_8_cuda(const at::Tensor& x, const int padB, const int padR, + at::Tensor& out_buf) +{ + const at::IntArrayRef x_shape = x.sizes(); + const int C = x_shape[1] * 8 * 8; + const int H = (x_shape[2] + padB) / 8; + const int W = (x_shape[3] + padR) / 8; + cudaLaunchConfig_t config; + CudaCHW chw; + if (C == 3 * 8 * 8) { + std::tie(config, chw) = get_kernel_config_4D<2, 16, 4, 4>(C, H, W); + } else { + std::tie(config, chw) = get_kernel_config_4D<2, 256, 1, 1>(C, H, W); + } + + cudaLaunchKernelEx(&config, &pad_and_unshuffle_8_kernel, out_buf, x, padB, padR, chw); + + return out_buf; +} + +__global__ void replicate_pad_kernel(GPUTensor4D out, const GPUTensor4D x, + const int padB, const int padR, const CudaCHW chw) +{ + // C, H, and W are the shape of output tensor + const auto [c, h, w] = global_idx_chw(); + const int originalH = chw.H - padB; + const int originalW = chw.W - padR; + const int src_h = min(h, originalH - 1); + const int src_w = min(w, originalW - 1); + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + out[0][c][h][w] = x[0][c][src_h][src_w]; + } +} + +at::Tensor replicate_pad_cuda(const at::Tensor& x, const int padB, const int padR, at::Tensor& out_buf) +{ + const at::IntArrayRef x_shape = x.sizes(); + const int C = x_shape[1]; + const int H = x_shape[2] + padB; + const int W = x_shape[3] + padR; + if (C <= 4) { + auto [config, chw] = get_kernel_config_4D<1, 4, 16, 16>(C, H, W); + + cudaLaunchKernelEx(&config, &replicate_pad_kernel, out_buf, x, padB, padR, chw); + } else { + auto [config, chw] = get_kernel_config_4D<1>(C, H, W); + + cudaLaunchKernelEx(&config, &replicate_pad_kernel, out_buf, x, padB, padR, chw); + } + return out_buf; +} + +__global__ void slice_kernel(GPUTensor4D out, const GPUTensor4D x, const CudaCHW chw) +{ + // C, H, and W are the shape of output tensor + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _x0; + at::Half _x1; + load2(&x[0][c0][h][w], _x0, _x1); + store2(&out[0][c0][h][w], _x0, _x1); + } +} + +at::Tensor slice_cuda(const at::Tensor& x, const int H, const int W, at::Tensor& out_buf) +{ + const int C = x.size(1); + auto [config, chw] = get_kernel_config_4D<2>(C, H, W); + + cudaLaunchKernelEx(&config, &slice_kernel, out_buf, x, chw); + return out_buf; +} diff --git a/src/layers/extensions/inference/elementwise/shuffle.cu b/src/layers/extensions/inference/elementwise/shuffle.cu new file mode 100644 index 0000000..1c642e5 --- /dev/null +++ b/src/layers/extensions/inference/elementwise/shuffle.cu @@ -0,0 +1,185 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "../common_cu.h" +#include "../def_elementwise.h" + +__global__ void pixel_shuffle_2_kernel(GPUTensor4D out, const GPUTensor4D x, + const CudaCHW chw) +{ + // C, H, and W are the shape of out tensor + const auto [c, h, w] = global_idx_chw(); + const int src_c = c * 2 * 2 + (h % 2) * 2 + (w % 2); + const int src_h = h / 2; + const int src_w = w / 2; + cudaGDC(); + + if (c < chw.C && w < chw.W && h < chw.H) { + out[0][c][h][w] = x[0][src_c][src_h][src_w]; + } +} + +__forceinline__ void pixel_shuffle_2_dispatcher(at::Tensor& out, const at::Tensor& x, const int C, + const int H, const int W) +{ + auto [config, chw] = get_kernel_config_4D<1, 4, 8, 8>(C, H, W); + cudaLaunchKernelEx(&config, &pixel_shuffle_2_kernel, out, x, chw); +} + +at::Tensor pixel_shuffle_2_cuda(const at::Tensor& x, at::Tensor& out_buf) +{ + const at::IntArrayRef x_shape = x.sizes(); + const int B = x_shape[0]; + const int C = x_shape[1] / 4; + const int H = x_shape[2] * 2; + const int W = x_shape[3] * 2; + pixel_shuffle_2_dispatcher(out_buf, x, C, H, W); + return out_buf; +} + +template +__global__ void pixel_shuffle_8_kernel(GPUTensor4D out, const GPUTensor4D x, + const CudaCHW chw) +{ + // C, H, and W are the shape of out tensor + const auto [c, h, w] = global_idx_chw(); + const int src_c = c * 8 * 8 + (h % 8) * 8 + (w % 8); + const int src_h = h / 8; + const int src_w = w / 8; + cudaGDC(); + + if (c < chw.C && w < chw.W && h < chw.H) { + at::Half _out = x[0][src_c][src_h][src_w]; + if constexpr (clamp) { + _out = max(_out, static_cast(-0.5f)); + _out = min(_out, static_cast(0.5f)); + } + out[0][c][h][w] = _out; + } +} + +__forceinline__ void pixel_shuffle_8_dispatcher(at::Tensor& out, const at::Tensor& x, const int C, + const int H, const int W, bool clamp) +{ + auto [config, chw] = get_kernel_config_4D<1, 4, 8, 8>(C, H, W); + + if (clamp) { + cudaLaunchKernelEx(&config, &pixel_shuffle_8_kernel, out, x, chw); + } else { + cudaLaunchKernelEx(&config, &pixel_shuffle_8_kernel, out, x, chw); + } +} + +template +__global__ void pixel_shuffle_8_out_3_kernel(GPUTensor4D out, + const GPUTensor4D x, const CudaCHW chw) +{ + // C, H, and W are the shape of out tensor + const auto [c, h, w] = global_idx_chw(); + const int c0 = c + 0; + const int c1 = c + 1; + const int c2 = c + 2; + const int src_c0 = c0 * 8 * 8 + (h % 8) * 8 + (w % 8); + const int src_c1 = c1 * 8 * 8 + (h % 8) * 8 + (w % 8); + const int src_c2 = c2 * 8 * 8 + (h % 8) * 8 + (w % 8); + const int src_h = h / 8; + const int src_w = w / 8; + cudaGDC(); + + if (c < chw.C && w < chw.W && h < chw.H) { + at::Half _out0 = x[0][src_c0][src_h][src_w]; + at::Half _out1 = x[0][src_c1][src_h][src_w]; + at::Half _out2 = x[0][src_c2][src_h][src_w]; + if constexpr (clamp) { + _out0 = max(_out0, static_cast(-0.5f)); + _out0 = min(_out0, static_cast(0.5f)); + _out1 = max(_out1, static_cast(-0.5f)); + _out1 = min(_out1, static_cast(0.5f)); + _out2 = max(_out2, static_cast(-0.5f)); + _out2 = min(_out2, static_cast(0.5f)); + } + out[0][c0][h][w] = _out0; + out[0][c1][h][w] = _out1; + out[0][c2][h][w] = _out2; + } +} + +__forceinline__ void pixel_shuffle_8_out_3_dispatcher(at::Tensor& out, const at::Tensor& x, + const int C, const int H, const int W, bool clamp) +{ + auto [config, chw] = get_kernel_config_4D<1, 1, 16, 16>(C, H, W); + + if (clamp) { + cudaLaunchKernelEx(&config, &pixel_shuffle_8_out_3_kernel, out, x, chw); + } else { + cudaLaunchKernelEx(&config, &pixel_shuffle_8_out_3_kernel, out, x, chw); + } +} + +at::Tensor pixel_shuffle_8_cuda(const at::Tensor& x, bool clamp, at::Tensor& out_buf) +{ + const at::IntArrayRef x_shape = x.sizes(); + const int B = x_shape[0]; + const int C = x_shape[1] / 64; + const int H = x_shape[2] * 8; + const int W = x_shape[3] * 8; + if (C == 3) { + pixel_shuffle_8_out_3_dispatcher(out_buf, x, C / 3, H, W, clamp); + } else { + pixel_shuffle_8_dispatcher(out_buf, x, C, H, W, clamp); + } + return out_buf; +} + +template +__global__ void pixel_unshuffle_kernel(GPUTensor4D out, const GPUTensor4D x, + const CudaCHW chw) +{ + // C, H, and W are the shape of output tensor + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + const int src_c0 = c0 / (downscale_factor * downscale_factor); + const int src_c1 = c1 / (downscale_factor * downscale_factor); + const int src_h0 = + h * downscale_factor + (c0 % (downscale_factor * downscale_factor)) / downscale_factor; + const int src_h1 = + h * downscale_factor + (c1 % (downscale_factor * downscale_factor)) / downscale_factor; + const int src_w0 = + w * downscale_factor + (c0 % (downscale_factor * downscale_factor)) % downscale_factor; + const int src_w1 = + w * downscale_factor + (c1 % (downscale_factor * downscale_factor)) % downscale_factor; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + store2(&out[0][c0][h][w], x[0][src_c0][src_h0][src_w0], x[0][src_c1][src_h1][src_w1]); + } +} + +__forceinline__ void pixel_unshuffle_dispatcher(at::Tensor& out, const at::Tensor& x, + const int downscale_factor, const int C, + const int H, const int W) +{ + // good shape for 8x unshuffle, but may not be optimal for others + auto [config, chw] = get_kernel_config_4D<1, 16, 4, 4>(C, H, W); + + if (downscale_factor == 2) { + cudaLaunchKernelEx(&config, &pixel_unshuffle_kernel<2>, out, x, chw); + } else if (downscale_factor == 4) { + cudaLaunchKernelEx(&config, &pixel_unshuffle_kernel<4>, out, x, chw); + } else if (downscale_factor == 8) { + cudaLaunchKernelEx(&config, &pixel_unshuffle_kernel<8>, out, x, chw); + } else { + assert(false); + } +} + +at::Tensor pixel_unshuffle_cuda(const at::Tensor& x, const int downscale_factor, at::Tensor& out_buf) +{ + const at::IntArrayRef x_shape = x.sizes(); + const int C = x_shape[1] * downscale_factor * downscale_factor; + const int H = x_shape[2] / downscale_factor; + const int W = x_shape[3] / downscale_factor; + pixel_unshuffle_dispatcher(out_buf, x, downscale_factor, C / 2, H, W); + return out_buf; +} diff --git a/src/layers/extensions/inference/elementwise/stream.cu b/src/layers/extensions/inference/elementwise/stream.cu new file mode 100644 index 0000000..e47f352 --- /dev/null +++ b/src/layers/extensions/inference/elementwise/stream.cu @@ -0,0 +1,962 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "../common_cu.h" +#include "../cuda_check.h" +#include "../def_elementwise.h" + +__global__ void add_and_multiply_broadcast_kernel(GPUTensor4D out, + const GPUTensor4D x0, + const GPUTensor4D x1, + const GPUTensor1D q, const CudaCHW chw) +{ + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _x0_0; + at::Half _x0_1; + load2(&x0[0][c0][h][w], _x0_0, _x0_1); + at::Half _x1_0; + at::Half _x1_1; + load2(&x1[0][c0][h][w], _x1_0, _x1_1); + at::Half _q_0 = q[c0]; + at::Half _q_1 = q[c1]; + store2(&out[0][c0][h][w], (_x0_0 + _x1_0) * _q_0, (_x0_1 + _x1_1) * _q_1); + } +} + +at::Tensor add_and_multiply_broadcast_cuda(const at::Tensor& x0, const at::Tensor& x1, + const at::Tensor& q, at::Tensor& out_buf) +{ + auto [config, chw] = get_kernel_config_4D<2>(x0); + + cudaLaunchKernelEx(&config, &add_and_multiply_broadcast_kernel, out_buf, x0, x1, q, chw); + return out_buf; +} + +__global__ void add_and_multiply_with_clamp_min_inplace_kernel(GPUTensor4D x0, + const GPUTensor4D x1, + const GPUTensor4D q, + const CudaCHW chw) +{ + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _x0_0; + at::Half _x0_1; + load2(&x0[0][c0][h][w], _x0_0, _x0_1); + at::Half _x1_0; + at::Half _x1_1; + load2(&x1[0][c0][h][w], _x1_0, _x1_1); + at::Half _q_0; + at::Half _q_1; + load2(&q[0][c0][h][w], _q_0, _q_1); + _q_0 = max(_q_0, static_cast(0.5f)); + _q_1 = max(_q_1, static_cast(0.5f)); + _x0_0 = (_x0_0 + _x1_0) * _q_0; + _x0_1 = (_x0_1 + _x1_1) * _q_1; + store2(&x0[0][c0][h][w], _x0_0, _x0_1); + } +} + +at::Tensor add_and_multiply_with_clamp_min_inplace_cuda(at::Tensor& x0, const at::Tensor& x1, + const at::Tensor& q) +{ + auto [config, chw] = get_kernel_config_4D<2>(x0); + + cudaLaunchKernelEx(&config, &add_and_multiply_with_clamp_min_inplace_kernel, x0, x1, q, chw); + return x0; +} + +__forceinline__ __device__ at::Half scale_to_index(at::Half scale, const at::Half scale_min, + const at::Half scale_max, + const at::Half log_scale_min, + const at::Half log_step_recip) +{ + scale = max(scale, scale_min); + scale = min(scale, scale_max); + scale = log(scale) - log_scale_min; + scale = scale * log_step_recip; + return scale; +} + +__global__ void build_index_dec_kernel(GPUTensor1D out, GPUTensor1D cond_out, + const GPUTensor4D scales, + const at::Half skip_thres_half, const CudaCHW chw) +{ + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + const int n0 = (h * chw.W * chw.C + w * chw.C + c) * 2 + 0; + const int n1 = (h * chw.W * chw.C + w * chw.C + c) * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _scale0; + at::Half _scale1; + load2(&scales[0][c0][h][w], _scale0, _scale1); + at::Half _index0 = + scale_to_index(_scale0, SCALE_MIN, SCALE_MAX, LOG_SCALE_MIN, LOG_SCALE_STEP_RECIP); + at::Half _index1 = + scale_to_index(_scale1, SCALE_MIN, SCALE_MAX, LOG_SCALE_MIN, LOG_SCALE_STEP_RECIP); + uint8_t _out0 = to_uint8(_index0); + uint8_t _out1 = to_uint8(_index1); + store2(&out[n0], _out0, _out1); + bool _cond0 = _scale0 > skip_thres_half; + bool _cond1 = _scale1 > skip_thres_half; + store2(&cond_out[n0], _cond0, _cond1); + } +} + +std::tuple build_index_dec_cuda(const at::Tensor& scales, + const float skip_thres_float, + const at::optional& fx, + const int32_t skip_thres_int, + at::Tensor& out_buf, at::Tensor& cond_out_buf) +{ + auto [config, chw] = get_kernel_config_4D<2>(scales); + assert(scales.scalar_type() == at::kHalf); + cudaLaunchKernelEx(&config, &build_index_dec_kernel, out_buf, cond_out_buf, scales, + skip_thres_float, chw); + return { out_buf, cond_out_buf }; +} + +__global__ void build_index_enc_kernel(GPUTensor1D out, GPUTensor1D cond_out, + const GPUTensor4D symbols, + const GPUTensor4D scales, + const at::Half skip_thres_half, const CudaCHW chw) +{ + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + const int n0 = (h * chw.W * chw.C + w * chw.C + c) * 2 + 0; + const int n1 = (h * chw.W * chw.C + w * chw.C + c) * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _scale0; + at::Half _scale1; + load2(&scales[0][c0][h][w], _scale0, _scale1); + at::Half _symbol0; + at::Half _symbol1; + load2(&symbols[0][c0][h][w], _symbol0, _symbol1); + at::Half _index0 = + scale_to_index(_scale0, SCALE_MIN, SCALE_MAX, LOG_SCALE_MIN, LOG_SCALE_STEP_RECIP); + at::Half _index1 = + scale_to_index(_scale1, SCALE_MIN, SCALE_MAX, LOG_SCALE_MIN, LOG_SCALE_STEP_RECIP); + + int16_t _out0 = (to_int16(_symbol0) << 8) + to_int16(_index0); + int16_t _out1 = (to_int16(_symbol1) << 8) + to_int16(_index1); + store2(&out[n0], _out0, _out1); + bool _cond0 = _scale0 > skip_thres_half; + bool _cond1 = _scale1 > skip_thres_half; + store2(&cond_out[n0], _cond0, _cond1); + } +} + +std::tuple +build_index_enc_cuda(const at::Tensor& symbols, const at::Tensor& scales, + const float skip_thres_float, const at::optional& fx, + const int32_t skip_thres_int, at::Tensor& out_buf, at::Tensor& cond_out_buf) +{ + auto [config, chw] = get_kernel_config_4D<2>(scales); + assert(scales.scalar_type() == at::kHalf); + cudaLaunchKernelEx(&config, &build_index_enc_kernel, out_buf, cond_out_buf, symbols, scales, + skip_thres_float, chw); + return { out_buf, cond_out_buf }; +} + +template +__global__ void conditional_index_step1_kernel(GPUTensor2D num, const GPUTensor1D m, + const int N) +{ + __shared__ int s_sum[THREAD_NUM1]; + const int tidx = threadIdx.x; + const int bidx = blockIdx.x; + + const int start_idx = PER_THREAD_NUM * (bidx * THREAD_NUM1 + tidx); + const int end_idx = min(start_idx + PER_THREAD_NUM, N); + cudaGDC(); + + int s = 0; + for (int i = start_idx; i < end_idx; i++) { + if (m[i]) { + s++; + } + } + s_sum[tidx] = s; + __syncthreads(); + + // calculate prefix sum + int curr_group_size_log2 = 1; + int curr_group_size = 1 << curr_group_size_log2; + while (curr_group_size <= THREAD_NUM1) { + if (tidx < THREAD_NUM1 / 2) { + const int half_group_size_log2 = curr_group_size_log2 - 1; + const int half_group_size = 1 << half_group_size_log2; + const int start_idx = tidx >> half_group_size_log2 << curr_group_size_log2; + const int src_idx = start_idx + (half_group_size - 1); + const int dst_idx = + start_idx + half_group_size + (tidx & ((1 << half_group_size_log2) - 1)); + s_sum[dst_idx] += s_sum[src_idx]; + } + + curr_group_size_log2++; + curr_group_size <<= 1; + __syncthreads(); + } + + num[bidx][tidx] = s_sum[tidx]; +} + +template +__global__ void conditional_index_step2_kernel(GPUTensor2D num, GPUTensor1D total_num, + const int N1) +{ + __shared__ int s_sum[THREAD_NUM2]; + const int tidx = threadIdx.x; + cudaGDC(); + + if (tidx < N1) { + s_sum[tidx] = num[tidx][THREAD_NUM1 - 1]; + } else { + s_sum[tidx] = 0; + } + __syncthreads(); + + // calculate prefix sum + int curr_group_size_log2 = 1; + int curr_group_size = 1 << curr_group_size_log2; + while (curr_group_size <= THREAD_NUM2) { + if (tidx < THREAD_NUM2 / 2) { + const int half_group_size_log2 = curr_group_size_log2 - 1; + const int half_group_size = 1 << half_group_size_log2; + const int start_idx = tidx >> half_group_size_log2 << curr_group_size_log2; + const int src_idx = start_idx + (half_group_size - 1); + const int dst_idx = + start_idx + half_group_size + (tidx & ((1 << half_group_size_log2) - 1)); + s_sum[dst_idx] += s_sum[src_idx]; + } + + curr_group_size_log2++; + curr_group_size <<= 1; + __syncthreads(); + } + + if (tidx < N1) { + num[tidx][THREAD_NUM1 - 1] = s_sum[tidx]; + } + + if (tidx == 0) { + total_num[0] = s_sum[THREAD_NUM2 - 1]; + } +} + +template +__global__ void conditional_index_step3_kernel(GPUTensor1D out, const GPUTensor2D num, + const GPUTensor1D x, const GPUTensor1D m, + const int N) +{ + const int tidx = threadIdx.x; + const int bidx = blockIdx.x; + + const int start_idx = PER_THREAD_NUM * (bidx * THREAD_NUM1 + tidx); + const int end_idx = min(start_idx + PER_THREAD_NUM, N); + cudaGDC(); + + // set according to prefix sum + int curr_dst_idx = tidx > 0 ? num[bidx][tidx - 1] : 0; + curr_dst_idx += (bidx > 0 ? num[bidx - 1][THREAD_NUM1 - 1] : 0); + for (int i = start_idx; i < end_idx; i++) { + if (m[i]) { + out[curr_dst_idx] = x[i]; + curr_dst_idx++; + } + } +} + +std::tuple +conditional_index_part1_cuda(const at::Tensor& x, const at::Tensor& m, at::Tensor& out_buf, + at::Tensor& total_num_buf, at::Tensor& num_buf) +{ + const int N = x.numel(); + const int block_num = (N + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + assert(block_num <= COND_KERNEL_THREAD_NUM2); + + static_assert(COND_KERNEL_THREAD_NUM1 == 1024 || COND_KERNEL_THREAD_NUM1 == 512 + || COND_KERNEL_THREAD_NUM1 == 256 || COND_KERNEL_THREAD_NUM1 == 128); + + cudaLaunchConfig_t config1; + config1.gridDim = block_num; + config1.blockDim = COND_KERNEL_THREAD_NUM1; + config1.dynamicSmemBytes = 0; + config1.stream = at::cuda::getCurrentCUDAStream(); + auto attr = get_cuda_launch_attribute(); + config1.attrs = &attr; + config1.numAttrs = 1; + + cudaLaunchConfig_t config2; + config2.gridDim = 1; + config2.blockDim = COND_KERNEL_THREAD_NUM2; + config2.dynamicSmemBytes = 0; + config2.stream = at::cuda::getCurrentCUDAStream(); + config2.attrs = &attr; + config2.numAttrs = 1; + + cudaLaunchKernelEx( + &config1, &conditional_index_step1_kernel, + num_buf, m, N); + cudaLaunchKernelEx( + &config2, &conditional_index_step2_kernel, + num_buf, total_num_buf, block_num); + + if (x.dtype() == at::kShort) { + cudaLaunchKernelEx( + &config1, + &conditional_index_step3_kernel, + out_buf, num_buf, x, m, N); + } else if (x.dtype() == at::kByte) { + cudaLaunchKernelEx( + &config1, + &conditional_index_step3_kernel, + out_buf, num_buf, x, m, N); + } else if (x.dtype() == at::kChar) { + cudaLaunchKernelEx( + &config1, + &conditional_index_step3_kernel, + out_buf, num_buf, x, m, N); + } else { + assert(false); + } + + return { out_buf, total_num_buf, num_buf }; +} + +at::Tensor conditional_index_part2_cuda(const at::Tensor& x, const at::Tensor& s, int* size_ptr) +{ + auto stream = at::cuda::getCurrentCUDAStream(); + if (size_ptr == nullptr) { + int s_cpu; + CUDA_CHECK(cudaMemcpyAsync(&s_cpu, s.data_ptr(), sizeof(int), cudaMemcpyDeviceToHost, + stream)); + CUDA_CHECK(cudaStreamSynchronize(stream)); + auto out = x.slice(0, 0, s_cpu); + return out; + } + CUDA_CHECK(cudaMemcpyAsync(size_ptr, s.data_ptr(), sizeof(int), cudaMemcpyDeviceToHost, stream)); + CUDA_CHECK(cudaStreamSynchronize(stream)); + auto out = x.slice(0, 0, *size_ptr); + return out; +} + +template +__global__ void conditional_recover_with_type_conversion_kernel(GPUTensor1D out, + const GPUTensor2D num, + const GPUTensor1D x, + const GPUTensor1D m, const int N) +{ + const int tidx = threadIdx.x; + const int bidx = blockIdx.x; + + const int start_idx = PER_THREAD_NUM * (bidx * THREAD_NUM1 + tidx); + const int end_idx = min(start_idx + PER_THREAD_NUM, N); + cudaGDC(); + + // set according to prefix sum + int curr_src_idx = tidx > 0 ? num[bidx][tidx - 1] : 0; + curr_src_idx += (bidx > 0 ? num[bidx - 1][THREAD_NUM1 - 1] : 0); + for (int i = start_idx; i < end_idx; i++) { + if (m[i]) { + out[i] = static_cast(x[curr_src_idx]); + curr_src_idx++; + } else { + out[i] = static_cast(0); + } + } +} + +at::Tensor conditional_recover_with_type_conversion_cuda(const at::Tensor& x, const at::Tensor& m, + const at::Tensor& num, + const at::ScalarType dtype, at::Tensor& out_buf) +{ + assert(x.dtype() == at::kChar); + const int N = m.numel(); + const int block_num = (N + COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM - 1) + / (COND_KERNEL_THREAD_NUM1 * COND_KERNEL_PER_THREAD_NUM); + static_assert(COND_KERNEL_THREAD_NUM1 == 1024 || COND_KERNEL_THREAD_NUM1 == 512 + || COND_KERNEL_THREAD_NUM1 == 256 || COND_KERNEL_THREAD_NUM1 == 128); + + cudaLaunchConfig_t config1; + config1.gridDim = block_num; + config1.blockDim = COND_KERNEL_THREAD_NUM1; + config1.dynamicSmemBytes = 0; + config1.stream = at::cuda::getCurrentCUDAStream(); + auto attr = get_cuda_launch_attribute(); + config1.attrs = &attr; + config1.numAttrs = 1; + + if (dtype == at::kHalf) { + cudaLaunchKernelEx( + &config1, + &conditional_recover_with_type_conversion_kernel, + out_buf, num, x, m, N); + } else if (dtype == at::kChar) { + cudaLaunchKernelEx( + &config1, + &conditional_recover_with_type_conversion_kernel, + out_buf, num, x, m, N); + } else { + assert(false); + } + + return out_buf; +} + +__global__ void divide_with_clamp_inplace_kernel(GPUTensor4D y, + const GPUTensor4D q, const CudaCHW chw) +{ + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _y0; + at::Half _y1; + load2(&y[0][c0][h][w], _y0, _y1); + at::Half _q0; + at::Half _q1; + load2(&q[0][c0][h][w], _q0, _q1); + _q0 = max(_q0, static_cast(0.5f)); + _q1 = max(_q1, static_cast(0.5f)); + _y0 = _y0 * reciprocal(_q0); + _y1 = _y1 * reciprocal(_q1); + store2(&y[0][c0][h][w], _y0, _y1); + } +} + +at::Tensor divide_with_clamp_min_inplace_cuda(at::Tensor& y, const at::Tensor& q) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + + cudaLaunchKernelEx(&config, ÷_with_clamp_inplace_kernel, y, q, chw); + + return y; +} + +template +__global__ void int8_to_dtype_kernel(GPUTensor1D out, const GPUTensor1D x, const int N) +{ + const int n = blockIdx.x * blockDim.x + threadIdx.x; + const int n0 = n * 2 + 0; + const int n1 = n * 2 + 1; + cudaGDC(); + + if (n < N) { + int8_t _x0 = x[n0]; + int8_t _x1 = x[n1]; + store2(&out[n0], static_cast(_x0), static_cast(_x1)); + } +} + +at::Tensor int8_to_dtype_cuda(const at::Tensor& x, const at::ScalarType dtype, const int C, + const int H, const int W, at::Tensor& out_buf) +{ + auto [config, N] = get_kernel_config_1D<2>(x); + + if (dtype == at::kHalf) { + cudaLaunchKernelEx(&config, &int8_to_dtype_kernel, out_buf, x, N); + } else if (dtype == at::kShort) { + cudaLaunchKernelEx(&config, &int8_to_dtype_kernel, out_buf, x, N); + } else { + assert(false); + } + return out_buf; +} + +template +__global__ void multiply_with_broadcast_kernel(GPUTensor4D out, const GPUTensor4D a, + const GPUTensor1D b, const int C, const int N) +{ + static_assert(unrolling_factor == 1 || unrolling_factor == 2 || unrolling_factor == 4); + const int c = blockIdx.x * blockDim.x + threadIdx.x; + const int n = blockIdx.y * blockDim.y + threadIdx.y; + const int n0 = n * unrolling_factor; + cudaGDC(); + + if (c < C && n < N) { + const at::Half _b = b[c]; + if (unrolling_factor >= 1) { + out[0][c][0][n0 + 0] = a[0][c][0][n0 + 0] * _b; + } + if (unrolling_factor >= 2) { + out[0][c][0][n0 + 1] = a[0][c][0][n0 + 1] * _b; + } + if (unrolling_factor >= 4) { + out[0][c][0][n0 + 2] = a[0][c][0][n0 + 2] * _b; + out[0][c][0][n0 + 3] = a[0][c][0][n0 + 3] * _b; + } + } +} + +at::Tensor multiply_with_broadcast_cuda(const at::Tensor& a, const at::Tensor& b, at::Tensor& out_buf) +{ + auto attr = get_cuda_launch_attribute(); + + const int C = a.size(1); + int N = a.size(2) * a.size(3); + int factor; + if (N % 4 == 0) { + factor = 4; + N /= 4; + } else if (N % 2 == 0) { + factor = 2; + N /= 2; + } else { + factor = 1; + } + const int BLOCK_SIZE_C = 256; + const int BLOCK_SIZE_N = 1; + const dim3 blockDim(BLOCK_SIZE_C, BLOCK_SIZE_N); + const dim3 gridDim((C + BLOCK_SIZE_C - 1) / BLOCK_SIZE_C, (N + BLOCK_SIZE_N - 1) / BLOCK_SIZE_N); + + cudaLaunchConfig_t config; + config.gridDim = gridDim; + config.blockDim = blockDim; + config.dynamicSmemBytes = 0; + config.stream = at::cuda::getCurrentCUDAStream(); + config.attrs = &attr; + config.numAttrs = 1; + + if (factor == 4) { + cudaLaunchKernelEx(&config, &multiply_with_broadcast_kernel<4>, out_buf, a, b, C, N); + } else if (factor == 2) { + cudaLaunchKernelEx(&config, &multiply_with_broadcast_kernel<2>, out_buf, a, b, C, N); + } else { + cudaLaunchKernelEx(&config, &multiply_with_broadcast_kernel<1>, out_buf, a, b, C, N); + } + return out_buf; +} + +template +__global__ void process_with_mask_kernel(GPUTensor4D y_q, GPUTensor4D y_hat, + GPUTensor4D s_hat, const GPUTensor4D y, + const GPUTensor4D scales, + const GPUTensor4D means, + const GPUTensor4D mask, const GPUTensor4D quant, + const at::Half force_zero_thres, const CudaCHW chw) +{ + static_assert(!scale_out || !multiply); + static_assert(!multiply || add_inplace); + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + bool _mask0; + bool _mask1; + load2(&mask[0][c0][h][w], _mask0, _mask1); + at::Half _y0; + at::Half _y1; + load2(&y[0][c0][h][w], _y0, _y1); + + const at::Half _min_val = static_cast(-128.f); + const at::Half _max_val = static_cast(127.f); + + at::Half _scale0; + at::Half _scale1; + load2(&scales[0][c0][h][w], _scale0, _scale1); + at::Half _means0; + at::Half _means1; + load2(&means[0][c0][h][w], _means0, _means1); + + at::Half _s_hat0 = _scale0 * _mask0; + at::Half _s_hat1 = _scale1 * _mask1; + at::Half _means_hat0 = _means0 * _mask0; + at::Half _means_hat1 = _means1 * _mask1; + at::Half _y_res0 = (_y0 - _means_hat0) * _mask0; + at::Half _y_res1 = (_y1 - _means_hat1) * _mask1; + at::Half _y_q0 = round(_y_res0); + at::Half _y_q1 = round(_y_res1); + _y_q0 = _y_q0 * (_s_hat0 > force_zero_thres); + _y_q1 = _y_q1 * (_s_hat1 > force_zero_thres); + _y_q0 = max(min(_y_q0, _max_val), _min_val); + _y_q1 = max(min(_y_q1, _max_val), _min_val); + at::Half _y_hat0 = _y_q0 + _means_hat0; + at::Half _y_hat1 = _y_q1 + _means_hat1; + + if constexpr (add_inplace) { + at::Half _t0; + at::Half _t1; + load2(&y_q[0][c0][h][w], _t0, _t1); + store2(&y_q[0][c0][h][w], _t0 + _y_q0, _t1 + _y_q1); + } else { + store2(&y_q[0][c0][h][w], _y_q0, _y_q1); + } + + if constexpr (multiply) { + at::Half _q0; + at::Half _q1; + load2(&quant[0][c0][h][w], _q0, _q1); + _q0 = max(_q0, static_cast(0.5f)); + _q1 = max(_q1, static_cast(0.5f)); + at::Half _t0; + at::Half _t1; + load2(&y_hat[0][c0][h][w], _t0, _t1); + _y_hat0 += _t0; + _y_hat1 += _t1; + store2(&y_hat[0][c0][h][w], _y_hat0 * _q0, _y_hat1 * _q1); + } else if constexpr (add_inplace) { + at::Half _t0; + at::Half _t1; + load2(&y_hat[0][c0][h][w], _t0, _t1); + store2(&y_hat[0][c0][h][w], _y_hat0 + _t0, _y_hat1 + _t1); + } else { + store2(&y_hat[0][c0][h][w], _y_hat0, _y_hat1); + } + + if constexpr (scale_out) { + store2(&s_hat[0][c0][h][w], _s_hat0, _s_hat1); + } + } +} + +std::tuple +process_with_mask_cuda(const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, + const at::Tensor& mask, const float force_zero_thres_float, + const int32_t force_zero_thres_int, at::Tensor& y_q_buf, + at::Tensor& y_hat_buf, at::Tensor& s_hat_buf) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + assert(scales.scalar_type() == at::kHalf); + cudaLaunchKernelEx(&config, &process_with_mask_kernel<>, y_q_buf, y_hat_buf, s_hat_buf, y, + scales, means, mask, nullptr, force_zero_thres_float, chw); + + return { y_q_buf, y_hat_buf, s_hat_buf }; +} + +std::tuple process_with_mask_no_scale_add_and_multiply_inplace_cuda( + const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& y_q, at::Tensor& y_hat, const at::Tensor& quant, const float force_zero_thres_float, + const int32_t force_zero_thres_int) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + assert(scales.scalar_type() == at::kHalf); + cudaLaunchKernelEx(&config, &process_with_mask_kernel, y_q, y_hat, nullptr, + y, scales, means, mask, quant, force_zero_thres_float, chw); + + return { y_q, y_hat }; +} + +std::tuple process_with_mask_no_scale_add_inplace_cuda( + const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& y_q, at::Tensor& y_hat, const float force_zero_thres_float, + const int32_t force_zero_thres_int) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + assert(scales.scalar_type() == at::kHalf); + cudaLaunchKernelEx(&config, &process_with_mask_kernel, y_q, y_hat, nullptr, y, + scales, means, mask, nullptr, force_zero_thres_float, chw); + + return { y_q, y_hat }; +} + +std::tuple process_with_mask_no_scale_cuda( + const at::Tensor& y, const at::Tensor& scales, const at::Tensor& means, const at::Tensor& mask, + const float force_zero_thres_float, const int32_t force_zero_thres_int, at::Tensor& y_q_buf, + at::Tensor& y_hat_buf) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + assert(scales.scalar_type() == at::kHalf); + cudaLaunchKernelEx(&config, &process_with_mask_kernel, y_q_buf, y_hat_buf, nullptr, y, + scales, means, mask, nullptr, force_zero_thres_float, chw); + + return { y_q_buf, y_hat_buf }; +} + +template +__global__ void restore_y_kernel(GPUTensor4D out, const GPUTensor4D y, + const GPUTensor4D means, const GPUTensor4D mask, + const GPUTensor4D q, const CudaCHW chw) +{ + static_assert(!multiply || add_inplace); + // C, H, and W are the shape of y tensor + const auto [c, h, w] = global_idx_chw(); + const int c0 = c * 2 + 0; + const int c1 = c * 2 + 1; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + bool _mask0 = mask[0][c0][h][w]; + bool _mask1 = mask[0][c1][h][w]; + + at::Half _y0; + at::Half _y1; + load2(&y[0][c0][h][w], _y0, _y1); + at::Half _means0; + at::Half _means1; + load2(&means[0][c0][h][w], _means0, _means1); + + _y0 = (_y0 + _means0) * _mask0; + _y1 = (_y1 + _means1) * _mask1; + if constexpr (add_inplace) { + at::Half _out_0; + at::Half _out_1; + load2(&out[0][c0][h][w], _out_0, _out_1); + + _y0 = _y0 + _out_0; + _y1 = _y1 + _out_1; + if constexpr (multiply) { + at::Half _q0; + at::Half _q1; + load2(&q[0][c0][h][w], _q0, _q1); + _q0 = max(_q0, static_cast(0.5f)); + _q1 = max(_q1, static_cast(0.5f)); + _y0 = _y0 * _q0; + _y1 = _y1 * _q1; + } + } + store2(&out[0][c0][h][w], _y0, _y1); + } +} + +at::Tensor restore_y_and_add_inplace_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, at::Tensor& y_hat) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + cudaLaunchKernelEx(&config, &restore_y_kernel, y_hat, y, means, mask, nullptr, chw); + return y_hat; +} + +at::Tensor restore_y_and_add_multiply_inplace_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, at::Tensor& y_hat, + const at::Tensor& q) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + cudaLaunchKernelEx(&config, &restore_y_kernel, y_hat, y, means, mask, q, chw); + return y_hat; +} + +at::Tensor restore_y_cuda(const at::Tensor& y, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& out_buf) +{ + auto [config, chw] = get_kernel_config_4D<2>(y); + cudaLaunchKernelEx(&config, &restore_y_kernel<>, out_buf, y, means, mask, nullptr, chw); + return out_buf; +} + +template +__global__ void restore_y_4x_kernel(GPUTensor4D out, const GPUTensor4D y, + const GPUTensor4D means, const GPUTensor4D mask, + const CudaCHW chw) +{ + // C, H, and W are the shape of y tensor + const auto [c, h, w] = global_idx_chw(); + const int c1 = c; + const int c2 = c1 + chw.C; + const int c3 = c2 + chw.C; + const int c4 = c3 + chw.C; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + bool _mask1 = mask[0][c1][h][w]; + bool _mask2 = mask[0][c2][h][w]; + bool _mask3 = mask[0][c3][h][w]; + bool _mask4 = mask[0][c4][h][w]; + + at::Half _y = y[0][c][h][w]; + at::Half _t1 = (_y + means[0][c1][h][w]) * _mask1; + at::Half _t2 = (_y + means[0][c2][h][w]) * _mask2; + at::Half _t3 = (_y + means[0][c3][h][w]) * _mask3; + at::Half _t4 = (_y + means[0][c4][h][w]) * _mask4; + if constexpr (add_inplace) { + out[0][c1][h][w] = out[0][c1][h][w] + _t1; + out[0][c2][h][w] = out[0][c2][h][w] + _t2; + out[0][c3][h][w] = out[0][c3][h][w] + _t3; + out[0][c4][h][w] = out[0][c4][h][w] + _t4; + } else { + out[0][c1][h][w] = _t1; + out[0][c2][h][w] = _t2; + out[0][c3][h][w] = _t3; + out[0][c4][h][w] = _t4; + } + } +} + +at::Tensor restore_y_4x_and_add_inplace_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, at::Tensor& y_hat) +{ + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + auto [config, chw] = get_kernel_config_4D(C, H, W); + + cudaLaunchKernelEx(&config, &restore_y_4x_kernel, y_hat, y, means, mask, chw); + return y_hat; +} + +at::Tensor restore_y_4x_cuda(const at::Tensor& y, const at::Tensor& means, const at::Tensor& mask, + at::Tensor& out_buf) +{ + const int B = y.size(0); + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + + auto [config, chw] = get_kernel_config_4D(C, H, W); + + cudaLaunchKernelEx(&config, &restore_y_4x_kernel<>, out_buf, y, means, mask, chw); + return out_buf; +} + +__global__ void restore_y_4x_add_and_multiply_broadcast_kernel( + GPUTensor4D out, const GPUTensor4D y_hat_so_far, + const GPUTensor4D y, const GPUTensor4D means, const GPUTensor4D mask, + const GPUTensor1D q, const CudaCHW chw) +{ + const auto [c, h, w] = global_idx_chw(); + const int c1 = c; + const int c2 = c1 + chw.C; + const int c3 = c2 + chw.C; + const int c4 = c3 + chw.C; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + bool _mask1 = mask[0][c1][h][w]; + bool _mask2 = mask[0][c2][h][w]; + bool _mask3 = mask[0][c3][h][w]; + bool _mask4 = mask[0][c4][h][w]; + + at::Half _y = y[0][c][h][w]; + out[0][c1][h][w] = (y_hat_so_far[0][c1][h][w] + (_y + means[0][c1][h][w]) * _mask1) * q[c1]; + out[0][c2][h][w] = (y_hat_so_far[0][c2][h][w] + (_y + means[0][c2][h][w]) * _mask2) * q[c2]; + out[0][c3][h][w] = (y_hat_so_far[0][c3][h][w] + (_y + means[0][c3][h][w]) * _mask3) * q[c3]; + out[0][c4][h][w] = (y_hat_so_far[0][c4][h][w] + (_y + means[0][c4][h][w]) * _mask4) * q[c4]; + } +} + +at::Tensor restore_y_4x_add_and_multiply_broadcast_cuda(const at::Tensor& y, const at::Tensor& means, + const at::Tensor& mask, + const at::Tensor& y_hat_so_far, + const at::Tensor& q, at::Tensor& out_buf) +{ + const int C = y.size(1); + const int H = y.size(2); + const int W = y.size(3); + + auto [config, chw] = get_kernel_config_4D(C, H, W); + + cudaLaunchKernelEx(&config, &restore_y_4x_add_and_multiply_broadcast_kernel, out_buf, + y_hat_so_far, y, means, mask, q, chw); + return out_buf; +} + +__global__ void round_z_kernel(GPUTensor1D z_hat, GPUTensor1D z_int8, + const GPUTensor1D z, const int N) +{ + const int n = blockIdx.x * blockDim.x + threadIdx.x; + const int n0 = n * 2 + 0; + cudaGDC(); + + if (n < N) { + at::Half _z0; + at::Half _z1; + load2(&z[n0], _z0, _z1); + _z0 = round(_z0); + _z1 = round(_z1); + _z0 = max(_z0, static_cast(-64.f)); + _z1 = max(_z1, static_cast(-64.f)); + _z0 = min(_z0, static_cast(63.f)); + _z1 = min(_z1, static_cast(63.f)); + int8_t _z0_int8 = static_cast(_z0); + int8_t _z1_int8 = static_cast(_z1); + store2(&z_int8[n0], _z0_int8, _z1_int8); + store2(&z_hat[n0], _z0, _z1); + } +} + +std::tuple round_z_cuda(const at::Tensor& z, at::Tensor& z_hat_buf, + at::Tensor& z_int8_buf) +{ + auto [config, N] = get_kernel_config_1D<2>(z); + + cudaLaunchKernelEx(&config, &round_z_kernel, z_hat_buf, z_int8_buf, z, N); + + return { z_hat_buf, z_int8_buf }; +} + +__global__ void single_part_for_reading_4x_kernel(GPUTensor4D out, + const GPUTensor4D x, + const GPUTensor4D mask, const CudaCHW chw) +{ + // C, H, and W are the shape of out tensor + const auto [c, h, w] = global_idx_chw(); + const int c1 = c; + const int c2 = c1 + chw.C; + const int c3 = c2 + chw.C; + const int c4 = c3 + chw.C; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _x1 = x[0][c1][h][w] * mask[0][c1][h][w]; + at::Half _x2 = x[0][c2][h][w] * mask[0][c2][h][w]; + at::Half _x3 = x[0][c3][h][w] * mask[0][c3][h][w]; + at::Half _x4 = x[0][c4][h][w] * mask[0][c4][h][w]; + out[0][c][h][w] = _x1 + _x2 + _x3 + _x4; + } +} + +at::Tensor single_part_for_reading_4x_cuda(const at::Tensor& x, const at::Tensor& mask, + at::Tensor& out_buf) +{ + const int B = x.size(0); + const int C = x.size(1) / 4; + const int H = x.size(2); + const int W = x.size(3); + + auto [config, chw] = get_kernel_config_4D(C, H, W); + + cudaLaunchKernelEx(&config, &single_part_for_reading_4x_kernel, out_buf, x, mask, chw); + return out_buf; +} + +__global__ void single_part_for_writing_4x_kernel(GPUTensor4D out, + const GPUTensor4D x, const CudaCHW chw) +{ + // C, H, and W are the shape of out tensor + const auto [c, h, w] = global_idx_chw(); + const int c1 = c; + const int c2 = c1 + chw.C; + const int c3 = c2 + chw.C; + const int c4 = c3 + chw.C; + cudaGDC(); + + if (c < chw.C && h < chw.H && w < chw.W) { + at::Half _x1 = x[0][c1][h][w]; + at::Half _x2 = x[0][c2][h][w]; + at::Half _x3 = x[0][c3][h][w]; + at::Half _x4 = x[0][c4][h][w]; + out[0][c][h][w] = _x1 + _x2 + _x3 + _x4; + } +} + +at::Tensor single_part_for_writing_4x_cuda(const at::Tensor& x, at::Tensor& out_buf) +{ + const int B = x.size(0); + const int C = x.size(1) / 4; + const int H = x.size(2); + const int W = x.size(3); + + auto [config, chw] = get_kernel_config_4D(C, H, W); + + cudaLaunchKernelEx(&config, &single_part_for_writing_4x_kernel, out_buf, x, chw); + return out_buf; +} diff --git a/src/layers/extensions/inference/install.sh b/src/layers/extensions/inference/install.sh new file mode 100644 index 0000000..1e5a323 --- /dev/null +++ b/src/layers/extensions/inference/install.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +start=$(date +%s) +pip install --no-build-isolation . +end=$(date +%s) +runtime=$((end - start)) +echo "Execution time: $runtime seconds" diff --git a/src/layers/extensions/inference/layers_proxy.cpp b/src/layers/extensions/inference/layers_proxy.cpp new file mode 100644 index 0000000..ed0d3b0 --- /dev/null +++ b/src/layers/extensions/inference/layers_proxy.cpp @@ -0,0 +1,324 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include + +#include "common_cpp.h" +#include "def_cutlass.h" +#include "def_elementwise.h" +#include "layers_proxy.h" +#include "memory_pool.h" + +std::tuple chunk_tensors_2(const at::Tensor& x) +{ + auto out = x.chunk(2, 1); + return { out[0], out[1] }; +} + +std::tuple chunk_tensors_3(const at::Tensor& x) +{ + auto out = x.chunk(3, 1); + return { out[0], out[1], out[2] }; +} + +at::Tensor conv2d(const at::Tensor& feature, const at::Tensor& weight, const at::Tensor& bias, + const int stride, at::Tensor& out_buf) +{ + const int sm = get_gpu_sm(); + + const int kernel = weight.size(2); + if (kernel == 1 && stride == 1) { + return conv1x1_bias(sm, feature, weight, bias, out_buf); + } + return conv_bias(sm, feature, weight, bias, stride, out_buf); +} + +std::map +get_submodule_state_dict(const std::map& state_dict, const std::string& prefix) +{ + + std::map submodule_state_dict; + + for (const auto& param : state_dict) { + if (param.first.rfind(prefix, 0) == 0) { + std::string new_key = param.first.substr(prefix.size()); + submodule_state_dict[new_key] = param.second; + } + } + + return submodule_state_dict; +} + +std::tuple split_tensors_2(const at::Tensor& x, const int C1, const int C2) +{ + auto out = x.split_with_sizes({ C1, C2 }, 1); + return { out[0], out[1] }; +} + +std::tuple split_tensors_3(const at::Tensor& x, const int C1, + const int C2, const int C3) +{ + auto out = x.split_with_sizes({ C1, C2, C3 }, 1); + return { out[0], out[1], out[2] }; +} + +void ConvParam::set_param(const std::map& state_dict, const std::string& prefix) +{ + weight = state_dict.at(prefix + "weight"); + bias = state_dict.at(prefix + "bias"); +} + +at::Tensor DepthConvBlockProxy::forward(const at::Tensor& x, const at::optional& quant) +{ + const int sm = get_gpu_sm(); + + auto out = x; + if (m_adaptor) { + out = conv1x1_bias(sm, x, m_adaptor_weight, m_adaptor_bias, m_adaptor_out); + } + auto shortcut = out; + out = conv1x1_bias_wsilu(sm, out, m_dc_conv1_weight, m_dc_conv1_bias, m_dc_conv1_out); + out = d3x3(sm, out, m_dc_depth_conv_weight, m_dc_depth_conv_out); + out = conv1x1_bias_shortcut(sm, out, m_dc_conv2_weight, m_dc_conv2_bias, shortcut, m_dc_conv2_out); + + auto shortcut_ffn = out; + out = conv1x1_bias_wsilu_chunk_add(sm, out, m_ffn_conv1_weight, m_ffn_conv1_bias, + m_ffn_conv1_weight0, m_ffn_conv1_weight1, m_ffn_conv1_weight2, + m_ffn_conv1_weight3, m_ffn_conv1_bias0, m_ffn_conv1_bias1, + m_ffn_conv1_bias2, m_ffn_conv1_bias3, m_ffn_conv1_out); + if (m_shortcut) { + out = conv1x1_bias_shortcut2(sm, out, m_ffn_conv2_weight, m_ffn_conv2_bias, shortcut_ffn, + shortcut, m_ffn_conv2_out); + } else if (quant.has_value()) { + out = conv1x1_bias_shortcut_with_quant(sm, out, m_ffn_conv2_weight, m_ffn_conv2_bias, + shortcut_ffn, quant.value(), m_ffn_conv2_out); + } else { + out = conv1x1_bias_shortcut(sm, out, m_ffn_conv2_weight, m_ffn_conv2_bias, shortcut_ffn, + m_ffn_conv2_out); + } + + return out; +} + +at::Tensor DepthConvBlockProxy::pre_allocate_tensors(at::Tensor& x, const bool input_further_use, + const at::optional& out_buf) +{ + const int H = x.size(2); + const int W = x.size(3); + bool dc_input_modifiable = !m_shortcut && (!input_further_use || m_adaptor); + + auto options = m_dc_conv1_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int ch_dc = m_dc_conv1_weight.size(0); + const int C = m_dc_conv1_weight.size(1); + const int ch_ffn = m_ffn_conv2_weight.size(1); + + auto dc_input = x; + if (m_adaptor) { + const int C1 = m_adaptor_weight.size(0); + m_adaptor_out = g_tensor_pool.empty({ 1, C1, H, W }, options); + dc_input = m_adaptor_out; + } + + m_dc_conv1_out = g_tensor_pool.empty({ 1, ch_dc, H, W }, options); + m_dc_depth_conv_out = g_tensor_pool.empty_like(m_dc_conv1_out); + if (out_buf.has_value()) { + m_dc_conv2_out = out_buf.value(); + } else if (dc_input_modifiable) { + m_dc_conv2_out = dc_input; + } else { + m_dc_conv2_out = g_tensor_pool.empty({ 1, C, H, W }, options); + } + m_ffn_conv1_out = g_tensor_pool.empty({ 1, ch_ffn, H, W }, options); + m_ffn_conv2_out = m_dc_conv2_out; + + if (!input_further_use) { + if (m_adaptor || out_buf.has_value()) { + g_tensor_pool.release(x); + } + } + if (out_buf.has_value()) { + if (m_adaptor) { + g_tensor_pool.release(m_adaptor_out); + } + } + + g_tensor_pool.release(m_dc_conv1_out); + g_tensor_pool.release(m_dc_depth_conv_out); + g_tensor_pool.release(m_ffn_conv1_out); + + return m_ffn_conv2_out; +} + +void DepthConvBlockProxy::release_tensors() +{ + if (m_adaptor_out.defined()) { + g_tensor_pool.release(m_adaptor_out); + } + g_tensor_pool.release(m_ffn_conv2_out); +} + +void DepthConvBlockProxy::set_param(const std::map& state_dict, + const bool shortcut) +{ + auto it = state_dict.find("adaptor.weight"); + if (it != state_dict.end()) { + m_adaptor_weight = state_dict.at("adaptor.weight"); + m_adaptor_bias = state_dict.at("adaptor.bias"); + m_adaptor = true; + } + m_dc_conv1_weight = state_dict.at("dc.0.weight"); + m_dc_conv1_bias = state_dict.at("dc.0.bias"); + // Note: d3x3 weight is reordered from [C, 1, 3, 3] to [1, C, 3, 3]. + m_dc_depth_conv_weight = + state_dict.at("dc.2.weight").permute({ 1, 0, 2, 3 }).contiguous(at::MemoryFormat::ChannelsLast); + m_dc_conv2_weight = state_dict.at("dc.3.weight"); + m_dc_conv2_bias = at::conv2d(state_dict.at("dc.2.bias").reshape({ 1, -1, 1, 1 }), + state_dict.at("dc.3.weight")); + m_dc_conv2_bias = + m_dc_conv2_bias.index({ 0, at::indexing::Slice(), 0, 0 }) + state_dict.at("dc.3.bias"); + m_ffn_conv1_weight = state_dict.at("ffn.0.weight"); + m_ffn_conv1_bias = state_dict.at("ffn.0.bias"); + + m_ffn_conv1_weight0 = + m_ffn_conv1_weight.index({ at::indexing::Slice(0, at::nullopt, 4), at::indexing::Slice(), + at::indexing::Slice(), at::indexing::Slice() }); + m_ffn_conv1_weight1 = + m_ffn_conv1_weight.index({ at::indexing::Slice(1, at::nullopt, 4), at::indexing::Slice(), + at::indexing::Slice(), at::indexing::Slice() }); + m_ffn_conv1_weight2 = + m_ffn_conv1_weight.index({ at::indexing::Slice(2, at::nullopt, 4), at::indexing::Slice(), + at::indexing::Slice(), at::indexing::Slice() }); + m_ffn_conv1_weight3 = + m_ffn_conv1_weight.index({ at::indexing::Slice(3, at::nullopt, 4), at::indexing::Slice(), + at::indexing::Slice(), at::indexing::Slice() }); + m_ffn_conv1_bias0 = + m_ffn_conv1_bias.index({ at::indexing::Slice(0, at::nullopt, 4) }).contiguous(); + m_ffn_conv1_bias1 = + m_ffn_conv1_bias.index({ at::indexing::Slice(1, at::nullopt, 4) }).contiguous(); + m_ffn_conv1_bias2 = + m_ffn_conv1_bias.index({ at::indexing::Slice(2, at::nullopt, 4) }).contiguous(); + m_ffn_conv1_bias3 = + m_ffn_conv1_bias.index({ at::indexing::Slice(3, at::nullopt, 4) }).contiguous(); + + m_ffn_conv2_weight = state_dict.at("ffn.2.weight"); + m_ffn_conv2_bias = state_dict.at("ffn.2.bias"); + m_shortcut = shortcut; +} + +at::Tensor ResidualBlockUpsampleProxy::forward(const at::Tensor& x) +{ + auto out = m_up.forward(x); + return m_conv.forward(out); +} + +at::Tensor ResidualBlockUpsampleProxy::pre_allocate_tensors(at::Tensor& x) +{ + auto out = m_up.pre_allocate_tensors(x); + out = m_conv.pre_allocate_tensors(out); + return out; +} + +void ResidualBlockUpsampleProxy::release_tensors() +{ + m_up.release_tensors(); + m_conv.release_tensors(); +} + +void ResidualBlockUpsampleProxy::set_param(const std::map& state_dict, + const bool shortcut) +{ + m_up.set_param(get_submodule_state_dict(state_dict, "up.")); + m_conv.set_param(get_submodule_state_dict(state_dict, "conv."), shortcut); +} + +at::Tensor ResidualBlockWithStride2Proxy::forward(const at::Tensor& x) +{ + const int sm = get_gpu_sm(); + auto out = conv_bias(sm, x, m_weight, m_bias, 2, m_conv_out); + out = m_conv.forward(out); + return out; +} + +at::Tensor ResidualBlockWithStride2Proxy::pre_allocate_tensors(at::Tensor& x, + const at::optional& out_buf) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int C = m_weight.size(0); + m_conv_out = g_tensor_pool.empty({ 1, C, H / 2, W / 2 }, options); + // because we will downsample first, for the DCB, input will not be further used + return m_conv.pre_allocate_tensors(m_conv_out, false, out_buf); +} + +void ResidualBlockWithStride2Proxy::release_tensors() +{ + g_tensor_pool.release(m_conv_out); + m_conv.release_tensors(); +} + +void ResidualBlockWithStride2Proxy::set_param(const std::map& state_dict, + const bool shortcut) +{ + m_weight = state_dict.at("down.weight"); + m_weight = at::pixel_shuffle(m_weight, 2).contiguous(at::MemoryFormat::ChannelsLast); + m_bias = state_dict.at("down.bias"); + m_conv.set_param(get_submodule_state_dict(state_dict, "conv."), shortcut); +} + +at::Tensor SubpelConv2xProxy::forward(const at::Tensor& x) +{ + if (m_bias.defined()) { + auto out = conv2d(x, m_weight, m_bias, 1, m_conv_out); + return pixel_shuffle_2_cuda(out, m_shuffle_out); + } + return transposed_conv(get_gpu_sm(), x, m_weight_transposed, 2, m_conv_out); +} + +at::Tensor SubpelConv2xProxy::pre_allocate_tensors(at::Tensor& x) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int C = m_weight.size(0); + if (m_bias.defined()) { + m_conv_out = g_tensor_pool.empty({ 1, C, H, W }, options); + m_shuffle_out = g_tensor_pool.empty({ 1, C / 4, H * 2, W * 2 }, options); + return m_shuffle_out; + } + m_conv_out = g_tensor_pool.empty({ 1, C / 4, H * 2, W * 2 }, options); + return m_conv_out; +} + +at::Tensor SubpelConv2xProxy::pre_allocate_tensors(at::Tensor& x, at::Tensor& out_buf) +{ + const int H = x.size(2); + const int W = x.size(3); + auto options = m_weight.options().memory_format(at::MemoryFormat::ChannelsLast); + const int C = m_weight.size(0); + if (m_bias.defined()) { + m_conv_out = g_tensor_pool.empty({ 1, C, H, W }, options); + m_shuffle_out = out_buf; + return m_shuffle_out; + } + m_conv_out = out_buf; + return m_conv_out; +} + +void SubpelConv2xProxy::release_tensors() +{ + g_tensor_pool.release(m_conv_out); + g_tensor_pool.release(m_shuffle_out); +} + +void SubpelConv2xProxy::set_param(const std::map& state_dict) +{ + m_weight = state_dict.at("conv.0.weight"); + auto it = state_dict.find("conv.0.bias"); + if (it != state_dict.end()) { + m_bias = state_dict.at("conv.0.bias"); + } else { + m_weight_transposed = + at::pixel_shuffle(m_weight.permute({ 1, 0, 2, 3 }), 2).contiguous(at::MemoryFormat::ChannelsLast); + } +} diff --git a/src/layers/extensions/inference/layers_proxy.h b/src/layers/extensions/inference/layers_proxy.h new file mode 100644 index 0000000..39704b9 --- /dev/null +++ b/src/layers/extensions/inference/layers_proxy.h @@ -0,0 +1,129 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include + +#include "def_const.h" +#include "py_rans.h" + +std::tuple chunk_tensors_2(const at::Tensor& x); +std::tuple chunk_tensors_3(const at::Tensor& x); +std::map get_submodule_state_dict(const std::map& state_dict, + const std::string& prefix); +std::tuple split_tensors_2(const at::Tensor& x, const int C1, const int C2); +std::tuple split_tensors_3(const at::Tensor& x, const int C1, + const int C2, const int C3); + +class ConvParam { +public: + at::Tensor weight; + at::Tensor bias; + + ConvParam() = default; + ~ConvParam() = default; + + void set_param(const std::map& state_dict, const std::string& prefix); +}; + +class DepthConvBlockProxy { +public: + DepthConvBlockProxy() = default; + ~DepthConvBlockProxy() = default; + + at::Tensor forward(const at::Tensor& x, const at::optional& quant = at::nullopt); + at::Tensor pre_allocate_tensors(at::Tensor& x, const bool input_further_use = false, + const at::optional& out_buf = at::nullopt); + void release_tensors(); + void set_param(const std::map& state_dict, const bool shortcut = false); + +private: + at::Tensor m_adaptor_weight; + at::Tensor m_adaptor_bias; + at::Tensor m_dc_conv1_weight; + at::Tensor m_dc_conv1_bias; + at::Tensor m_dc_depth_conv_weight; + at::Tensor m_dc_conv2_weight; + at::Tensor m_dc_conv2_bias; + at::Tensor m_ffn_conv1_weight; + at::Tensor m_ffn_conv1_bias; + at::Tensor m_ffn_conv1_weight0; + at::Tensor m_ffn_conv1_weight1; + at::Tensor m_ffn_conv1_weight2; + at::Tensor m_ffn_conv1_weight3; + at::Tensor m_ffn_conv1_bias0; + at::Tensor m_ffn_conv1_bias1; + at::Tensor m_ffn_conv1_bias2; + at::Tensor m_ffn_conv1_bias3; + at::Tensor m_ffn_conv2_weight; + at::Tensor m_ffn_conv2_bias; + bool m_adaptor{ false }; + bool m_shortcut{ false }; + + // for cuda graphs + at::Tensor m_adaptor_out; + at::Tensor m_dc_conv1_out; + at::Tensor m_dc_depth_conv_out; + at::Tensor m_dc_conv2_out; + at::Tensor m_ffn_conv1_out; + at::Tensor m_ffn_conv2_out; +}; + +class SubpelConv2xProxy { +public: + SubpelConv2xProxy() = default; + ~SubpelConv2xProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, at::Tensor& out_buf); + void release_tensors(); + void set_param(const std::map& state_dict); + +private: + at::Tensor m_weight; + at::Tensor m_weight_transposed; + at::Tensor m_bias; + + // for cuda graphs + at::Tensor m_conv_out; + at::Tensor m_shuffle_out; +}; + +class ResidualBlockWithStride2Proxy { +public: + ResidualBlockWithStride2Proxy() = default; + ~ResidualBlockWithStride2Proxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x, + const at::optional& out_buf = at::nullopt); + void release_tensors(); + void set_param(const std::map& state_dict, const bool shortcut); + +private: + at::Tensor m_weight; + at::Tensor m_bias; + DepthConvBlockProxy m_conv; + + // for cuda graphs + at::Tensor m_conv_out; +}; + +class ResidualBlockUpsampleProxy { +public: + ResidualBlockUpsampleProxy() = default; + ~ResidualBlockUpsampleProxy() = default; + + at::Tensor forward(const at::Tensor& x); + at::Tensor pre_allocate_tensors(at::Tensor& x); + void release_tensors(); + void set_param(const std::map& state_dict, const bool shortcut); + +private: + SubpelConv2xProxy m_up; + DepthConvBlockProxy m_conv; +}; diff --git a/src/layers/extensions/inference/memory_pool.cpp b/src/layers/extensions/inference/memory_pool.cpp new file mode 100644 index 0000000..8b5fe4d --- /dev/null +++ b/src/layers/extensions/inference/memory_pool.cpp @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "memory_pool.h" + +TensorPool g_tensor_pool; diff --git a/src/layers/extensions/inference/memory_pool.h b/src/layers/extensions/inference/memory_pool.h new file mode 100644 index 0000000..9d8c480 --- /dev/null +++ b/src/layers/extensions/inference/memory_pool.h @@ -0,0 +1,127 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +struct TensorEntry { + at::Tensor tensor; + c10::SmallVector sizes; + c10::Device device{ at::kCUDA, 0 }; + at::ScalarType dtype{ at::kFloat }; + c10::Layout layout{ c10::kStrided }; + bool is_channel_last{ true }; + bool reusable{ false }; +}; + +inline bool sizes_equal(c10::IntArrayRef a, c10::IntArrayRef b) +{ + if (a.size() != b.size()) return false; + for (size_t i = 0; i < a.size(); ++i) + if (a[i] != b[i]) return false; + return true; +} + +class TensorPool { +public: + TensorPool() = default; + + at::Tensor acquire(c10::IntArrayRef sizes, const at::TensorOptions& options) + { + std::lock_guard g(mu_); + const c10::Device device = options.device(); + const at::ScalarType dtype = c10::typeMetaToScalarType(options.dtype()); + const c10::Layout layout = options.layout(); + const std::optional mem_format = options.memory_format_opt(); + bool is_channel_last = + mem_format.has_value() && mem_format.value() == at::MemoryFormat::ChannelsLast; + + for (auto& e : entries_) { + if (!e.reusable) { + continue; + } + if (e.device != device || e.dtype != dtype || e.layout != layout + || e.is_channel_last != is_channel_last) { + continue; + } + if (!sizes_equal(e.sizes, sizes)) { + continue; + } + + e.reusable = false; + return e.tensor; + } + + auto t = at::empty(sizes, options); + + TensorEntry e; + e.tensor = t; + e.sizes.assign(sizes.begin(), sizes.end()); + e.device = device; + e.dtype = dtype; + e.layout = layout; + e.is_channel_last = is_channel_last; + e.reusable = false; + entries_.emplace_back(std::move(e)); + return entries_.back().tensor; + } + + void clear(int H, int W) + { + std::lock_guard g(mu_); + if (H == m_H && W == m_W) { + return; + } + entries_.clear(); + m_H = H; + m_W = W; + } + + at::Tensor empty(c10::IntArrayRef sizes, const at::TensorOptions& options) + { + return acquire(sizes, options); + } + + at::Tensor empty_like(const at::Tensor& a) + { + return acquire(a.sizes(), a.options().memory_format(a.is_contiguous(at::MemoryFormat::ChannelsLast) + ? at::MemoryFormat::ChannelsLast + : at::MemoryFormat::Contiguous)); + } + + bool release(const at::Tensor& t) + { + if (!t.defined()) { + return false; + } + return set_reusable(t, true); + } + + bool set_reusable(const at::Tensor& t, bool flag = true) + { + std::lock_guard g(mu_); + auto* impl = t.unsafeGetTensorImpl(); + for (auto& e : entries_) { + if (e.tensor.unsafeGetTensorImpl() == impl) { + e.reusable = flag; + return true; + } + } + return false; + } + +private: + mutable std::mutex mu_; + std::vector entries_; + int m_H{ 0 }; + int m_W{ 0 }; +}; + +extern TensorPool g_tensor_pool; diff --git a/src/layers/extensions/inference/pyproject.toml b/src/layers/extensions/inference/pyproject.toml new file mode 100644 index 0000000..9787c3b --- /dev/null +++ b/src/layers/extensions/inference/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/src/layers/extensions/inference/setup.py b/src/layers/extensions/inference/setup.py index 6a25fd5..3df5319 100644 --- a/src/layers/extensions/inference/setup.py +++ b/src/layers/extensions/inference/setup.py @@ -4,25 +4,77 @@ import os import glob import sys +import psutil +import torch + from setuptools import setup from torch.utils.cpp_extension import BuildExtension, CUDAExtension -cxx_flags = ["-O3"] -nvcc_flags = ["-O3", "--use_fast_math", "--extra-device-vectorization", "-arch=native"] +# Note: assume inference kernel is only built upon NVIDIA platforms. +major, minor = torch.cuda.get_device_capability(0) +sm = major * 10 + minor +if sm == 90: + arch_str = '--generate-code=arch=compute_90a,code=[sm_90a]' +elif sm == 100: + arch_str = '--generate-code=arch=compute_100a,code=[sm_100a]' +else: + arch_str = '-arch=native' + +cxx_flags = ['-O3', '-Wno-deprecated-declarations'] +# Per-nvcc internal parallelism via --split-compile=N. The inference +# extension is CUTLASS-heavy, so individual .cu translation units are +# large and benefit from intra-nvcc parallelism on top of ninja's +# cross-file parallelism. Empirically saturates around 4; pick N based +# on cpu_count so smaller hosts still leave headroom for ninja. +cpu_count = os.cpu_count() or 4 +if cpu_count < 16: + nvcc_split_compile = 1 +elif cpu_count < 32: + nvcc_split_compile = 2 +else: + nvcc_split_compile = 4 +nvcc_flags = [f'-DCURRENT_DEVICE_SM={sm}', '-O3', '--use_fast_math', + '--extra-device-vectorization', arch_str, '-Wno-deprecated-declarations', + f'--split-compile={nvcc_split_compile}'] +if sm == 90: + nvcc_flags.append('-DCUTLASS_ENABLE_GDC_FOR_SM90=1') +elif sm == 100: + nvcc_flags.append('-DCUTLASS_ENABLE_GDC_FOR_SM100=1') + if sys.platform == 'win32': - cxx_flags = ["/O2"] + cxx_flags = ['/O2'] + +cutlass_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../../../../third_party/cutlass') +py_rans_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../../../cpp/py_rans') +mem = psutil.virtual_memory() +mem_gb = mem.available / 1024**3 +if mem_gb < 32: + os.environ['MAX_JOBS'] = '8' +elif mem_gb < 64: + os.environ['MAX_JOBS'] = '16' setup( name='inference_extensions_cuda', ext_modules=[ CUDAExtension( name='inference_extensions_cuda', - sources=glob.glob('*.cpp') + glob.glob('*.cu'), + include_dirs=[ + os.path.join(cutlass_path, 'include'), + os.path.join(cutlass_path, 'tools', 'util', 'include'), + py_rans_path + ], + sources=( + glob.glob('**/*.cpp', recursive=True) + + glob.glob('**/*.cu', recursive=True) + + [f'{py_rans_path}/rans.cpp', f'{py_rans_path}/py_rans.cpp',] + ), extra_compile_args={ - "cxx": cxx_flags, - "nvcc": nvcc_flags, + 'cxx': cxx_flags, + 'nvcc': nvcc_flags, }, ), ], diff --git a/src/layers/layers.py b/src/layers/layers.py index a51e93d..e6521c0 100644 --- a/src/layers/layers.py +++ b/src/layers/layers.py @@ -2,155 +2,187 @@ # Licensed under the MIT License. import torch +import torch.nn.functional as F + from torch import nn -from .cuda_inference import CUSTOMIZED_CUDA_INFERENCE -if CUSTOMIZED_CUDA_INFERENCE: - from .cuda_inference import DepthConvProxy, SubpelConv2xProxy +from torch.autograd import Function +from ..utils.transforms import ycbcr2rgb -class WSiLU(nn.Module): - def __init__(self): - super().__init__() - def forward(self, x): - return torch.sigmoid(4.0 * x) * x +def bit_estimator_z_prob(x, h, b, a): + # this is accumulated prob + for i in range(4): + x = x * F.softplus(h[:, :, i:i+1, None]) + b[:, :, i:i+1, None] + if i != 3: + x = x + torch.tanh(x) * torch.tanh(a[:, :, i:i+1, None]) + return torch.sigmoid(x) -class WSiLUChunkAdd(nn.Module): - def __init__(self): - super().__init__() - self.silu = WSiLU() +def bit_estimator_z_fwd(x, h, b, a): + dtype = x.dtype + x = x.float() + h = h.float() + b = b.float() + a = a.float() + lower = bit_estimator_z_prob(x - 0.5, h, b, a) + upper = bit_estimator_z_prob(x + 0.5, h, b, a) + prob = upper - lower + return prob.to(dtype) - def forward(self, x): - x1, x2 = self.silu(x).chunk(2, 1) - return x1 + x2 + +def get_mse_yuv_rgb(x, x_hat): + mse_yuv = torch.sum(F.mse_loss(x, x_hat, reduction='none'), dim=(2, 3)) + org_rgb = ycbcr2rgb(x, clamp=False) + rec_rgb = ycbcr2rgb(x_hat, clamp=False) + mse_rgb = torch.sum(F.mse_loss(org_rgb, rec_rgb, reduction='none'), dim=(1, 2, 3)) + return mse_yuv, mse_rgb + + +def mse_8frames_sum(mse, dist_weights): + result = (mse[0] + mse[2] + mse[4] + mse[6]) * dist_weights[1] + \ + (mse[1] + mse[3] + mse[5]) * dist_weights[2] + mse[7] * dist_weights[0] + return result + + +def mse_weighted_average(mse_yuv, mse_rgb, pixel_num): + dtype = mse_yuv.dtype + mse_yuv = mse_yuv.float() + mse_rgb = mse_rgb.float() + mse_yuv = mse_yuv / pixel_num + mse_y, mse_u, mse_v = mse_yuv[:, 0], mse_yuv[:, 1], mse_yuv[:, 2] + mse_yuv = torch.exp( + 0.0833 * (10 * torch.log(torch.clamp_min(mse_y, 1e-6)) + + torch.log(torch.clamp_min(mse_u, 1e-6)) + + torch.log(torch.clamp_min(mse_v, 1e-6)))) * 3 + mse_rgb = mse_rgb / pixel_num + mse = mse_yuv * 0.8 + mse_rgb * 0.2 + return mse.to(dtype) + + +class LowerBound(Function): + @staticmethod + def forward(ctx, inputs, bound): + ctx.save_for_backward(inputs) + ctx.bound = bound + return torch.clamp_min(inputs, bound) + + @staticmethod + def backward(ctx, grad): + inputs = ctx.saved_tensors[0] + bound = ctx.bound + + pass_through_1 = inputs >= bound + pass_through_2 = grad < 0 + + pass_through = pass_through_1 | pass_through_2 + return pass_through * grad, None + + +class QuantFunc(Function): + @staticmethod + def forward(ctx, x): + return torch.round(x) + + @staticmethod + def backward(ctx, grad): + return grad class SubpelConv2x(nn.Module): - def __init__(self, in_ch, out_ch, kernel_size, padding=0): + def __init__(self, in_ch, out_ch, kernel_size, padding=0, force_bias=False): super().__init__() + has_bias = (kernel_size > 1) or force_bias self.conv = nn.Sequential( - nn.Conv2d(in_ch, out_ch * 4, kernel_size=kernel_size, padding=padding), + nn.Conv2d(in_ch, out_ch * 4, kernel_size=kernel_size, padding=padding, bias=has_bias), nn.PixelShuffle(2), ) self.padding = padding - self.proxy = None + def forward(self, x): + return self.conv(x) - def forward(self, x, to_cat=None, cat_at_front=True): - if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: - return self.forward_torch(x, to_cat, cat_at_front) - return self.forward_cuda(x, to_cat, cat_at_front) +class WSiLU(nn.Module): + def __init__(self): + super().__init__() - def forward_torch(self, x, to_cat=None, cat_at_front=True): - out = self.conv(x) - if to_cat is None: - return out - if cat_at_front: - return torch.cat((to_cat, out), dim=1) - return torch.cat((out, to_cat), dim=1) + def forward(self, x): + return torch.sigmoid(4.0 * x) * x - def forward_cuda(self, x, to_cat=None, cat_at_front=True): - if self.proxy is None: - self.proxy = SubpelConv2xProxy() - self.proxy.set_param(self.conv[0].weight, self.conv[0].bias, self.padding) - if to_cat is None: - return self.proxy.forward(x) +class WSiLUChunkAdd(nn.Module): + def __init__(self): + super().__init__() + self.wsilu = WSiLU() - return self.proxy.forward_with_cat(x, to_cat, cat_at_front) + def forward(self, x): + x = self.wsilu(x) + x1 = x[:, 0::4, :, :] + x2 = x[:, 1::4, :, :] + x3 = x[:, 2::4, :, :] + x4 = x[:, 3::4, :, :] + return x1 + x2 + x3 + x4 class DepthConvBlock(nn.Module): - def __init__(self, in_ch, out_ch, shortcut=False, force_adaptor=False): + def __init__(self, in_ch, out_ch, *, dcb2=False, shortcut=False, force_adaptor=False): super().__init__() self.adaptor = None if in_ch != out_ch or force_adaptor: self.adaptor = nn.Conv2d(in_ch, out_ch, 1) + ch_ratio = 1 + if dcb2: + assert not shortcut + ch_ratio = 2 self.shortcut = shortcut self.dc = nn.Sequential( - nn.Conv2d(out_ch, out_ch, 1), + nn.Conv2d(out_ch, out_ch // ch_ratio, 1), WSiLU(), - nn.Conv2d(out_ch, out_ch, 3, padding=1, groups=out_ch), - nn.Conv2d(out_ch, out_ch, 1), + nn.Conv2d(out_ch // ch_ratio, out_ch // ch_ratio, 3, padding=1, + groups=out_ch // ch_ratio), + nn.Conv2d(out_ch // ch_ratio, out_ch, 1), ) self.ffn = nn.Sequential( - nn.Conv2d(out_ch, out_ch * 4, 1), + nn.Conv2d(out_ch, out_ch * 4 // ch_ratio, 1), WSiLUChunkAdd(), - nn.Conv2d(out_ch * 2, out_ch, 1), + nn.Conv2d(out_ch // ch_ratio, out_ch, 1), ) - self.proxy = None - - def forward(self, x, quant_step=None, to_cat=None, cat_at_front=True): - if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: - return self.forward_torch(x, quant_step, to_cat, cat_at_front) - - return self.forward_cuda(x, quant_step, to_cat, cat_at_front) - - def forward_torch(self, x, quant_step=None, to_cat=None, cat_at_front=True): + def forward(self, x): if self.adaptor is not None: x = self.adaptor(x) out = self.dc(x) + x out = self.ffn(out) + out if self.shortcut: out = out + x - if quant_step is not None: - out = out * quant_step - if to_cat is not None: - if cat_at_front: - out = torch.cat((to_cat, out), dim=1) - else: - out = torch.cat((out, to_cat), dim=1) return out - def forward_cuda(self, x, quant_step=None, to_cat=None, cat_at_front=True): - if self.proxy is None: - self.proxy = DepthConvProxy() - if self.adaptor is not None: - self.proxy.set_param_with_adaptor(self.dc[0].weight, self.dc[0].bias, - self.dc[2].weight, self.dc[2].bias, - self.dc[3].weight, self.dc[3].bias, - self.ffn[0].weight, self.ffn[0].bias, - self.ffn[2].weight, self.ffn[2].bias, - self.adaptor.weight, self.adaptor.bias, - self.shortcut) - else: - self.proxy.set_param(self.dc[0].weight, self.dc[0].bias, - self.dc[2].weight, self.dc[2].bias, - self.dc[3].weight, self.dc[3].bias, - self.ffn[0].weight, self.ffn[0].bias, - self.ffn[2].weight, self.ffn[2].bias, - self.shortcut) - - if quant_step is not None: - return self.proxy.forward_with_quant_step(x, quant_step) - if to_cat is not None: - return self.proxy.forward_with_cat(x, to_cat, cat_at_front) - - return self.proxy.forward(x) - -class ResidualBlockWithStride2(nn.Module): - def __init__(self, in_ch, out_ch): +class ResidualBlockUpsample(nn.Module): + def __init__(self, in_ch, out_ch, dcb2=False, shortcut=True, force_bias=False): super().__init__() - self.down = nn.Conv2d(in_ch, out_ch, 2, stride=2) - self.conv = DepthConvBlock(out_ch, out_ch, shortcut=True) + self.up = SubpelConv2x(in_ch, out_ch, 1, force_bias=force_bias) + self.conv = DepthConvBlock(out_ch, out_ch, dcb2=dcb2, shortcut=shortcut) + + self.shortcut = shortcut def forward(self, x): - x = self.down(x) - out = self.conv(x) + out = self.up(x) + out = self.conv(out) return out -class ResidualBlockUpsample(nn.Module): - def __init__(self, in_ch, out_ch): +class ResidualBlockWithStride2(nn.Module): + def __init__(self, in_ch, out_ch, dcb2=False, shortcut=True): super().__init__() - self.up = SubpelConv2x(in_ch, out_ch, 1) - self.conv = DepthConvBlock(out_ch, out_ch, shortcut=True) + self.down = nn.Conv2d(in_ch * 4, out_ch, 1) + self.conv = DepthConvBlock(out_ch, out_ch, dcb2=dcb2, shortcut=shortcut) + + self.shortcut = shortcut def forward(self, x): - out = self.up(x) + out = F.pixel_unshuffle(x, 2) + out = self.down(out) out = self.conv(out) return out diff --git a/src/models/common_model.py b/src/models/common_model.py index dc18b65..aa083c4 100644 --- a/src/models/common_model.py +++ b/src/models/common_model.py @@ -1,36 +1,103 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +import math import torch +import torch.utils.checkpoint + from torch import nn -from ..layers.cuda_inference import combine_for_reading_2x, \ - restore_y_2x, restore_y_2x_with_cat_after, add_and_multiply, \ - replicate_pad, restore_y_4x, clamp_reciprocal_with_quant from .entropy_models import BitEstimator, GaussianEncoder, EntropyCoder +from ..layers.layers import LowerBound, QuantFunc, mse_weighted_average, get_mse_yuv_rgb +from ..utils.common import generate_str + + +class CkptModule(nn.Module): + def __init__(self): + super().__init__() + self.use_ckpt = False + + def internal_forward(self, *args, **kwargs): + raise NotImplementedError + + def set_use_ckpt(self, use_ckpt=True): + self.use_ckpt = use_ckpt + + def forward(self, *args, **kwargs): + if self.use_ckpt: + return torch.utils.checkpoint.checkpoint(self.internal_forward, *args, **kwargs, + preserve_rng_state=False, use_reentrant=False) + return self.internal_forward(*args, **kwargs) class CompressionModel(nn.Module): - def __init__(self, z_channel, extra_qp=0): + def __init__(self, z_channel): super().__init__() self.z_channel = z_channel self.entropy_coder = None - self.bit_estimator_z = BitEstimator(64 + extra_qp, z_channel) + self.proxy = None + self.bit_estimator_z = BitEstimator(self.qp_num(), z_channel) self.gaussian_encoder = GaussianEncoder() self.masks = {} - self.cuda_streams = {} - def get_cuda_stream(self, device, idx=0, priority=0): - key = f"{device}_{priority}_{idx}" - if key not in self.cuda_streams: - self.cuda_streams[key] = torch.cuda.Stream(device, priority=priority) - return self.cuda_streams[key] + self.prob_to_bits_factor = -1.0 / math.log(2.0) + + self.recon_range = 0.5 + + def _initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + torch.nn.init.xavier_normal_(m.weight, 1.) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0.) + + def _reset_cuda_proxies(self): + for module in self.modules(): + if hasattr(module, 'proxy'): + try: + module.proxy = None + except Exception: + pass + + def add_cdf_to_state_dict(self, state_dict): + keys = ['quantized_cdf', 'cdf_length'] + state_dict.update({'gaussian_encoder.'+key: torch.from_numpy(val) + for key, val in zip(keys, self.gaussian_encoder.get_cdf_info())}) + state_dict.update({'bit_estimator_z.'+key: torch.from_numpy(val) + for key, val in zip(keys, self.bit_estimator_z.get_cdf_info())}) + return state_dict @staticmethod - def get_qp_num(): - return 64 + def add_noise(x): + noise = torch.nn.init.uniform_(torch.empty_like(x), -0.5, 0.5) + return x + noise.detach() + + @staticmethod + def get_loss_info(rd, loss, pixel_num): + info = { + 'bpp_y': generate_str(rd['bits_y'] / pixel_num), + 'bpp_z': generate_str(rd['bits_z'] / pixel_num), + 'mse': generate_str(rd['mse']), + 'losses': generate_str(loss['losses']), + } + return info + + def get_mse(self, x, x_hat): + mse_yuv, mse_rgb = get_mse_yuv_rgb(x, x_hat) + + _, _, H, W = x.size() + pixel_num = H * W + mse = mse_weighted_average(mse_yuv, mse_rgb, pixel_num) + return mse + + @staticmethod + def get_one_mask(micro_mask, H, W): + mask = torch.tensor(micro_mask, dtype=torch.bool) + mask = mask.repeat((H + 1) // 2, (W + 1) // 2) + mask = mask[None, None, :H, :W] + return mask @staticmethod def get_padding_size(height, width, p=64): @@ -40,257 +107,176 @@ def get_padding_size(height, width, p=64): padding_bottom = new_h - height return padding_right, padding_bottom + def index_select_dim0(self, x, index): + if x is None: + return x + out = torch.index_select(x, 0, index)[:, :, None, None] + return out + + def probs_to_bits(self, probs): + dtype = probs.dtype + probs = probs.float() + bits = torch.log(LowerBound.apply(probs, 1e-6)) * self.prob_to_bits_factor + bits = LowerBound.apply(bits, 0) + return bits.to(dtype) + @staticmethod - def get_downsampled_shape(height, width, p): - new_h = (height + p - 1) // p * p - new_w = (width + p - 1) // p * p - return int(new_h / p + 0.5), int(new_w / p + 0.5) + def process_with_mask(y, scales, means, mask): + scales_hat = scales * mask + means_hat = means * mask - def update(self, force_zero_thres=None): - self.entropy_coder = EntropyCoder() - self.gaussian_encoder.update(self.entropy_coder, force_zero_thres=force_zero_thres) - self.bit_estimator_z.update(self.entropy_coder) + y_res = (y - means_hat) * mask + y_q = QuantFunc.apply(y_res) + y_hat = y_q + means_hat - def set_use_two_entropy_coders(self, use_two_entropy_coders): - self.entropy_coder.set_use_two_entropy_coders(use_two_entropy_coders) - - def pad_for_y(self, y): - _, _, H, W = y.size() - padding_r, padding_b = self.get_padding_size(H, W, 4) - y_pad = replicate_pad(y, padding_b, padding_r) - return y_pad - - def separate_prior(self, params, is_video=False): - if is_video: - quant_step, scales, means = params.chunk(3, 1) - quant_step = torch.clamp_min(quant_step, 0.5) - q_enc = 1. / quant_step - q_dec = quant_step - else: - q = params[:, :2, :, :] - q_enc, q_dec = (torch.sigmoid(q) * 1.5 + 0.5).chunk(2, 1) - scales, means = params[:, 2:, :, :].chunk(2, 1) - return q_enc, q_dec, scales, means + return y_res, y_q, y_hat, scales_hat @staticmethod - def separate_prior_for_video_encoding(params, y): - q_dec, scales, means = params.chunk(3, 1) - q_dec, y = clamp_reciprocal_with_quant(q_dec, y, 0.5) - return y, q_dec, scales, means + def qp_num(): + return 64 - @staticmethod - def separate_prior_for_video_decoding(params): + def separate_prior_image(self, params): + scales, means = params.chunk(2, 1) + return scales, means + + def separate_prior_video(self, params): quant_step, scales, means = params.chunk(3, 1) - quant_step = torch.clamp_min(quant_step, 0.5) - return quant_step, scales, means + quant_step = LowerBound.apply(quant_step, 0.5) + q_enc = 1. / quant_step + q_dec = quant_step + return q_enc, q_dec, scales, means - def process_with_mask(self, y, scales, means, mask): - return self.gaussian_encoder.process_with_mask(y, scales, means, mask) + def set_entropy_coder_parallel(self, entropy_coder_parallel): + self.entropy_coder.set_entropy_coder_parallel(entropy_coder_parallel) - @staticmethod - def get_one_mask(micro_mask, height, width, dtype, device): - mask = torch.tensor(micro_mask, dtype=dtype, device=device) - mask = mask.repeat((height + 1) // 2, (width + 1) // 2) - mask = mask[:height, :width] - mask = torch.unsqueeze(mask, 0) - mask = torch.unsqueeze(mask, 0) - return mask + def update(self, skip_thres): + self.entropy_coder = EntropyCoder() + self.gaussian_encoder.update(self.entropy_coder, skip_thres=skip_thres) + self.bit_estimator_z.update(self.entropy_coder) - def get_mask_4x(self, batch, channel, height, width, dtype, device): - curr_mask_str = f"{batch}_{channel}_{width}_{height}_4x" - with torch.no_grad(): - if curr_mask_str not in self.masks: - assert channel % 4 == 0 - m = torch.ones((batch, channel // 4, height, width), dtype=dtype, device=device) - m0 = self.get_one_mask(((1, 0), (0, 0)), height, width, dtype, device) - m1 = self.get_one_mask(((0, 1), (0, 0)), height, width, dtype, device) - m2 = self.get_one_mask(((0, 0), (1, 0)), height, width, dtype, device) - m3 = self.get_one_mask(((0, 0), (0, 1)), height, width, dtype, device) - - mask_0 = torch.cat((m * m0, m * m1, m * m2, m * m3), dim=1) - mask_1 = torch.cat((m * m3, m * m2, m * m1, m * m0), dim=1) - mask_2 = torch.cat((m * m2, m * m3, m * m0, m * m1), dim=1) - mask_3 = torch.cat((m * m1, m * m0, m * m3, m * m2), dim=1) - - self.masks[curr_mask_str] = [mask_0, mask_1, mask_2, mask_3] + @torch.no_grad() + def get_mask_2x(self, B, C, H, W, device): + curr_mask_str = f'{B}_{C}_{H}_{W}_2x' + if curr_mask_str not in self.masks: + assert C % 2 == 0 + m = torch.ones((B, C // 2, H, W), dtype=torch.bool) + m0 = self.get_one_mask(((1, 0), (0, 1)), H, W) + m1 = self.get_one_mask(((0, 1), (1, 0)), H, W) + + mask_0 = torch.cat((m * m0, m * m1), dim=1) + mask_0 = mask_0.to(device=device) + mask_1 = torch.cat((m * m1, m * m0), dim=1) + mask_1 = mask_1.to(device=device) + + self.masks[curr_mask_str] = [mask_0, mask_1] return self.masks[curr_mask_str] - def get_mask_2x(self, batch, channel, height, width, dtype, device): - curr_mask_str = f"{batch}_{channel}_{width}_{height}_2x" - with torch.no_grad(): - if curr_mask_str not in self.masks: - assert channel % 2 == 0 - m = torch.ones((batch, channel // 2, height, width), dtype=dtype, device=device) - m0 = self.get_one_mask(((1, 0), (0, 1)), height, width, dtype, device) - m1 = self.get_one_mask(((0, 1), (1, 0)), height, width, dtype, device) + @torch.no_grad() + def get_mask_4x(self, B, C, H, W, device): + curr_mask_str = f'{B}_{C}_{H}_{W}_4x' + if curr_mask_str not in self.masks: + assert C % 4 == 0 + m = torch.ones((B, C // 4, H, W), dtype=torch.bool) + m0 = self.get_one_mask(((1, 0), (0, 0)), H, W) + m1 = self.get_one_mask(((0, 1), (0, 0)), H, W) + m2 = self.get_one_mask(((0, 0), (1, 0)), H, W) + m3 = self.get_one_mask(((0, 0), (0, 1)), H, W) + + mask_0 = torch.cat((m * m0, m * m1, m * m2, m * m3), dim=1) + mask_0 = mask_0.to(device=device) + mask_1 = torch.cat((m * m3, m * m2, m * m1, m * m0), dim=1) + mask_1 = mask_1.to(device=device) + mask_2 = torch.cat((m * m2, m * m3, m * m0, m * m1), dim=1) + mask_2 = mask_2.to(device=device) + mask_3 = torch.cat((m * m1, m * m0, m * m3, m * m2), dim=1) + mask_3 = mask_3.to(device=device) + + self.masks[curr_mask_str] = [mask_0, mask_1, mask_2, mask_3] + return self.masks[curr_mask_str] - mask_0 = torch.cat((m * m0, m * m1), dim=1) - mask_1 = torch.cat((m * m1, m * m0), dim=1) + def get_y_bits(self, y, sigma): + probs = self.gaussian_encoder.get_prob_train(y, sigma) + return self.probs_to_bits(probs) - self.masks[curr_mask_str] = [mask_0, mask_1] - return self.masks[curr_mask_str] + def get_z_bits(self, z, index): + probs = self.bit_estimator_z.get_prob(z, index) + return self.probs_to_bits(probs) - @staticmethod - def single_part_for_writing_4x(x): - x0, x1, x2, x3 = x.chunk(4, 1) - return (x0 + x1) + (x2 + x3) + def load_state_dict(self, state_dict, *args, **kwargs): + res = super().load_state_dict(state_dict, *args, **kwargs) + # CUDA proxy params are cached via .set_param(self.state_dict()) on first use. + # When weights are reloaded, proxies must be reset to avoid using stale params. + self._reset_cuda_proxies() + return res - @staticmethod - def single_part_for_writing_2x(x): - x0, x1 = x.chunk(2, 1) - return x0 + x1 - - def compress_prior_2x(self, y, common_params, y_spatial_prior): - y, q_dec, scales, means = self.separate_prior_for_video_encoding(common_params, y) - dtype = y.dtype - device = y.device + def forward_prior_2x(self, y, common_params, y_spatial_prior): + q_enc, q_dec, scales, means = self.separate_prior_video(common_params) + y = y * q_enc + device = common_params.device B, C, H, W = y.size() - mask_0, mask_1 = self.get_mask_2x(B, C, H, W, dtype, device) - - _, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) - cat_params = torch.cat((y_hat_0, common_params), dim=1) - scales, means = y_spatial_prior(cat_params).chunk(2, 1) - _, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) - - y_hat = add_and_multiply(y_hat_0, y_hat_1, q_dec) - - y_q_w_0 = self.single_part_for_writing_2x(y_q_0) - y_q_w_1 = self.single_part_for_writing_2x(y_q_1) - s_w_0 = self.single_part_for_writing_2x(s_hat_0) - s_w_1 = self.single_part_for_writing_2x(s_hat_1) - return y_q_w_0, y_q_w_1, s_w_0, s_w_1, y_hat - - def decompress_prior_2x(self, common_params, y_spatial_prior): - infos = self.decompress_prior_2x_part1(common_params) - y_hat = self.decompress_prior_2x_part2(common_params, y_spatial_prior, infos) - return y_hat - - def decompress_prior_2x_part1(self, common_params): - q_dec, scales, means = self.separate_prior_for_video_decoding(common_params) - dtype = means.dtype - device = means.device - B, C, H, W = means.size() - mask_0, mask_1 = self.get_mask_2x(B, C, H, W, dtype, device) - - scales_r = combine_for_reading_2x(scales, mask_0, inplace=False) - indexes, skip_cond = self.gaussian_encoder.build_indexes_decoder(scales_r) - self.gaussian_encoder.decode_y(indexes) - infos = { - "q_dec": q_dec, - "mask_0": mask_0, - "mask_1": mask_1, - "means": means, - "scales_r": scales_r, - "skip_cond": skip_cond, - "indexes": indexes, - } - return infos + mask_0, mask_1 = self.get_mask_2x(B, C, H, W, device) + + y_res_0, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) + means = y_spatial_prior(y_hat_0, common_params) + y_res_1, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) + + y_hat = y_hat_0 + y_hat_1 + y_hat = y_hat * q_dec + + y_res = None if y_res_0 is None else y_res_0 + y_res_1 + y_q = None if y_q_0 is None else y_q_0 + y_q_1 + scales_hat = s_hat_0 + s_hat_1 + return y_res, y_q, y_hat, scales_hat + + def forward_prior_4x(self, y, q_enc, q_dec, + common_params, y_spatial_prior_reduction, + y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, + y_spatial_prior_adaptor_3, y_spatial_prior, + spatial_prior_has_scales=False): + if q_enc is None: + q_enc, q_dec, scales, means = self.separate_prior_video(common_params) + y = y * q_enc + else: + spatial_prior_has_scales = True + scales, means = self.separate_prior_image(common_params) + y = y * q_enc - def decompress_prior_2x_part2(self, common_params, y_spatial_prior, infos): - dtype = common_params.dtype - device = common_params.device - y_q_r = self.gaussian_encoder.get_y(infos["scales_r"].shape, - infos["scales_r"].numel(), - dtype, device, - infos["skip_cond"], infos["indexes"]) - y_hat_0, cat_params = restore_y_2x_with_cat_after(y_q_r, infos["means"], infos["mask_0"], - common_params) - scales, means = y_spatial_prior(cat_params).chunk(2, 1) - scales_r = combine_for_reading_2x(scales, infos["mask_1"], inplace=True) - y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) - y_hat_1 = restore_y_2x(y_q_r, means, infos["mask_1"]) - - y_hat = add_and_multiply(y_hat_0, y_hat_1, infos["q_dec"]) - return y_hat - - def compress_prior_4x(self, y, common_params, y_spatial_prior_reduction, - y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, - y_spatial_prior_adaptor_3, y_spatial_prior): - ''' - y_0 means split in channel, the 0/4 quater - y_1 means split in channel, the 1/4 quater - y_2 means split in channel, the 2/4 quater - y_3 means split in channel, the 3/4 quater - y_?_0, means multiply with mask_0 - y_?_1, means multiply with mask_1 - y_?_2, means multiply with mask_2 - y_?_3, means multiply with mask_3 - ''' - q_enc, q_dec, scales, means = self.separate_prior(common_params, False) common_params = y_spatial_prior_reduction(common_params) - dtype = y.dtype - device = y.device + device = common_params.device B, C, H, W = y.size() - mask_0, mask_1, mask_2, mask_3 = self.get_mask_4x(B, C, H, W, dtype, device) + mask_0, mask_1, mask_2, mask_3 = self.get_mask_4x(B, C, H, W, device) - y = y * q_enc - - _, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) + y_res_0, y_q_0, y_hat_0, s_hat_0 = self.process_with_mask(y, scales, means, mask_0) y_hat_so_far = y_hat_0 - params = torch.cat((y_hat_so_far, common_params), dim=1) - scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) - _, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) + if spatial_prior_has_scales: + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) + else: + means = y_spatial_prior(y_spatial_prior_adaptor_1(y_hat_so_far, common_params)) + y_res_1, y_q_1, y_hat_1, s_hat_1 = self.process_with_mask(y, scales, means, mask_1) y_hat_so_far = y_hat_so_far + y_hat_1 - params = torch.cat((y_hat_so_far, common_params), dim=1) - scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) - _, y_q_2, y_hat_2, s_hat_2 = self.process_with_mask(y, scales, means, mask_2) + if spatial_prior_has_scales: + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) + else: + means = y_spatial_prior(y_spatial_prior_adaptor_2(y_hat_so_far, common_params)) + y_res_2, y_q_2, y_hat_2, s_hat_2 = self.process_with_mask(y, scales, means, mask_2) y_hat_so_far = y_hat_so_far + y_hat_2 - params = torch.cat((y_hat_so_far, common_params), dim=1) - scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) - _, y_q_3, y_hat_3, s_hat_3 = self.process_with_mask(y, scales, means, mask_3) + if spatial_prior_has_scales: + params = torch.cat((y_hat_so_far, common_params), dim=1) + scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) + else: + means = y_spatial_prior(y_spatial_prior_adaptor_3(y_hat_so_far, common_params)) + y_res_3, y_q_3, y_hat_3, s_hat_3 = self.process_with_mask(y, scales, means, mask_3) y_hat = y_hat_so_far + y_hat_3 y_hat = y_hat * q_dec - y_q_w_0 = self.single_part_for_writing_4x(y_q_0) - y_q_w_1 = self.single_part_for_writing_4x(y_q_1) - y_q_w_2 = self.single_part_for_writing_4x(y_q_2) - y_q_w_3 = self.single_part_for_writing_4x(y_q_3) - s_w_0 = self.single_part_for_writing_4x(s_hat_0) - s_w_1 = self.single_part_for_writing_4x(s_hat_1) - s_w_2 = self.single_part_for_writing_4x(s_hat_2) - s_w_3 = self.single_part_for_writing_4x(s_hat_3) - return y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, s_w_0, s_w_1, s_w_2, s_w_3, y_hat - - def decompress_prior_4x(self, common_params, y_spatial_prior_reduction, - y_spatial_prior_adaptor_1, y_spatial_prior_adaptor_2, - y_spatial_prior_adaptor_3, y_spatial_prior): - _, quant_step, scales, means = self.separate_prior(common_params, False) - common_params = y_spatial_prior_reduction(common_params) - dtype = means.dtype - device = means.device - B, C, H, W = means.size() - mask_0, mask_1, mask_2, mask_3 = self.get_mask_4x(B, C, H, W, dtype, device) - - scales_r = self.single_part_for_writing_4x(scales * mask_0) - y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) - y_hat_curr_step = restore_y_4x(y_q_r, means, mask_0) - y_hat_so_far = y_hat_curr_step - - params = torch.cat((y_hat_so_far, common_params), dim=1) - scales, means = y_spatial_prior(y_spatial_prior_adaptor_1(params)).chunk(2, 1) - scales_r = self.single_part_for_writing_4x(scales * mask_1) - y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) - y_hat_curr_step = restore_y_4x(y_q_r, means, mask_1) - y_hat_so_far = y_hat_so_far + y_hat_curr_step - - params = torch.cat((y_hat_so_far, common_params), dim=1) - scales, means = y_spatial_prior(y_spatial_prior_adaptor_2(params)).chunk(2, 1) - scales_r = self.single_part_for_writing_4x(scales * mask_2) - y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) - y_hat_curr_step = restore_y_4x(y_q_r, means, mask_2) - y_hat_so_far = y_hat_so_far + y_hat_curr_step - - params = torch.cat((y_hat_so_far, common_params), dim=1) - scales, means = y_spatial_prior(y_spatial_prior_adaptor_3(params)).chunk(2, 1) - scales_r = self.single_part_for_writing_4x(scales * mask_3) - y_q_r = self.gaussian_encoder.decode_and_get_y(scales_r, dtype, device) - y_hat_curr_step = restore_y_4x(y_q_r, means, mask_3) - y_hat_so_far = y_hat_so_far + y_hat_curr_step - - y_hat = y_hat_so_far * quant_step - - return y_hat + y_res = None if y_res_0 is None else (y_res_0 + y_res_1) + (y_res_2 + y_res_3) + y_q = None if y_q_0 is None else (y_q_0 + y_q_1) + (y_q_2 + y_q_3) + scales_hat = (s_hat_0 + s_hat_1) + (s_hat_2 + s_hat_3) + + return y_res, y_q, y_hat, scales_hat diff --git a/src/models/entropy_models.py b/src/models/entropy_models.py index 9b64d28..4db9eb3 100644 --- a/src/models/entropy_models.py +++ b/src/models/entropy_models.py @@ -1,11 +1,30 @@ -import math +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import math import torch -import numpy as np + from torch import nn -import torch.nn.functional as F -from ..layers.cuda_inference import build_index_dec, build_index_enc, process_with_mask +from ..layers.layers import bit_estimator_z_fwd, bit_estimator_z_prob, LowerBound + + +MAX_ENTROPY_CODING_VALUE = 8 + + +class AEHelper(): + def __init__(self): + super().__init__() + self.entropy_coder = None + self._quantized_cdf = None + self._cdf_length = None + + def get_cdf_info(self): + return self._quantized_cdf, self._cdf_length + + def set_cdf_info(self, quantized_cdf, cdf_length): + self._quantized_cdf = quantized_cdf.cpu().numpy() + self._cdf_length = cdf_length.reshape(-1).int().cpu().numpy() class EntropyCoder(): @@ -17,257 +36,173 @@ def __init__(self): self.decoder = RansDecoder() @staticmethod - def pmf_to_quantized_cdf(pmf, precision=16): + def pmf_to_quantized_cdf(pmf): from MLCodec_extensions_cpp import pmf_to_quantized_cdf as _pmf_to_cdf - cdf = _pmf_to_cdf(pmf.tolist(), precision) + cdf = _pmf_to_cdf(pmf.tolist()) cdf = torch.IntTensor(cdf) return cdf + @staticmethod + def reorder_prob(prob): + # prob is with length l, with the last one tail_prob + # the first (l-1) probs are sysmmetric about 0, in increasing order + # we want to make the first a few probs in 0, 1, -1, 2, -2, ... order + length = prob.size(0) + prob1 = prob.clone() + center = (length - 1) // 2 + prob1[0] = prob[center] + for i in range(1, center + 1): + prob1[2 * i - 1] = prob[center + i] + prob1[2 * i - 0] = prob[center - i] + return prob1 + + def set_cdf(self, cdf, cdf_length, index): + self.encoder.set_cdf(cdf, cdf_length, index) + self.decoder.set_cdf(cdf, cdf_length, index) + + def set_entropy_coder_parallel(self, entropy_coder_parallel): + self.encoder.set_entropy_coder_parallel(entropy_coder_parallel) + self.decoder.set_entropy_coder_parallel(entropy_coder_parallel) + @staticmethod def pmf_to_cdf(pmf, tail_mass, pmf_length, max_length): - entropy_coder_precision = 16 cdf = torch.zeros((len(pmf_length), max_length + 2), dtype=torch.int32) for i, p in enumerate(pmf): prob = torch.cat((p[: pmf_length[i]], tail_mass[i]), dim=0) - _cdf = EntropyCoder.pmf_to_quantized_cdf(prob, entropy_coder_precision) + prob1 = EntropyCoder.reorder_prob(prob) + _cdf = EntropyCoder.pmf_to_quantized_cdf(prob1) cdf[i, : _cdf.size(0)] = _cdf return cdf - def reset(self): - self.encoder.reset() - - def add_cdf(self, cdf, cdf_length, offset): - enc_cdf_idx = self.encoder.add_cdf(cdf, cdf_length, offset) - dec_cdf_idx = self.decoder.add_cdf(cdf, cdf_length, offset) - assert enc_cdf_idx == dec_cdf_idx - return enc_cdf_idx - - def encode_y(self, symbols, cdf_group_index): - # symbols: int16, high 8 bits: int8 symbol to be encoded; low 8 bits: uint8 index to use - assert symbols.dtype == torch.int16 - self.encoder.encode_y(symbols.cpu().numpy(), cdf_group_index) - - def encode_z(self, symbols, cdf_group_index, start_offset, per_channel_size): - self.encoder.encode_z(symbols.to(torch.int8).cpu().numpy(), - cdf_group_index, start_offset, per_channel_size) - - def flush(self): - self.encoder.flush() - - def get_encoded_stream(self): - return self.encoder.get_encoded_stream().tobytes() - - def set_stream(self, stream): - self.decoder.set_stream((np.frombuffer(stream, dtype=np.uint8))) - - def decode_y(self, indexes, cdf_group_index): - self.decoder.decode_y(indexes.to(torch.uint8).cpu().numpy(), cdf_group_index) - - def decode_and_get_y(self, indexes, cdf_group_index, device, dtype): - rv = self.decoder.decode_and_get_y(indexes.to(torch.uint8).cpu().numpy(), cdf_group_index) - rv = torch.as_tensor(rv) - return rv.to(device).to(dtype) - - def decode_z(self, total_size, cdf_group_index, start_offset, per_channel_size): - self.decoder.decode_z(total_size, cdf_group_index, start_offset, per_channel_size) - - def get_decoded_tensor(self, device, dtype, non_blocking=False): - rv = self.decoder.get_decoded_tensor() - rv = torch.as_tensor(rv) - return rv.to(device, non_blocking=non_blocking).to(dtype) - - def set_use_two_entropy_coders(self, use_two_entropy_coders): - self.encoder.set_use_two_encoders(use_two_entropy_coders) - self.decoder.set_use_two_decoders(use_two_entropy_coders) - - -class Bitparm(nn.Module): - def __init__(self, qp_num, channel, final=False): - super().__init__() - self.final = final - self.h = nn.Parameter(torch.nn.init.normal_( - torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) - self.b = nn.Parameter(torch.nn.init.normal_( - torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) - if not final: - self.a = nn.Parameter(torch.nn.init.normal_( - torch.empty([qp_num, channel, 1, 1]), 0, 0.01)) - else: - self.a = None - - def forward(self, x, index): - h = torch.index_select(self.h, 0, index) - b = torch.index_select(self.b, 0, index) - x = x * F.softplus(h) + b - if self.final: - return x - - a = torch.index_select(self.a, 0, index) - return x + torch.tanh(x) * torch.tanh(a) - - -class AEHelper(): - def __init__(self): - super().__init__() - self.entropy_coder = None - self.cdf_group_index = None - self._offset = None - self._quantized_cdf = None - self._cdf_length = None - - def set_cdf_info(self, quantized_cdf, cdf_length, offset): - self._quantized_cdf = quantized_cdf.cpu().numpy() - self._cdf_length = cdf_length.reshape(-1).int().cpu().numpy() - self._offset = offset.reshape(-1).int().cpu().numpy() - - def get_cdf_info(self): - return self._quantized_cdf, \ - self._cdf_length, \ - self._offset - class BitEstimator(AEHelper, nn.Module): def __init__(self, qp_num, channel): super().__init__() - self.f1 = Bitparm(qp_num, channel) - self.f2 = Bitparm(qp_num, channel) - self.f3 = Bitparm(qp_num, channel) - self.f4 = Bitparm(qp_num, channel, True) + self.layer_num = 4 + self.h = nn.Parameter( + torch.nn.init.normal_(torch.empty([qp_num, channel, self.layer_num]), 0, 0.01)) + self.b = nn.Parameter( + torch.nn.init.normal_(torch.empty([qp_num, channel, self.layer_num]), 0, 0.01)) + self.a = nn.Parameter( + torch.nn.init.normal_(torch.empty([qp_num, channel, self.layer_num - 1]), 0, 0.01)) self.qp_num = qp_num self.channel = channel - def forward(self, x, index): - return self.get_cdf(x, index) + def get_hba(self, index, dtype=None): + if isinstance(index, int): + h = self.h[index:index+1, :, :] + b = self.b[index:index+1, :, :] + a = self.a[index:index+1, :, :] + else: + h = torch.index_select(self.h, 0, index) + b = torch.index_select(self.b, 0, index) + a = torch.index_select(self.a, 0, index) + if dtype is not None: + return h.to(dtype), b.to(dtype), a.to(dtype) + return h, b, a - def get_logits_cdf(self, x, index): - x = self.f1(x, index) - x = self.f2(x, index) - x = self.f3(x, index) - x = self.f4(x, index) - return x + def forward(self, x, index): + h, b, a = self.get_hba(index) + return bit_estimator_z_prob(x, h, b, a) - def get_cdf(self, x, index): - return torch.sigmoid(self.get_logits_cdf(x, index)) + def get_prob(self, x, index): + h, b, a = self.get_hba(index, dtype=x.dtype) + prob = bit_estimator_z_fwd(x, h, b, a) + return prob + @torch.inference_mode() def update(self, entropy_coder): self.entropy_coder = entropy_coder - with torch.no_grad(): - device = next(self.parameters()).device - medians = torch.zeros((self.qp_num, self.channel, 1, 1), device=device) - index = torch.arange(self.qp_num, device=device, dtype=torch.int32) - - minima = medians + 8 - for i in range(8, 1, -1): - samples = torch.zeros_like(medians) - i - probs = self.forward(samples, index) - minima = torch.where(probs < torch.zeros_like(medians) + 0.0001, - torch.zeros_like(medians) + i, minima) - - maxima = medians + 8 - for i in range(8, 1, -1): - samples = torch.zeros_like(medians) + i - probs = self.forward(samples, index) - maxima = torch.where(probs > torch.zeros_like(medians) + 0.9999, - torch.zeros_like(medians) + i, maxima) - - minima = minima.int() - maxima = maxima.int() - - offset = -minima - - pmf_start = medians - minima - pmf_length = maxima + minima + 1 + device = next(self.parameters()).device + zeros = torch.zeros((self.qp_num, self.channel, 1, 1), device=device) + index = torch.arange(self.qp_num, device=device, dtype=torch.int32) - max_length = pmf_length.max() - device = pmf_start.device - samples = torch.arange(max_length, device=device) + sym_range = zeros + MAX_ENTROPY_CODING_VALUE + for i in range(MAX_ENTROPY_CODING_VALUE, 1, -1): + neg_probs = self.forward(zeros - i, index) + pos_probs = self.forward(zeros + i, index) + sym_range = torch.where(torch.logical_and(neg_probs < 0.001, pos_probs > 0.999), + i, sym_range) - samples = samples[None, None, None, :] + pmf_start + sym_range = sym_range.int() + pmf_length = sym_range * 2 + 1 - half = float(0.5) + max_length = MAX_ENTROPY_CODING_VALUE * 2 + 1 + samples = torch.arange(max_length, device=device) + samples = samples[None, None, None, :] - sym_range - lower = self.forward(samples - half, index) - upper = self.forward(samples + half, index) - pmf = upper - lower - - pmf = pmf[:, :, 0, :] - upper = self.forward(maxima.to(torch.float32), index) - tail_mass = lower[:, :, 0, :1] + (1.0 - upper[:, :, 0, -1:]) - - pmf = pmf.reshape([-1, max_length]) - tail_mass = tail_mass.reshape([-1, 1]) - pmf_length = pmf_length.reshape([-1]) - offset = offset.reshape([-1]) - quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) - cdf_length = pmf_length + 2 - self.set_cdf_info(quantized_cdf, cdf_length, offset) - self.cdf_group_index = self.entropy_coder.add_cdf(*self.get_cdf_info()) - - def build_indexes(self, size, qp): - B, C, H, W = size - indexes = torch.arange(C, dtype=torch.int).view(1, -1, 1, 1) + qp * self.channel - return indexes.repeat(B, 1, H, W) - - def encode_z(self, x, qp): - _, _, H, W = x.size() - return self.entropy_coder.encode_z(x.reshape(-1), self.cdf_group_index, qp * self.channel, - H * W) + lower = self.forward(samples - 0.5, index) + upper = self.forward(samples + 0.5, index) + pmf = upper - lower - def decode_z(self, size, qp): - self.entropy_coder.decode_z(self.channel * size[0] * size[1], self.cdf_group_index, - qp * self.channel, size[0] * size[1]) + pmf = pmf[:, :, 0, :] + upper = self.forward(sym_range.float(), index) + tail_mass = lower[:, :, 0, :1] + (1.0 - upper[:, :, 0, -1:]) - def get_z(self, size, device, dtype): - output_size = (1, self.channel, size[0], size[1]) - val = self.entropy_coder.get_decoded_tensor(device, dtype, non_blocking=True) - return val.reshape(output_size) + pmf = pmf.reshape([-1, max_length]) + tail_mass = tail_mass.reshape([-1, 1]) + pmf_length = pmf_length.reshape([-1]) + quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) + cdf_length = pmf_length + 2 + self.set_cdf_info(quantized_cdf, cdf_length) + self.entropy_coder.set_cdf(*self.get_cdf_info(), 0) -class GaussianEncoder(AEHelper): +class GaussianEncoder(AEHelper, nn.Module): def __init__(self): super().__init__() self.scale_min = 0.11 self.scale_max = 16.0 - self.scale_level = 128 # <= 256 - self.scale_table = self.get_scale_table(self.scale_min, self.scale_max, self.scale_level) + self.scale_level = 128 + self.scale_table = self.get_scale_table() - self.log_scale_min = math.log(self.scale_min) - self.log_scale_max = math.log(self.scale_max) - self.log_scale_step = (self.log_scale_max - self.log_scale_min) / (self.scale_level - 1) - self.log_step_recip = 1. / self.log_scale_step - - self.force_zero_thres = None - self.decode_index_cache = {} - self.decode_zeros_cache = {} + self.skip_thres = 0 @staticmethod - def get_scale_table(min_val, max_val, levels): - return torch.exp(torch.linspace(math.log(min_val), math.log(max_val), levels)) - - def update(self, entropy_coder, force_zero_thres=None): + def get_prob_train(values, scales): + def _cdf2(inputs): + const = float(-(2 ** -0.5)) + return torch.erfc(const * inputs) + + dtype = values.dtype + values = values.float() + scales = scales.float() + scales = LowerBound.apply(scales, 0.11) + values = torch.abs(values) + upper = _cdf2((0.5 - values) / scales) + lower = _cdf2((-0.5 - values) / scales) + prob = upper - lower + prob = torch.clamp_min(0.5 * prob, 1e-9) + return prob.to(dtype) + + def get_scale_table(self): + return torch.exp(torch.linspace(math.log(self.scale_min), + math.log(self.scale_max), + self.scale_level)) + + def update(self, entropy_coder, skip_thres): self.entropy_coder = entropy_coder - self.force_zero_thres = force_zero_thres + self.skip_thres = skip_thres - pmf_center = torch.zeros_like(self.scale_table) + 8 - scales = torch.zeros_like(pmf_center) + self.scale_table + zeros = torch.zeros_like(self.scale_table) + sym_range = zeros + MAX_ENTROPY_CODING_VALUE + scales = self.scale_table cdf_distribution = torch.distributions.normal.Normal(0., scales) - for i in range(8, 1, -1): - samples = torch.zeros_like(pmf_center) + i + for i in range(MAX_ENTROPY_CODING_VALUE, 1, -1): + samples = zeros + i probs = cdf_distribution.cdf(samples) probs = torch.squeeze(probs) - pmf_center = torch.where(probs > torch.zeros_like(pmf_center) + 0.9999, - torch.zeros_like(pmf_center) + i, pmf_center) + sym_range = torch.where(probs > 0.999, i, sym_range) - pmf_center = pmf_center.int() - pmf_length = 2 * pmf_center + 1 - max_length = torch.max(pmf_length).item() + sym_range = sym_range.int() + pmf_length = 2 * sym_range + 1 + max_length = 2 * MAX_ENTROPY_CODING_VALUE + 1 - device = pmf_center.device - samples = torch.arange(max_length, device=device) - pmf_center[:, None] + samples = torch.arange(max_length, device=sym_range.device) - sym_range[:, None] samples = samples.float() - scales = torch.zeros_like(samples) + self.scale_table[:, None] + scales = self.scale_table[:, None] cdf_distribution = torch.distributions.normal.Normal(0., scales) upper = cdf_distribution.cdf(samples + 0.5) @@ -276,66 +211,7 @@ def update(self, entropy_coder, force_zero_thres=None): tail_mass = 2 * lower[:, :1] - quantized_cdf = torch.Tensor(len(pmf_length), max_length + 2) quantized_cdf = EntropyCoder.pmf_to_cdf(pmf, tail_mass, pmf_length, max_length) - self.set_cdf_info(quantized_cdf, pmf_length+2, -pmf_center) - self.cdf_group_index = self.entropy_coder.add_cdf(*self.get_cdf_info()) - - def process_with_mask(self, y, scales, means, mask): - return process_with_mask(y, scales, means, mask, self.force_zero_thres) - - def build_indexes_decoder(self, scales): - scales = scales.reshape(-1) - indexes, skip_cond = build_index_dec(scales, self.scale_min, self.scale_max, - self.log_scale_min, self.log_step_recip, - self.force_zero_thres) - if self.force_zero_thres is not None: - indexes = indexes[skip_cond] - return indexes, skip_cond - - def build_indexes_encoder(self, symbols, scales): - symbols = symbols.reshape(-1) - scales = scales.reshape(-1) - symbols = build_index_enc(symbols, scales, self.scale_min, self.scale_max, - self.log_scale_min, self.log_step_recip, self.force_zero_thres) - return symbols - - def encode_y(self, x, scales): - symbols = self.build_indexes_encoder(x, scales) - return self.entropy_coder.encode_y(symbols, self.cdf_group_index) - - def get_decode_index_cache(self, num, device): - if num not in self.decode_index_cache: - c = torch.arange(0, num, dtype=torch.int32, device=device) - self.decode_index_cache[num] = c - - return self.decode_index_cache[num] - - def get_decode_zeros_cache(self, num, device): - if num not in self.decode_zeros_cache: - c = torch.zeros(num, dtype=torch.int32, device=device) - self.decode_zeros_cache[num] = c - - return self.decode_zeros_cache[num].clone() - - def decode_and_get_y(self, scales, dtype, device): - indexes, skip_cond = self.build_indexes_decoder(scales) - self.decode_y(indexes) - return self.get_y(scales.shape, scales.numel(), dtype, device, skip_cond, indexes) - - def decode_y(self, indexes): - self.entropy_coder.decode_y(indexes, self.cdf_group_index) - - def get_y(self, shape, numel, dtype, device, skip_cond, indexes): - if len(indexes) == 0: - return torch.zeros(shape, dtype=dtype, device=device) - if skip_cond is not None: - curr_index = self.get_decode_index_cache(numel, device) - back_index = self.get_decode_zeros_cache(numel, device) - back_index.masked_scatter_(skip_cond, curr_index) - val = self.entropy_coder.get_decoded_tensor(device, dtype, non_blocking=True) - if skip_cond is not None: - y = torch.index_select(val, 0, back_index) * skip_cond - return y.reshape(shape) - return val.reshape(shape) + self.set_cdf_info(quantized_cdf, pmf_length+2) + self.entropy_coder.set_cdf(*self.get_cdf_info(), 1) diff --git a/src/models/image_model.py b/src/models/image_model.py index fa1ea67..8310924 100644 --- a/src/models/image_model.py +++ b/src/models/image_model.py @@ -1,57 +1,29 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +import numpy as np import torch -from torch import nn import torch.nn.functional as F +from torch import nn from .common_model import CompressionModel -from ..layers.layers import DepthConvBlock, ResidualBlockUpsample, ResidualBlockWithStride2 -from ..layers.cuda_inference import CUSTOMIZED_CUDA_INFERENCE, round_and_to_int8 - -g_ch_src = 3 * 8 * 8 -g_ch_enc_dec = 368 - - -class IntraEncoder(nn.Module): - def __init__(self, N): - super().__init__() - - self.enc_1 = DepthConvBlock(g_ch_src, g_ch_enc_dec) - self.enc_2 = nn.Sequential( - DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), - DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), - DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), - DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), - DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), - DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), - nn.Conv2d(g_ch_enc_dec, N, 3, stride=2, padding=1), - ) +from ..layers.layers import DepthConvBlock, QuantFunc, ResidualBlockUpsample, ResidualBlockWithStride2 +from ..utils.common import loss_func - def forward(self, x, quant_step): - out = F.pixel_unshuffle(x, 8) - if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: - return self.forward_torch(out, quant_step) - - return self.forward_cuda(out, quant_step) - def forward_torch(self, out, quant_step): - out = self.enc_1(out) - out = out * quant_step - return self.enc_2(out) - - def forward_cuda(self, out, quant_step): - out = self.enc_1(out, quant_step=quant_step) - return self.enc_2(out) +g_ch_src = 3 * 8 * 8 +g_ch_enc_dec = 384 +g_ch_y = 256 +g_ch_z = 128 class IntraDecoder(nn.Module): - def __init__(self, N): + def __init__(self): super().__init__() self.dec_1 = nn.Sequential( - ResidualBlockUpsample(N, g_ch_enc_dec), + ResidualBlockUpsample(g_ch_y, g_ch_enc_dec), DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), @@ -68,142 +40,188 @@ def __init__(self, N): self.dec_2 = DepthConvBlock(g_ch_enc_dec, g_ch_src) def forward(self, x, quant_step): - if not CUSTOMIZED_CUDA_INFERENCE or not x.is_cuda: - return self.forward_torch(x, quant_step) - - return self.forward_cuda(x, quant_step) - - def forward_torch(self, x, quant_step): out = self.dec_1(x) out = out * quant_step out = self.dec_2(out) out = F.pixel_shuffle(out, 8) return out - def forward_cuda(self, x, quant_step): - out = self.dec_1[0](x) - out = self.dec_1[1](out) - out = self.dec_1[2](out) - out = self.dec_1[3](out) - out = self.dec_1[4](out) - out = self.dec_1[5](out) - out = self.dec_1[6](out) - out = self.dec_1[7](out) - out = self.dec_1[8](out) - out = self.dec_1[9](out) - out = self.dec_1[10](out) - out = self.dec_1[11](out) - out = self.dec_1[12](out, quant_step=quant_step) - out = self.dec_2(out) - out = F.pixel_shuffle(out, 8) - return out +class IntraEncoder(nn.Module): + def __init__(self): + super().__init__() -class DMCI(CompressionModel): - def __init__(self, N=256, z_channel=128): - super().__init__(z_channel=z_channel) + self.enc_1 = DepthConvBlock(g_ch_src, g_ch_enc_dec) + self.enc_2 = nn.Sequential( + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + DepthConvBlock(g_ch_enc_dec, g_ch_enc_dec), + nn.Conv2d(g_ch_enc_dec, g_ch_y, 3, stride=2, padding=1), + ) + + def forward(self, x, quant_step): + out = F.pixel_unshuffle(x, 8) + out = self.enc_1(out) + out = out * quant_step + return self.enc_2(out) - self.enc = IntraEncoder(N) - self.hyper_enc = nn.Sequential( - DepthConvBlock(N, z_channel), - ResidualBlockWithStride2(z_channel, z_channel), - ResidualBlockWithStride2(z_channel, z_channel), +class IntraHyperDecoder(nn.Module): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + ResidualBlockUpsample(g_ch_z, g_ch_z), + ResidualBlockUpsample(g_ch_z, g_ch_z), + DepthConvBlock(g_ch_z, g_ch_y), ) - self.hyper_dec = nn.Sequential( - ResidualBlockUpsample(z_channel, z_channel), - ResidualBlockUpsample(z_channel, z_channel), - DepthConvBlock(z_channel, N), + def forward(self, x): + return self.conv(x) + + +class IntraHyperEncoder(nn.Module): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y, g_ch_z), + ResidualBlockWithStride2(g_ch_z, g_ch_z), + ResidualBlockWithStride2(g_ch_z, g_ch_z), ) - self.y_prior_fusion = nn.Sequential( - DepthConvBlock(N, N * 2), - DepthConvBlock(N * 2, N * 2), - DepthConvBlock(N * 2, N * 2), - nn.Conv2d(N * 2, N * 2 + 2, 1), + def forward(self, x): + return self.conv(x) + + +class IntraSpatialPrior(nn.Module): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + nn.Conv2d(g_ch_y * 2, g_ch_y * 2, 1), ) - self.y_spatial_prior_reduction = nn.Conv2d(N * 2 + 2, N * 1, 1) - self.y_spatial_prior_adaptor_1 = DepthConvBlock(N * 2, N * 2, force_adaptor=True) - self.y_spatial_prior_adaptor_2 = DepthConvBlock(N * 2, N * 2, force_adaptor=True) - self.y_spatial_prior_adaptor_3 = DepthConvBlock(N * 2, N * 2, force_adaptor=True) - self.y_spatial_prior = nn.Sequential( - DepthConvBlock(N * 2, N * 2), - DepthConvBlock(N * 2, N * 2), - DepthConvBlock(N * 2, N * 2), - nn.Conv2d(N * 2, N * 2, 1), + def forward(self, x): + return self.conv(x) + + +class IntraYPriorFusion(nn.Module): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y, g_ch_y * 2), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + nn.Conv2d(g_ch_y * 2, g_ch_y * 2, 1), ) - self.dec = IntraDecoder(N) + def forward(self, x): + return self.conv(x) + + +class DMCI(CompressionModel): + def __init__(self): + super().__init__(z_channel=g_ch_z) - self.q_scale_enc = nn.Parameter(torch.ones((self.get_qp_num(), g_ch_enc_dec, 1, 1))) - self.q_scale_dec = nn.Parameter(torch.ones((self.get_qp_num(), g_ch_enc_dec, 1, 1))) + self.enc = IntraEncoder() + self.hyper_enc = IntraHyperEncoder() - def compress(self, x, qp): - device = x.device - curr_q_enc = self.q_scale_enc[qp:qp+1, :, :, :] - curr_q_dec = self.q_scale_dec[qp:qp+1, :, :, :] + self.hyper_dec = IntraHyperDecoder() + self.y_prior_fusion = IntraYPriorFusion() + + self.y_spatial_prior_reduction = nn.Conv2d(g_ch_y * 2, g_ch_y, 1) + self.y_spatial_prior_adaptor_1 = DepthConvBlock(g_ch_y * 2, g_ch_y * 2, force_adaptor=True) + self.y_spatial_prior_adaptor_2 = DepthConvBlock(g_ch_y * 2, g_ch_y * 2, force_adaptor=True) + self.y_spatial_prior_adaptor_3 = DepthConvBlock(g_ch_y * 2, g_ch_y * 2, force_adaptor=True) + self.y_spatial_prior = IntraSpatialPrior() + + self.dec = IntraDecoder() + + self.q_scale_enc = nn.Parameter(torch.ones((self.qp_num(), g_ch_enc_dec))) + self.q_scale_dec = nn.Parameter(torch.ones((self.qp_num(), g_ch_enc_dec))) + self.q_scale_y_enc = nn.Parameter(torch.ones((self.qp_num(), g_ch_y))) + self.q_scale_y_dec = nn.Parameter(torch.ones((self.qp_num(), g_ch_y))) + self._initialize_weights() + + def forward_one_frame(self, x, qp, recon_only=False): + curr_q_enc = self.index_select_dim0(self.q_scale_enc, qp) + curr_q_dec = self.index_select_dim0(self.q_scale_dec, qp) + curr_y_q_enc = self.index_select_dim0(self.q_scale_y_enc, qp) + curr_y_q_dec = self.index_select_dim0(self.q_scale_y_dec, qp) y = self.enc(x, curr_q_enc) - y_pad = self.pad_for_y(y) - z = self.hyper_enc(y_pad) - z_hat, z_hat_write = round_and_to_int8(z) + z = self.hyper_enc(y) + z_hat = QuantFunc.apply(z) params = self.hyper_dec(z_hat) params = self.y_prior_fusion(params) _, _, yH, yW = y.shape - params = params[:, :, :yH, :yW].contiguous() - y_q_w_0, y_q_w_1, y_q_w_2, y_q_w_3, s_w_0, s_w_1, s_w_2, s_w_3, y_hat = \ - self.compress_prior_4x( - y, params, self.y_spatial_prior_reduction, - self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, - self.y_spatial_prior_adaptor_3, self.y_spatial_prior) - - cuda_event = torch.cuda.Event() - cuda_event.record() - x_hat = self.dec(y_hat, curr_q_dec).clamp_(0, 1) - - cuda_stream = self.get_cuda_stream(device=device, priority=-1) - with torch.cuda.stream(cuda_stream): - cuda_event.wait() - self.entropy_coder.reset() - self.bit_estimator_z.encode_z(z_hat_write, qp) - self.gaussian_encoder.encode_y(y_q_w_0, s_w_0) - self.gaussian_encoder.encode_y(y_q_w_1, s_w_1) - self.gaussian_encoder.encode_y(y_q_w_2, s_w_2) - self.gaussian_encoder.encode_y(y_q_w_3, s_w_3) - self.entropy_coder.flush() - - bit_stream = self.entropy_coder.get_encoded_stream() - - torch.cuda.synchronize(device=device) - result = { - "bit_stream": bit_stream, - "x_hat": x_hat, + params = params[:, :, :yH, :yW] + y_res, y_q, y_hat, scales_hat = self.forward_prior_4x( + y, curr_y_q_enc, curr_y_q_dec, + params, self.y_spatial_prior_reduction, + self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior) + + x_hat = self.dec(y_hat, curr_q_dec) + if recon_only: + return x_hat + + y_for_bit = self.add_noise(y_res) + z_for_bit = self.add_noise(z) + bits_y = self.get_y_bits(y_for_bit, scales_hat) + bits_z = self.get_z_bits(z_for_bit, qp) + + mse = self.get_mse(x, x_hat) + bits_y = torch.sum(bits_y, dim=(1, 2, 3)) + bits_z = torch.sum(bits_z, dim=(1, 2, 3)) + _, _, H, W = x.size() + pixel_num = H * W + bpp = (bits_y + bits_z) / pixel_num + + return { + 'x_hat': x_hat, + 'mse': mse, + 'bpp': bpp, + 'bits_y': bits_y, + 'bits_z': bits_z, } - return result - def decompress(self, bit_stream, sps, qp): - dtype = next(self.parameters()).dtype - device = next(self.parameters()).device - curr_q_dec = self.q_scale_dec[qp:qp+1, :, :, :] - - self.entropy_coder.set_use_two_entropy_coders(sps['ec_part'] == 1) - self.entropy_coder.set_stream(bit_stream) - z_size = self.get_downsampled_shape(sps['height'], sps['width'], 64) - y_height, y_width = self.get_downsampled_shape(sps['height'], sps['width'], 16) - self.bit_estimator_z.decode_z(z_size, qp) - z_q = self.bit_estimator_z.get_z(z_size, device, dtype) - z_hat = z_q + def compress(self, x, qp, padding_b, padding_r): + if self.proxy is None: + try: + from inference_extensions_cuda import DMCIProxy + except Exception: + raise NotImplementedError( + 'cannot import cuda implementation for inference. ' + 'Please build the inference extensions first.' + ) + state_dict = self.state_dict() + state_dict = self.add_cdf_to_state_dict(state_dict) + self.proxy = DMCIProxy() + self.proxy.set_param(state_dict, self.gaussian_encoder.skip_thres) + bit_stream, x_hat, ec_parallel = self.proxy.compress(x, qp, padding_b, padding_r) + return { + 'bit_stream': bit_stream.tobytes(), + 'x_hat': x_hat, + 'ec_parallel': ec_parallel, + } - params = self.hyper_dec(z_hat) - params = self.y_prior_fusion(params) - params = params[:, :, :y_height, :y_width].contiguous() - y_hat = self.decompress_prior_4x(params, self.y_spatial_prior_reduction, - self.y_spatial_prior_adaptor_1, - self.y_spatial_prior_adaptor_2, - self.y_spatial_prior_adaptor_3, self.y_spatial_prior) - - x_hat = self.dec(y_hat, curr_q_dec).clamp_(0, 1) - return {"x_hat": x_hat} + def decompress(self, bit_stream, sps, qp, ec_part): + x_hat = self.proxy.decompress( + np.frombuffer(bit_stream, dtype=np.uint8), qp, sps['height'], sps['width'], ec_part) + return {'x_hat': x_hat} + + def forward(self, x, qp, lambdas=None, get_loss_info=False, recon_only=False): + result = self.forward_one_frame(x, qp, recon_only) + loss = loss_func(result, lambdas) + info = None + if get_loss_info: + _, _, H, W = x.size() + pixel_num = H * W + info = self.get_loss_info(result, loss, pixel_num) + return loss['loss'], info diff --git a/src/models/video_model_ht.py b/src/models/video_model_ht.py new file mode 100644 index 0000000..f4dbaf2 --- /dev/null +++ b/src/models/video_model_ht.py @@ -0,0 +1,526 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import numpy as np +import torch +import torch.nn.functional as F + +from torch import nn + +from .common_model import CkptModule, CompressionModel +from ..layers.layers import SubpelConv2x, DepthConvBlock, QuantFunc, ResidualBlockUpsample, \ + ResidualBlockWithStride2, mse_8frames_sum +from ..utils.common import ModelStructure, loss_func + + +g_frame_delay = 8 +g_ch_src_d_intra = 3 * 8 * 8 +g_ch_src_d = g_ch_src_d_intra * g_frame_delay +g_ch_y = 256 +g_ch_z = 128 +g_ch_d = 512 +g_ch_m = 512 +g_ch_recon = 256 + + +class Decoder(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + self.up = SubpelConv2x(g_ch_y, g_ch_d, 1) + self.conv1 = nn.Sequential( + DepthConvBlock(g_ch_d * 2, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + ) + else: + self.up = SubpelConv2x(g_ch_y, g_ch_d, 3, padding=1, force_bias=True) + self.conv1 = nn.Sequential( + DepthConvBlock(g_ch_d * 2, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + ) + + def internal_forward(self, x, ctx, quant_step): + feature = self.up(x) + feature = self.conv1(torch.cat((feature, ctx), dim=1)) + feature = feature * quant_step + return feature + + +class Encoder(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + self.conv1 = nn.Sequential( + DepthConvBlock(g_ch_src_d + g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + ) + else: + self.conv1 = nn.Sequential( + DepthConvBlock(g_ch_src_d + g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + ) + self.down = nn.Conv2d(g_ch_d, g_ch_y, 3, stride=2, padding=1) + + def internal_forward(self, x, ctx, quant_step): + feature = F.pixel_unshuffle(x, 8) + feature = self.conv1(torch.cat((feature, ctx), dim=1)) + feature = feature * quant_step + feature = self.down(feature) + return feature + + +class FeatureAdaptorI(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + self.conv = nn.Sequential( + DepthConvBlock(g_ch_src_d_intra, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + ) + else: + self.conv = nn.Sequential( + DepthConvBlock(g_ch_src_d_intra, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + ) + + def internal_forward(self, x): + return self.conv(x) + + +class FeatureAdaptorM(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + self.conv = nn.Sequential( + DepthConvBlock(g_ch_m + g_ch_d, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + ) + else: + self.conv = nn.Sequential( + DepthConvBlock(g_ch_m + g_ch_d, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + DepthConvBlock(g_ch_m, g_ch_m), + ) + + def internal_forward(self, memory, feature): + return self.conv(torch.cat((memory, feature), dim=1)) + + +class FeatureExtractor(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + self.conv = nn.Sequential( + DepthConvBlock(g_ch_m, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + ) + else: + self.conv = nn.Sequential( + DepthConvBlock(g_ch_m, g_ch_d), + DepthConvBlock(g_ch_d, g_ch_d), + ) + + def internal_forward(self, x): + return self.conv(x) + + +class HyperDecoder(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + kwargs = {"shortcut": False} + else: + kwargs = {"force_bias": True} + self.conv = nn.Sequential( + ResidualBlockUpsample(g_ch_z, g_ch_y, **kwargs), + ResidualBlockUpsample(g_ch_y, g_ch_y, **kwargs), + DepthConvBlock(g_ch_y, g_ch_y), + ) + + def internal_forward(self, x): + return self.conv(x) + + +class HyperEncoder(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + kwargs = {"shortcut": False} + else: + kwargs = {} + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y, g_ch_y), + ResidualBlockWithStride2(g_ch_y, g_ch_y, **kwargs), + ResidualBlockWithStride2(g_ch_y, g_ch_z, **kwargs), + ) + + def internal_forward(self, x): + return self.conv(x) + + +class PriorFusion(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y * 3, g_ch_y * 3), + DepthConvBlock(g_ch_y * 3, g_ch_y * 3), + DepthConvBlock(g_ch_y * 3, g_ch_y * 3), + nn.Conv2d(g_ch_y * 3, g_ch_y * 3, 1), + ) + + def internal_forward(self, x1, x2): + return self.conv(torch.cat((x1, x2), dim=1)) + + +class ReconHead(CkptModule): + def __init__(self, is_hts): + super().__init__() + self.is_hts = is_hts + if is_hts: + self.conv1 = nn.ModuleList() + for _ in range(g_frame_delay // 2): + self.conv1.append( + nn.Sequential( + DepthConvBlock(g_ch_d, g_ch_d), + ) + ) + + self.conv2 = nn.ModuleList() + for _ in range(g_frame_delay): + self.conv2.append( + nn.Sequential( + DepthConvBlock(g_ch_d, g_ch_recon), + DepthConvBlock(g_ch_recon, g_ch_recon), + DepthConvBlock(g_ch_recon, g_ch_recon), + nn.Conv2d(g_ch_recon, g_ch_src_d_intra, 1), + ) + ) + else: + self.conv = nn.ModuleList() + for _ in range(g_frame_delay): + self.conv.append( + nn.Sequential( + DepthConvBlock(g_ch_d, g_ch_recon), + DepthConvBlock(g_ch_recon, g_ch_recon), + DepthConvBlock(g_ch_recon, g_ch_recon), + DepthConvBlock(g_ch_recon, g_ch_recon), + DepthConvBlock(g_ch_recon, g_ch_recon), + nn.Conv2d(g_ch_recon, g_ch_src_d_intra, 1), + ) + ) + + def internal_forward(self, x, for_reset=False): + if self.is_hts: + if for_reset: + out = self.conv1[-1](x) + return self.conv2[-1](out) + + all_out = [] + for i in range(g_frame_delay): + if i % 2 == 0: + common = self.conv1[i // 2](x) + out = self.conv2[i](common) + out = F.pixel_shuffle(out, 8) + all_out.append(out) + return all_out + else: + if for_reset: + return self.conv[-1](x) + + all_out = [] + for i in range(g_frame_delay): + out = self.conv[i](x) + out = F.pixel_shuffle(out, 8) + all_out.append(out) + return all_out + + +class SpatialPrior(CkptModule): + def __init__(self, is_hts): + super().__init__() + out_ch = g_ch_y * 1 if is_hts else g_ch_y * 2 + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2), + nn.Conv2d(g_ch_y * 2, out_ch, 1), + ) + + def internal_forward(self, x): + return self.conv(x) + + +class SpatialPriorAdaptor(DepthConvBlock): + def __init__(self, in_ch, out_ch, *, dcb2=False, shortcut=False, force_adaptor=True, + is_hts=True): + assert force_adaptor + super().__init__(in_ch, out_ch, dcb2=dcb2, shortcut=shortcut, force_adaptor=force_adaptor) + self.is_hts = is_hts + + def forward(self, x1, x2=None): + if self.is_hts: + return super().forward(torch.cat((x1, x2), dim=1)) + else: + return super().forward(x1) + + +class TemporalPriorEncoder(CkptModule): + def __init__(self, is_hts): + super().__init__() + if is_hts: + kwargs = {"shortcut": False} + else: + kwargs = {} + self.conv = ResidualBlockWithStride2(g_ch_d, g_ch_y * 2, **kwargs) + + def internal_forward(self, x, quant): + return self.conv(x * quant) + + +class DMC(CompressionModel): + def __init__(self, model_structure=ModelStructure.HTS): + super().__init__(z_channel=g_ch_z) + + self.is_hts = model_structure == ModelStructure.HTS + + self.feature_adaptor_i = FeatureAdaptorI(self.is_hts) + self.feature_adaptor_m = FeatureAdaptorM(self.is_hts) + self.feature_extractor = FeatureExtractor(self.is_hts) + + self.encoder = Encoder(self.is_hts) + self.hyper_encoder = HyperEncoder(self.is_hts) + + self.hyper_decoder = HyperDecoder(self.is_hts) + self.temporal_prior_encoder = TemporalPriorEncoder(self.is_hts) + self.y_prior_fusion = PriorFusion() + self.y_spatial_prior_reduction = nn.Conv2d(g_ch_y * 3, g_ch_y, 1) + self.y_spatial_prior_adaptor_1 = SpatialPriorAdaptor( + g_ch_y * 2, g_ch_y * 2, is_hts=self.is_hts) + self.y_spatial_prior_adaptor_2 = SpatialPriorAdaptor( + g_ch_y * 2, g_ch_y * 2, is_hts=self.is_hts) + self.y_spatial_prior_adaptor_3 = SpatialPriorAdaptor( + g_ch_y * 2, g_ch_y * 2, is_hts=self.is_hts) + self.y_spatial_prior = SpatialPrior(self.is_hts) + self.decoder = Decoder(self.is_hts) + + self.recon_head = ReconHead(self.is_hts) + + self.q_encoder = nn.Parameter(torch.ones((self.qp_num(), g_ch_d))) + self.q_decoder = nn.Parameter(torch.ones((self.qp_num(), g_ch_d))) + self.q_feature = nn.Parameter(torch.ones((self.qp_num(), g_ch_d))) + self._initialize_weights() + + self.ref_feature = None + self.memory = None + self.ctx = None + + def apply_feature_adaptor(self): + if self.memory is None: + self.memory = self.feature_adaptor_i(self.ref_feature) + else: + self.memory = self.feature_adaptor_m(self.memory, self.ref_feature) + self.ctx = self.feature_extractor(self.memory) + + def clear_dpb(self): + self.ref_feature = None + self.memory = None + self.ctx = None + + def get_rd_info(self, res): + dist_weights = [1.5, 0.16, 0.4] + assert g_frame_delay == 8 + mse = mse_8frames_sum(res['mse'], dist_weights) + + rd = { + 'bits_y': res['bits_y'], + 'bits_z': res['bits_z'], + 'bpp': res['bpp'], + 'mse': mse, + } + return rd + + def get_recon_and_feature(self, y_hat, ctx, q_decoder): + feature = self.decoder(y_hat, ctx, q_decoder) + x_hat = self.recon_head(feature) + return x_hat, feature + + def res_prior_param_decoder(self, z_hat, memory, q_feature): + temporal_params = self.temporal_prior_encoder(memory, q_feature) + hyper_params = self.hyper_decoder(z_hat) + params = self.y_prior_fusion(hyper_params, temporal_params) + return params + + def set_use_ckpt(self, use_ckpt=True): + self.feature_adaptor_i.set_use_ckpt(use_ckpt) + self.feature_adaptor_m.set_use_ckpt(use_ckpt) + self.feature_extractor.set_use_ckpt(use_ckpt) + self.temporal_prior_encoder.set_use_ckpt(use_ckpt) + self.encoder.set_use_ckpt(use_ckpt) + self.decoder.set_use_ckpt(use_ckpt) + self.recon_head.set_use_ckpt(use_ckpt) + self.hyper_encoder.set_use_ckpt(use_ckpt) + self.hyper_decoder.set_use_ckpt(use_ckpt) + self.y_prior_fusion.set_use_ckpt(use_ckpt) + self.y_spatial_prior.set_use_ckpt(use_ckpt) + + def set_ref_feature(self, feature, reset_feature_memory): + self.ref_feature = feature + if reset_feature_memory: + feature = self.recon_head(feature, for_reset=True) + self.clear_dpb() + self.ref_feature = feature + + def add_ref_feature_from_frame(self, frame, apply_feature_adaptor=True): + if self.training: + self.ref_feature = F.pixel_unshuffle(frame, 8) + return + if self.proxy is None: + try: + if self.is_hts: + from inference_extensions_cuda import DMCHTSProxy + proxy_cls = DMCHTSProxy + else: + from inference_extensions_cuda import DMCHTLProxy + proxy_cls = DMCHTLProxy + except Exception: + raise NotImplementedError( + 'cannot import cuda implementation for inference. ' + 'Please build the inference extensions first.' + ) + state_dict = self.state_dict() + state_dict = self.add_cdf_to_state_dict(state_dict) + self.proxy = proxy_cls() + self.proxy.set_param(state_dict, self.gaussian_encoder.skip_thres) + return self.proxy.add_ref_feature_from_frame(frame, apply_feature_adaptor) + + def compress(self, x, qp, reset_feature_memory, padding_b, padding_r): + bit_stream, ec_parallel = self.proxy.compress( + x, qp, reset_feature_memory, padding_b, padding_r) + return { + 'bit_stream': bit_stream.tobytes(), + 'ec_parallel': ec_parallel, + } + + def decompress(self, bit_stream, sps, qp, ec_part, reset_feature_memory): + x_hat = self.proxy.decompress((np.frombuffer(bit_stream, dtype=np.uint8)), + qp, sps['height'], sps['width'], ec_part, + reset_feature_memory) + return { + 'x_hat': x_hat, + } + + def forward_one_frame(self, x, qp, reset_feature_memory=False): + q_encoder = self.index_select_dim0(self.q_encoder, qp) + q_decoder = self.index_select_dim0(self.q_decoder, qp) + q_feature = self.index_select_dim0(self.q_feature, qp) + self.apply_feature_adaptor() + + y = self.encoder(x, self.ctx, q_encoder) + + z = self.hyper_encoder(y) + z_hat = QuantFunc.apply(z) + + params = self.res_prior_param_decoder(z_hat, self.memory, q_feature) + y_res, y_q, y_hat, scales_hat = self.forward_prior_4x( + y, None, None, params, self.y_spatial_prior_reduction, + self.y_spatial_prior_adaptor_1, self.y_spatial_prior_adaptor_2, + self.y_spatial_prior_adaptor_3, self.y_spatial_prior, + spatial_prior_has_scales=not self.is_hts) + + x_hat, feature = self.get_recon_and_feature(y_hat, self.ctx, q_decoder) + + self.set_ref_feature(feature, reset_feature_memory) + + y_for_bit = self.add_noise(y_res) + z_for_bit = self.add_noise(z) + bits_y = self.get_y_bits(y_for_bit, scales_hat) + bits_z = self.get_z_bits(z_for_bit, qp) + + x_split = x.chunk(g_frame_delay, 1) + mse_list = [] + for x_one, x_hat_one in zip(x_split, x_hat): + mse = self.get_mse(x_one, x_hat_one) + mse_list.append(mse) + bits_y = torch.sum(bits_y, dim=(1, 2, 3)) + bits_z = torch.sum(bits_z, dim=(1, 2, 3)) + _, _, H, W = x.size() + pixel_num = H * W + bpp = (bits_y + bits_z) / pixel_num + + return { + 'bits_y': bits_y, + 'bits_z': bits_z, + 'bpp': bpp, + 'mse': mse_list, + 'x_hat': x_hat, + } + + def forward(self, x, qp, lambdas=None, get_loss_info=False, curr_poc=0): + if not isinstance(x, list): + result = self.forward_one_frame(x, qp) + rd = self.get_rd_info(result) + loss = loss_func(rd, lambdas) + self.ref_feature = self.ref_feature.detach() + self.memory = self.memory.detach() + info = None + if get_loss_info: + _, _, H, W = x.size() + pixel_num = H * W + info = self.get_loss_info(rd, loss, pixel_num) + return loss['loss'], info + + frame_nums = len(x) + losses = [] + for frame_index in range(frame_nums): + cur_frame = x[frame_index] + result = self.forward_one_frame(cur_frame, qp) + rd = self.get_rd_info(result) + loss = loss_func(rd, lambdas) + losses.append(loss['loss']) + info = None + if get_loss_info: + _, _, H, W = x[0].size() + pixel_num = H * W + info = self.get_loss_info(rd, loss, pixel_num) + loss = torch.mean(torch.stack(losses)) + return loss, info diff --git a/src/models/video_model_ld.py b/src/models/video_model_ld.py new file mode 100644 index 0000000..24091b3 --- /dev/null +++ b/src/models/video_model_ld.py @@ -0,0 +1,376 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import numpy as np +import torch +import torch.nn.functional as F + +from torch import nn + +from .common_model import CkptModule, CompressionModel +from ..layers.layers import SubpelConv2x, DepthConvBlock, QuantFunc, ResidualBlockUpsample, \ + ResidualBlockWithStride2 +from ..utils.common import loss_func + + +g_frame_delay = 1 +g_ch_src_d = 3 * 8 * 8 +g_ch_y = 128 +g_ch_z = 128 +g_ch_d = 256 +g_ch_m = 256 + + +class Decoder(CkptModule): + def __init__(self): + super().__init__() + self.up = SubpelConv2x(g_ch_y, g_ch_d, 1) + self.conv1 = nn.Sequential( + DepthConvBlock(g_ch_d + g_ch_m, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + ) + self.conv2 = nn.Conv2d(g_ch_d, g_ch_d, 1) + + def internal_forward(self, x, ctx, quant_step): + feature = self.up(x) + feature = self.conv1(torch.cat((feature, ctx), dim=1)) + feature = self.conv2(feature) + feature = feature * quant_step + return feature + + +class Encoder(CkptModule): + def __init__(self): + super().__init__() + self.conv1 = nn.Sequential( + DepthConvBlock(g_ch_src_d + g_ch_m, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + ) + self.conv2 = DepthConvBlock(g_ch_d, g_ch_d, dcb2=True) + self.down = nn.Conv2d(g_ch_d, g_ch_y, 3, stride=2, padding=1) + + def internal_forward(self, x, ctx, quant_step): + feature = F.pixel_unshuffle(x, 8) + feature = self.conv1(torch.cat((feature, ctx), dim=1)) + feature = self.conv2(feature) + feature = feature * quant_step + feature = self.down(feature) + return feature + + +class FeatureAdaptorI(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_src_d, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + ) + + self.proxy = None + + def internal_forward(self, x): + return self.conv(x) + + +class FeatureAdaptorM(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_m + g_ch_d, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + ) + + def internal_forward(self, memory, feature): + return self.conv(torch.cat((memory, feature), dim=1)) + + +class FeatureExtractor(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + DepthConvBlock(g_ch_m, g_ch_m, dcb2=True), + ) + + self.proxy = None + + def internal_forward(self, x): + return self.conv(x) + + +class HyperDecoder(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + ResidualBlockUpsample(g_ch_z, g_ch_z, dcb2=True, shortcut=False), + ResidualBlockUpsample(g_ch_z, g_ch_z, dcb2=True, shortcut=False), + DepthConvBlock(g_ch_z, g_ch_y, dcb2=True), + ) + + self.proxy = None + + def internal_forward(self, x): + return self.conv(x) + + +class HyperEncoder(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y, g_ch_z, dcb2=True), + ResidualBlockWithStride2(g_ch_z, g_ch_z, dcb2=True, shortcut=False), + ResidualBlockWithStride2(g_ch_z, g_ch_z, dcb2=True, shortcut=False), + ) + + def internal_forward(self, x): + return self.conv(x) + + +class PriorFusion(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y * 3, g_ch_y * 3, dcb2=True), + DepthConvBlock(g_ch_y * 3, g_ch_y * 3, dcb2=True), + DepthConvBlock(g_ch_y * 3, g_ch_y * 3, dcb2=True), + nn.Conv2d(g_ch_y * 3, g_ch_y * 3, 1), + ) + + def internal_forward(self, x1, x2, quant): + return self.conv(torch.cat((x1, x2 * quant), dim=1)) + + +class ReconHead(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + DepthConvBlock(g_ch_d, g_ch_d, dcb2=True), + ) + self.head = nn.Conv2d(g_ch_d, g_ch_src_d, 1) + + def internal_forward(self, x, for_reset=False): + out = self.conv(x) + out = self.head(out) + if for_reset: + return out + return F.pixel_shuffle(out, 8) + + +class SpatialPrior(CkptModule): + def __init__(self): + super().__init__() + self.conv = nn.Sequential( + DepthConvBlock(g_ch_y * 4, g_ch_y * 2, dcb2=True), + DepthConvBlock(g_ch_y * 2, g_ch_y * 2, dcb2=True), + nn.Conv2d(g_ch_y * 2, g_ch_y * 1, 1), + ) + + def internal_forward(self, x1, x2): + return self.conv(torch.cat((x1, x2), dim=1)) + + +class TemporalPriorEncoder(CkptModule): + def __init__(self): + super().__init__() + self.conv = ResidualBlockWithStride2(g_ch_m, g_ch_y * 2, dcb2=True, shortcut=False) + + def internal_forward(self, x): + return self.conv(x) + + +class DMC(CompressionModel): + def __init__(self): + super().__init__(z_channel=g_ch_z) + + self.feature_adaptor_i = FeatureAdaptorI() + self.feature_adaptor_m = FeatureAdaptorM() + self.feature_extractor = FeatureExtractor() + + self.encoder = Encoder() + self.hyper_encoder = HyperEncoder() + + self.hyper_decoder = HyperDecoder() + self.temporal_prior_encoder = TemporalPriorEncoder() + self.y_prior_fusion = PriorFusion() + self.y_spatial_prior = SpatialPrior() + self.decoder = Decoder() + + self.recon_head = ReconHead() + + self.q_encoder = nn.Parameter(torch.ones((self.qp_num(), g_ch_d))) + self.q_decoder = nn.Parameter(torch.ones((self.qp_num(), g_ch_d))) + self.q_feature = nn.Parameter(torch.ones((self.qp_num(), g_ch_y * 2))) + self._initialize_weights() + + self.ref_feature = None + self.memory = None + self.ctx = None + + def apply_feature_adaptor(self): + if self.memory is None: + self.memory = self.feature_adaptor_i(self.ref_feature) + else: + self.memory = self.feature_adaptor_m(self.memory, self.ref_feature) + self.ctx = self.feature_extractor(self.memory) + + def clear_dpb(self): + self.ref_feature = None + self.memory = None + self.ctx = None + + def get_rd_info(self, result, fa_idx): + dist_weights = [0.52, 1.33, 0.83] + dist_weight = dist_weights[fa_idx] + rd = { + 'bits_y': result['bits_y'], + 'bits_z': result['bits_z'], + 'bpp': result['bpp'], + 'mse': result['mse'] * dist_weight, + } + return rd + + def get_recon_and_feature(self, y_hat, ctx, q_decoder): + feature = self.decoder(y_hat, ctx, q_decoder) + x_hat = self.recon_head(feature) + return x_hat, feature + + def res_prior_param_decoder(self, z_hat, memory, q_feature): + temporal_params = self.temporal_prior_encoder(memory) + hyper_params = self.hyper_decoder(z_hat) + params = self.y_prior_fusion(hyper_params, temporal_params, q_feature) + return params + + def set_use_ckpt(self, use_ckpt=True): + self.feature_adaptor_i.set_use_ckpt(use_ckpt) + self.feature_adaptor_m.set_use_ckpt(use_ckpt) + self.feature_extractor.set_use_ckpt(use_ckpt) + self.temporal_prior_encoder.set_use_ckpt(use_ckpt) + self.encoder.set_use_ckpt(use_ckpt) + self.decoder.set_use_ckpt(use_ckpt) + self.recon_head.set_use_ckpt(use_ckpt) + self.hyper_encoder.set_use_ckpt(use_ckpt) + self.hyper_decoder.set_use_ckpt(use_ckpt) + self.y_prior_fusion.set_use_ckpt(use_ckpt) + self.y_spatial_prior.set_use_ckpt(use_ckpt) + + def set_ref_feature(self, feature, reset_feature_memory): + self.ref_feature = feature + if reset_feature_memory: + feature = self.recon_head(feature, for_reset=True) + self.clear_dpb() + self.ref_feature = feature + + def add_ref_feature_from_frame(self, frame, apply_feature_adaptor=True): + if self.training: + self.ref_feature = F.pixel_unshuffle(frame, 8) + return + if self.proxy is None: + try: + from inference_extensions_cuda import DMCLDProxy + except Exception: + raise NotImplementedError( + 'cannot import cuda implementation for inference. ' + 'Please build the inference extensions first.' + ) + state_dict = self.state_dict() + state_dict = self.add_cdf_to_state_dict(state_dict) + self.proxy = DMCLDProxy() + self.proxy.set_param(state_dict, self.gaussian_encoder.skip_thres) + return self.proxy.add_ref_feature_from_frame(frame, apply_feature_adaptor) + + def compress(self, x, qp, reset_feature_memory, padding_b, padding_r): + bit_stream, ec_parallel = self.proxy.compress( + x, qp, reset_feature_memory, padding_b, padding_r) + return { + 'bit_stream': bit_stream.tobytes(), + 'ec_parallel': ec_parallel, + } + + def decompress(self, bit_stream, sps, qp, ec_part, reset_feature_memory): + x_hat = self.proxy.decompress((np.frombuffer(bit_stream, dtype=np.uint8)), + qp, sps['height'], sps['width'], ec_part, + reset_feature_memory) + + return { + 'x_hat': x_hat, + } + + def forward_one_frame(self, x, qp, reset_feature_memory=False): + q_encoder = self.index_select_dim0(self.q_encoder, qp) + q_decoder = self.index_select_dim0(self.q_decoder, qp) + q_feature = self.index_select_dim0(self.q_feature, qp) + self.apply_feature_adaptor() + + y = self.encoder(x, self.ctx, q_encoder) + + z = self.hyper_encoder(y) + z_hat = QuantFunc.apply(z) + + params = self.res_prior_param_decoder(z_hat, self.memory, q_feature) + y_res, y_q, y_hat, scales_hat = self.forward_prior_2x(y, params, self.y_spatial_prior) + + x_hat, feature = self.get_recon_and_feature(y_hat, self.ctx, q_decoder) + + self.set_ref_feature(feature, reset_feature_memory) + + y_for_bit = self.add_noise(y_res) + z_for_bit = self.add_noise(z) + bits_y = self.get_y_bits(y_for_bit, scales_hat) + bits_z = self.get_z_bits(z_for_bit, qp) + + mse = self.get_mse(x, x_hat) + bits_y = torch.sum(bits_y, dim=(1, 2, 3)) + bits_z = torch.sum(bits_z, dim=(1, 2, 3)) + _, _, H, W = x.size() + pixel_num = H * W + bpp = (bits_y + bits_z) / pixel_num + + return {'bits_y': bits_y, + 'bits_z': bits_z, + 'bpp': bpp, + 'mse': mse, + 'x_hat': x_hat, + } + + def forward(self, x, qp, lambdas=None, get_loss_info=False, curr_poc=0): + index_map = [0, 1, 0, 2, 0, 2, 0, 2] + if not isinstance(x, list): + fa_idx = index_map[curr_poc % 8] + result = self.forward_one_frame(x, qp) + rd = self.get_rd_info(result, fa_idx) + loss = loss_func(rd, lambdas) + self.ref_feature = self.ref_feature.detach() + self.memory = self.memory.detach() + info = None + if get_loss_info: + _, _, H, W = x.size() + pixel_num = H * W + info = self.get_loss_info(rd, loss, pixel_num) + return loss['loss'], info + + frame_nums = len(x) + losses = [] + for frame_index in range(frame_nums): + cur_frame = x[frame_index] + fa_idx = index_map[(frame_index + 1) % 8] + result = self.forward_one_frame(cur_frame, qp) + rd = self.get_rd_info(result, fa_idx) + loss = loss_func(rd, lambdas) + losses.append(loss['loss']) + info = None + if get_loss_info: + _, _, H, W = x[0].size() + pixel_num = H * W + info = self.get_loss_info(rd, loss, pixel_num) + loss = torch.mean(torch.stack(losses)) + return loss, info diff --git a/src/utils/common.py b/src/utils/common.py index a7599c0..a370b9e 100644 --- a/src/utils/common.py +++ b/src/utils/common.py @@ -2,58 +2,41 @@ # Licensed under the MIT License. import json +import numpy as np import os -from unittest.mock import patch - import torch -from torch.nn.modules.utils import consume_prefix_in_state_dict_if_present -import numpy as np - +import torch.distributed as dist +import torch.multiprocessing as mp -def str2bool(v): - return str(v).lower() in ("yes", "y", "true", "t", "1") +from enum import Enum +from torch.nn.modules.utils import consume_prefix_in_state_dict_if_present +from torch.nn.parallel import DistributedDataParallel as DDP +from torch.utils.data import DataLoader, RandomSampler +from torch.utils.data.distributed import DistributedSampler +from unittest.mock import patch -def set_torch_env(): - os.environ['CUBLAS_WORKSPACE_CONFIG'] = ":4096:8" - torch.backends.cudnn.enabled = True - torch.backends.cudnn.benchmark = False - torch.use_deterministic_algorithms(True) - torch.manual_seed(0) - torch.set_num_threads(1) - np.random.seed(seed=0) - try: - # require pytorch >= 2.2.0 - torch.utils.deterministic.fill_uninitialized_memory = False - except Exception: # pylint: disable=W0718 - pass +def cleanup_train(rank): + if rank >= 0: + dist.destroy_process_group() def create_folder(path, print_if_create=False): if not os.path.exists(path): os.makedirs(path) if print_if_create: - print(f"created folder: {path}") - - -def get_state_dict(ckpt_path): - ckpt = torch.load(ckpt_path, map_location=torch.device('cpu'), weights_only=True) - if "state_dict" in ckpt: - ckpt = ckpt['state_dict'] - if "net" in ckpt: - ckpt = ckpt["net"] - consume_prefix_in_state_dict_if_present(ckpt, prefix="module.") - return ckpt + print(f'created folder: {path}') @patch('json.encoder.c_make_encoder', None) def dump_json(obj, fid, float_digits=-1, **kwargs): - of = json.encoder._make_iterencode # pylint: disable=W0212 + of = json.encoder._make_iterencode def inner(*args, **kwargs): args = list(args) - # fifth argument is float formater which we will replace - args[4] = lambda o: format(o, '.%df' % float_digits) + # fifth argument is float formatter which we may replace + if float_digits is not None and float_digits >= 0: + args[4] = lambda o: format(o, f'.{int(float_digits)}f') return of(*args, **kwargs) with patch('json.encoder._make_iterencode', wraps=inner): @@ -64,114 +47,252 @@ def generate_log_json(frame_num, frame_pixel_num, test_time, frame_types, bits, verbose=False, avg_encoding_time=None, avg_decoding_time=None): include_yuv = len(psnrs[0]) > 1 assert not include_yuv or (len(psnrs[0]) == 4 and len(ssims[0]) == 4) - i_bits = 0 - i_psnr = 0 - i_psnr_y = 0 - i_psnr_u = 0 - i_psnr_v = 0 - i_ssim = 0 - i_ssim_y = 0 - i_ssim_u = 0 - i_ssim_v = 0 - p_bits = 0 - p_psnr = 0 - p_psnr_y = 0 - p_psnr_u = 0 - p_psnr_v = 0 - p_ssim = 0 - p_ssim_y = 0 - p_ssim_u = 0 - p_ssim_v = 0 - i_num = 0 - p_num = 0 + + # Accumulate stats for i-frames (frame_type==0) and p-frames (frame_type!=0) + metrics = ['psnr', 'ssim'] + (['psnr_y', 'psnr_u', 'psnr_v', 'ssim_y', 'ssim_u', 'ssim_v'] + if include_yuv else []) + metric_idx = {'psnr': 0, 'ssim': 0, 'psnr_y': 1, 'psnr_u': 2, 'psnr_v': 3, + 'ssim_y': 1, 'ssim_u': 2, 'ssim_v': 3} + i_sum = {m: 0 for m in metrics} + p_sum = {m: 0 for m in metrics} + i_sum['bits'], p_sum['bits'] = 0, 0 + i_num, p_num = 0, 0 + for idx in range(frame_num): - if frame_types[idx] == 0: - i_bits += bits[idx] - i_psnr += psnrs[idx][0] - i_ssim += ssims[idx][0] + is_i_frame = frame_types[idx] == 0 + target = i_sum if is_i_frame else p_sum + target['bits'] += bits[idx] + for m in metrics: + src = psnrs if 'psnr' in m else ssims + target[m] += src[idx][metric_idx[m]] + if is_i_frame: i_num += 1 - if include_yuv: - i_psnr_y += psnrs[idx][1] - i_psnr_u += psnrs[idx][2] - i_psnr_v += psnrs[idx][3] - i_ssim_y += ssims[idx][1] - i_ssim_u += ssims[idx][2] - i_ssim_v += ssims[idx][3] else: - p_bits += bits[idx] - p_psnr += psnrs[idx][0] - p_ssim += ssims[idx][0] p_num += 1 - if include_yuv: - p_psnr_y += psnrs[idx][1] - p_psnr_u += psnrs[idx][2] - p_psnr_v += psnrs[idx][3] - p_ssim_y += ssims[idx][1] - p_ssim_u += ssims[idx][2] - p_ssim_v += ssims[idx][3] - - log_result = {} - log_result['frame_pixel_num'] = frame_pixel_num - log_result['i_frame_num'] = i_num - log_result['p_frame_num'] = p_num - log_result['ave_i_frame_bpp'] = i_bits / i_num / frame_pixel_num - log_result['ave_i_frame_psnr'] = i_psnr / i_num - log_result['ave_i_frame_msssim'] = i_ssim / i_num - if include_yuv: - log_result['ave_i_frame_psnr_y'] = i_psnr_y / i_num - log_result['ave_i_frame_psnr_u'] = i_psnr_u / i_num - log_result['ave_i_frame_psnr_v'] = i_psnr_v / i_num - log_result['ave_i_frame_msssim_y'] = i_ssim_y / i_num - log_result['ave_i_frame_msssim_u'] = i_ssim_u / i_num - log_result['ave_i_frame_msssim_v'] = i_ssim_v / i_num + + log_result = { + 'frame_pixel_num': frame_pixel_num, + 'i_frame_num': i_num, + 'p_frame_num': p_num, + } + for prefix, num, sums in [('i', i_num, i_sum), ('p', p_num, p_sum)]: + log_result[f'ave_{prefix}_frame_bpp'] = ( + sums['bits'] / num / frame_pixel_num if num > 0 else 0) + log_result[f'ave_{prefix}_frame_psnr'] = sums['psnr'] / num if num > 0 else 0 + log_result[f'ave_{prefix}_frame_msssim'] = sums['ssim'] / num if num > 0 else 0 + if include_yuv: + for suffix in ['y', 'u', 'v']: + log_result[f'ave_{prefix}_frame_psnr_{suffix}'] = ( + sums[f'psnr_{suffix}'] / num if num > 0 else 0) + log_result[f'ave_{prefix}_frame_msssim_{suffix}'] = ( + sums[f'ssim_{suffix}'] / num if num > 0 else 0) + if verbose: log_result['frame_bpp'] = list(np.array(bits) / frame_pixel_num) log_result['frame_psnr'] = [v[0] for v in psnrs] log_result['frame_msssim'] = [v[0] for v in ssims] log_result['frame_type'] = frame_types if include_yuv: - log_result['frame_psnr_y'] = [v[1] for v in psnrs] - log_result['frame_psnr_u'] = [v[2] for v in psnrs] - log_result['frame_psnr_v'] = [v[3] for v in psnrs] - log_result['frame_msssim_y'] = [v[1] for v in ssims] - log_result['frame_msssim_u'] = [v[2] for v in ssims] - log_result['frame_msssim_v'] = [v[3] for v in ssims] + for suffix, idx in [('y', 1), ('u', 2), ('v', 3)]: + log_result[f'frame_psnr_{suffix}'] = [v[idx] for v in psnrs] + log_result[f'frame_msssim_{suffix}'] = [v[idx] for v in ssims] + log_result['test_time'] = test_time - if p_num > 0: - total_p_pixel_num = p_num * frame_pixel_num - log_result['ave_p_frame_bpp'] = p_bits / total_p_pixel_num - log_result['ave_p_frame_psnr'] = p_psnr / p_num - log_result['ave_p_frame_msssim'] = p_ssim / p_num - if include_yuv: - log_result['ave_p_frame_psnr_y'] = p_psnr_y / p_num - log_result['ave_p_frame_psnr_u'] = p_psnr_u / p_num - log_result['ave_p_frame_psnr_v'] = p_psnr_v / p_num - log_result['ave_p_frame_msssim_y'] = p_ssim_y / p_num - log_result['ave_p_frame_msssim_u'] = p_ssim_u / p_num - log_result['ave_p_frame_msssim_v'] = p_ssim_v / p_num - else: - log_result['ave_p_frame_bpp'] = 0 - log_result['ave_p_frame_psnr'] = 0 - log_result['ave_p_frame_msssim'] = 0 - if include_yuv: - log_result['ave_p_frame_psnr_y'] = 0 - log_result['ave_p_frame_psnr_u'] = 0 - log_result['ave_p_frame_psnr_v'] = 0 - log_result['ave_p_frame_msssim_y'] = 0 - log_result['ave_p_frame_msssim_u'] = 0 - log_result['ave_p_frame_msssim_v'] = 0 - log_result['ave_all_frame_bpp'] = (i_bits + p_bits) / (frame_num * frame_pixel_num) - log_result['ave_all_frame_psnr'] = (i_psnr + p_psnr) / frame_num - log_result['ave_all_frame_msssim'] = (i_ssim + p_ssim) / frame_num + + total_bits = i_sum['bits'] + p_sum['bits'] + log_result['ave_all_frame_bpp'] = total_bits / (frame_num * frame_pixel_num) + log_result['ave_all_frame_psnr'] = (i_sum['psnr'] + p_sum['psnr']) / frame_num + log_result['ave_all_frame_msssim'] = (i_sum['ssim'] + p_sum['ssim']) / frame_num if avg_encoding_time is not None and avg_decoding_time is not None: log_result['avg_frame_encoding_time'] = avg_encoding_time log_result['avg_frame_decoding_time'] = avg_decoding_time if include_yuv: - log_result['ave_all_frame_psnr_y'] = (i_psnr_y + p_psnr_y) / frame_num - log_result['ave_all_frame_psnr_u'] = (i_psnr_u + p_psnr_u) / frame_num - log_result['ave_all_frame_psnr_v'] = (i_psnr_v + p_psnr_v) / frame_num - log_result['ave_all_frame_msssim_y'] = (i_ssim_y + p_ssim_y) / frame_num - log_result['ave_all_frame_msssim_u'] = (i_ssim_u + p_ssim_u) / frame_num - log_result['ave_all_frame_msssim_v'] = (i_ssim_v + p_ssim_v) / frame_num + for suffix in ['y', 'u', 'v']: + log_result[f'ave_all_frame_psnr_{suffix}'] = ( + i_sum[f'psnr_{suffix}'] + p_sum[f'psnr_{suffix}']) / frame_num + log_result[f'ave_all_frame_msssim_{suffix}'] = ( + i_sum[f'ssim_{suffix}'] + p_sum[f'ssim_{suffix}']) / frame_num return log_result + + +def generate_str(x): + return ' '.join(f'{a.item():.5f}' for a in x) + ' ' + + +def get_current_device(rank): + if rank <= 0: + print(f'cuda device count: {torch.cuda.device_count()}') + + if rank >= 0: + device = f'cuda:{rank}' + elif torch.cuda.device_count() > 0: + device = 'cuda:0' + else: + device = 'cpu' + print(f'rank: {rank}, current device: {device}') + return device + + +def get_dataloader(dataset, rank, world_size, batch_size, num_workers): + if rank >= 0: + train_sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank) + assert batch_size % world_size == 0 + arg_batch_size = batch_size // world_size + else: + train_sampler = RandomSampler(dataset) + arg_batch_size = batch_size + return DataLoader( + dataset, + batch_size=arg_batch_size, + num_workers=num_workers, + shuffle=False, + pin_memory=True, + drop_last=True, + sampler=train_sampler, + prefetch_factor=2, + ) + + +def get_latest_status_path(dir_cur): + files = os.listdir(dir_cur) + all_status_files = [os.path.join(dir_cur, f) for f in files if 'status_epo' in f] + all_status_files.sort(key=os.path.getmtime) + if len(all_status_files) > 2: + return all_status_files[-2:] + return all_status_files + + +def loss_func(rd, lambdas): + costs = lambdas * rd['mse'] + rd['bpp'] + return { + 'losses': costs, + 'loss': torch.mean(costs), + } + + +def get_state_dict(ckpt_path): + ckpt = torch.load(ckpt_path, map_location=torch.device('cpu'), weights_only=True) + if 'state_dict' in ckpt: + ckpt = ckpt['state_dict'] + if 'net' in ckpt: + ckpt = ckpt['net'] + consume_prefix_in_state_dict_if_present(ckpt, prefix='module.') + return ckpt + + +def get_training_lambdas(lambdas, qp_num): + all_lambdas = np.linspace(np.log(lambdas[0]), np.log(lambdas[1]), qp_num) + all_lambdas = np.exp(all_lambdas) + return all_lambdas + + +def init_train(rank, save_dir): + torch.backends.cudnn.enabled = True + torch.backends.cudnn.benchmark = True + torch.backends.cuda.matmul.allow_tf32 = True + torch.backends.cudnn.allow_tf32 = True + world_size = 1 + if rank >= 0: + torch.cuda.set_device(rank) + world_size = torch.cuda.device_count() + dist.init_process_group(backend='nccl', init_method='env://', + world_size=world_size, rank=rank) + + if rank <= 0: + create_folder(save_dir) + + return world_size + + +def load_existing_weights(save_dir, net, rank, pretrain_path=None): + begin_epoch = 0 + opt_status = None + ckpt_loaded = False + existing_status_path = get_latest_status_path(save_dir) + for status_path in reversed(existing_status_path): + try: + status = torch.load(status_path, map_location=torch.device('cpu'), + weights_only=True) + opt_status = status['opt'] + begin_epoch = status['epoch'] + 1 + ckpt_loaded = True + if rank <= 0: + net_status = status['net'] + consume_prefix_in_state_dict_if_present(net_status, prefix='module.') + net.load_state_dict(net_status) + print(f'load status from {status_path}') + print(f'begin epoch {begin_epoch}') + break + except Exception: + continue + + if not ckpt_loaded and pretrain_path is not None: + if rank <= 0: + net_state_dict = get_state_dict(pretrain_path) + net.load_state_dict(net_state_dict) + print(f'load pretrained weights from {pretrain_path}') + + return begin_epoch, opt_status + + +def save_ckpt(save_dir, net): + ckpt_path = os.path.join(save_dir, 'ckpt.pth.tar') + net = net.module if isinstance(net, DDP) else net + torch.save({'state_dict': net.state_dict()}, ckpt_path) + print(f'save final checkpoint to {ckpt_path}') + + +def save_status(save_dir, net, opt, epoch): + curr_path = os.path.join(save_dir, f'status_epo{epoch}.pth.tar') + net = net.module if isinstance(net, DDP) else net + save_dict = { + 'epoch': epoch, + 'net': net.state_dict(), + 'opt': opt.state_dict(), + } + torch.save(save_dict, curr_path) + print(f'save model epoch {epoch}') + + for f in os.listdir(save_dir): + full_path = os.path.join(save_dir, f) + if 'status_epo' in f and full_path != curr_path: + if os.path.exists(full_path): + os.remove(full_path) + + +def set_torch_env(): + os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8' + torch.backends.cudnn.enabled = True + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + torch.manual_seed(0) + torch.set_num_threads(1) + np.random.seed(seed=0) + torch.utils.deterministic.fill_uninitialized_memory = False + + +def start_train(train_fun, args): + if torch.cuda.device_count() > 1: + os.environ['MASTER_ADDR'] = 'localhost' + os.environ['MASTER_PORT'] = str(12355) + world_size = torch.cuda.device_count() + mp.spawn(train_fun, nprocs=world_size, args=(args,), join=True) + else: + train_fun(-1, args) + + +def str2bool(v): + return str(v).lower() in ['yes', 'y', 'true', 't', '1'] + + +def wrap_ddp(net, rank, find_unused_parameters=False): + if rank >= 0: + net = DDP(net, device_ids=[rank], find_unused_parameters=find_unused_parameters) + return net + + +class ModelStructure(Enum): + HTL = 'htl' + HTS = 'hts' + LD = 'ld' diff --git a/src/utils/metrics.py b/src/utils/metrics.py index 869a9ab..111e3fa 100644 --- a/src/utils/metrics.py +++ b/src/utils/metrics.py @@ -2,8 +2,26 @@ # Licensed under the MIT License. import numpy as np -from scipy import signal + from scipy import ndimage +from scipy import signal + + +def calc_psnr(img1, img2, data_range=255): + ''' + img1 and img2 are arrays with same shape + ''' + img1 = img1.astype(np.float64) + img2 = img2.astype(np.float64) + mse = np.mean(np.square(img1 - img2)) + if np.isnan(mse) or np.isinf(mse): + return -999.9 + if mse > 1e-10: + psnr = 10 * np.log10(data_range * data_range / mse) + else: + psnr = 999.9 + psnr = min(psnr, 99.9) + return psnr def fspecial_gauss(size, sigma): @@ -58,14 +76,11 @@ def calc_msssim(img1, img2, data_range=255): ssim_map, cs_map = calc_ssim(im1, im2, data_range=data_range) mssim = np.append(mssim, ssim_map.mean()) mcs = np.append(mcs, cs_map.mean()) - filtered_im1 = ndimage.filters.convolve(im1, downsample_filter, - mode='reflect') - filtered_im2 = ndimage.filters.convolve(im2, downsample_filter, - mode='reflect') + filtered_im1 = ndimage.convolve(im1, downsample_filter, mode='reflect') + filtered_im2 = ndimage.convolve(im2, downsample_filter, mode='reflect') im1 = filtered_im1[::2, ::2] im2 = filtered_im2[::2, ::2] - return (np.prod(mcs[0:level - 1]**weight[0:level - 1]) * - (mssim[level - 1]**weight[level - 1])) + return (np.prod(mcs[0:level - 1]**weight[0:level - 1]) * (mssim[level - 1]**weight[level - 1])) def calc_msssim_rgb(img1, img2, data_range=255): @@ -76,21 +91,3 @@ def calc_msssim_rgb(img1, img2, data_range=255): for i in range(3): msssim += calc_msssim(img1[i, :, :], img2[i, :, :], data_range) return msssim / 3 - - -def calc_psnr(img1, img2, data_range=255): - ''' - img1 and img2 are arrays with same shape - ''' - img1 = img1.astype(np.float64) - img2 = img2.astype(np.float64) - mse = np.mean(np.square(img1 - img2)) - if np.isnan(mse) or np.isinf(mse): - return -999.9 - if mse > 1e-10: - psnr = 10 * np.log10(data_range * data_range / mse) - else: - psnr = 999.9 - if psnr > 99.9: - psnr = 99.9 - return psnr diff --git a/src/utils/stream_helper.py b/src/utils/stream_helper.py index 1450782..d9e633f 100644 --- a/src/utils/stream_helper.py +++ b/src/utils/stream_helper.py @@ -1,19 +1,20 @@ # Copyright 2020 InterDigital Communications, Inc. # -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, +# distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import enum import struct + from pathlib import Path @@ -23,46 +24,83 @@ def filesize(filepath: str) -> int: return Path(filepath).stat().st_size -def write_uints(fd, values, fmt=">{:d}I"): - fd.write(struct.pack(fmt.format(len(values)), *values)) - return len(values) * 4 +def read_bytes(fd, n, fmt='>{:d}s'): + sz = struct.calcsize('s') + return struct.unpack(fmt.format(n), fd.read(n * sz))[0] -def write_uchars(fd, values, fmt=">{:d}B"): - fd.write(struct.pack(fmt.format(len(values)), *values)) - return len(values) +def read_uchars(fd, n, fmt='>{:d}B'): + sz = struct.calcsize('B') + return struct.unpack(fmt.format(n), fd.read(n * sz)) -def read_uints(fd, n, fmt=">{:d}I"): - sz = struct.calcsize("I") - return struct.unpack(fmt.format(n), fd.read(n * sz)) +def read_header(f): + header = {} + flag = read_uchars(f, 1)[0] + nal_type = flag >> 4 + header['nal_type'] = NalType(nal_type) + if nal_type < 3: + header['sps_id'] = flag & 0x0f + return header + + frame_num_minus1 = flag & 0x0f + frame_num = frame_num_minus1 + 1 + header['frame_num'] = frame_num + sps_ids = [] + for _ in range(0, frame_num, 2): + flag = read_uchars(f, 1)[0] + sps_ids.append(flag >> 4) + sps_ids.append(flag & 0x0f) + sps_ids = sps_ids[:frame_num] + header['sps_ids'] = sps_ids + return header -def read_uchars(fd, n, fmt=">{:d}B"): - sz = struct.calcsize("B") - return struct.unpack(fmt.format(n), fd.read(n * sz)) +def read_uint_adaptive(f): + a3 = read_uchars(f, 1)[0] + if (a3 >> 7) == 0: + return a3 + + a2 = read_uchars(f, 1)[0] + + if (a3 >> 6) == 0x02: + a3 = a3 & 0x3f + return (a3 << 8) + a2 + a3 = a3 & 0x3f + a1 = read_uchars(f, 1)[0] + a0 = read_uchars(f, 1)[0] + return (a3 << 24) + (a2 << 16) + (a1 << 8) + a0 + + +def read_ip_remaining(f): + flag = read_uchars(f, 1)[0] + qp = flag + flag = read_uchars(f, 1)[0] + ec_part = (flag >> 1) & 0x7f + reset_feature_memory = flag & 0x01 + stream_length = read_uint_adaptive(f) + bit_stream = read_bytes(f, stream_length) + return qp, ec_part, reset_feature_memory, bit_stream + + +def read_sps_remaining(f, sps_id): + sps = {} + sps['sps_id'] = sps_id + sps['height'] = read_uint_adaptive(f) + sps['width'] = read_uint_adaptive(f) + return sps -def write_bytes(fd, values, fmt=">{:d}s"): +def write_bytes(fd, values, fmt='>{:d}s'): if len(values) == 0: return 0 fd.write(struct.pack(fmt.format(len(values)), values)) return len(values) -def read_bytes(fd, n, fmt=">{:d}s"): - sz = struct.calcsize("s") - return struct.unpack(fmt.format(n), fd.read(n * sz))[0] - - -def write_ushorts(fd, values, fmt=">{:d}H"): +def write_uchars(fd, values, fmt='>{:d}B'): fd.write(struct.pack(fmt.format(len(values)), *values)) - return len(values) * 2 - - -def read_ushorts(fd, n, fmt=">{:d}H"): - sz = struct.calcsize("H") - return struct.unpack(fmt.format(n), fd.read(n * sz)) + return len(values) def write_uint_adaptive(f, a): @@ -89,20 +127,31 @@ def write_uint_adaptive(f, a): return 4 -def read_uint_adaptive(f): - a3 = read_uchars(f, 1)[0] - if (a3 >> 7) == 0: - return a3 +def write_ip(f, is_i_frame, sps_id, qp, ec_part, reset_feature_memory, bit_stream): + written = 0 + flag = (int(NalType.NAL_I if is_i_frame else NalType.NAL_P) << 4) + sps_id + written += write_uchars(f, (flag,)) + assert 0 <= qp < 256 + written += write_uchars(f, (qp,)) + # ec_part(7), reset_feature_memory(1) + flag = (ec_part << 1) + reset_feature_memory + written += write_uchars(f, (flag,)) + written += write_uint_adaptive(f, len(bit_stream)) + written += write_bytes(f, bit_stream) + return written - a2 = read_uchars(f, 1)[0] - if (a3 >> 6) == 0x02: - a3 = a3 & 0x3f - return (a3 << 8) + a2 - a3 = a3 & 0x3f - a1 = read_uchars(f, 1)[0] - a0 = read_uchars(f, 1)[0] - return (a3 << 24) + (a2 << 16) + (a1 << 8) + a0 +def write_sps(f, sps): + # nal_type(4), sps_id(4) + # height (variable) + # width (variable) + assert sps['sps_id'] < 16 + written = 0 + flag = int((NalType.NAL_SPS << 4) + sps['sps_id']) + written += write_uchars(f, (flag,)) + written += write_uint_adaptive(f, sps['height']) + written += write_uint_adaptive(f, sps['width']) + return written class NalType(enum.IntEnum): @@ -116,24 +165,9 @@ def __init__(self): super().__init__() self.spss = [] - def get_sps_id(self, target_sps): - min_id = -1 - for sps in self.spss: - if sps['height'] == target_sps['height'] and sps['width'] == target_sps['width'] and \ - sps['use_ada_i'] == target_sps['use_ada_i'] and \ - sps['ec_part'] == target_sps['ec_part']: - return sps['sps_id'], False - if sps['sps_id'] > min_id: - min_id = sps['sps_id'] - assert min_id < 15 - sps = target_sps.copy() - sps['sps_id'] = min_id + 1 - self.spss.append(sps) - return sps['sps_id'], True - def add_sps_by_id(self, sps): - for i in range(len(self.spss)): - if self.spss[i]['sps_id'] == sps['sps_id']: + for i, existing_sps in enumerate(self.spss): + if existing_sps['sps_id'] == sps['sps_id']: self.spss[i] = sps.copy() return self.spss.append(sps.copy()) @@ -144,74 +178,15 @@ def get_sps_by_id(self, sps_id): return sps return None - -def write_sps(f, sps): - # nal_type(4), sps_id(4) - # height (variable) - # width (vairable) - # 0(6), ec_part(1) use_ada_i(1) - assert sps['sps_id'] < 16 - assert sps['use_ada_i'] < 2 - written = 0 - flag = int((NalType.NAL_SPS << 4) + sps['sps_id']) - written += write_uchars(f, (flag,)) - written += write_uint_adaptive(f, sps['height']) - written += write_uint_adaptive(f, sps['width']) - flag = (sps['ec_part'] << 2) + sps['use_ada_i'] - written += write_uchars(f, (flag,)) - return written - - -def read_header(f): - header = {} - flag = read_uchars(f, 1)[0] - nal_type = flag >> 4 - header['nal_type'] = NalType(nal_type) - if nal_type < 3: - header['sps_id'] = flag & 0x0f - return header - - frame_num_minus1 = flag & 0x0f - frame_num = frame_num_minus1 + 1 - header['frame_num'] = frame_num - sps_ids = [] - for _ in range(0, frame_num, 2): - flag = read_uchars(f, 1)[0] - sps_ids.append(flag >> 4) - sps_ids.append(flag & 0x0f) - sps_ids = sps_ids[:frame_num] - header['sps_ids'] = sps_ids - return header - - -def read_sps_remaining(f, sps_id): - sps = {} - sps['sps_id'] = sps_id - sps['height'] = read_uint_adaptive(f) - sps['width'] = read_uint_adaptive(f) - flag = read_uchars(f, 1)[0] - sps['ec_part'] = (flag >> 2) & 0x01 - sps['use_ada_i'] = flag & 0x01 - return sps - - -def write_ip(f, is_i_frame, sps_id, qp, bit_stream): - written = 0 - flag = (int(NalType.NAL_I if is_i_frame else NalType.NAL_P) << 4) + sps_id - written += write_uchars(f, (flag,)) - assert qp < 256 and qp >= 0 - flag = qp - written += write_uchars(f, (flag,)) - # we write all the streams in the same file, thus, we need to write the per-frame length - # if packed independently, we do not need to write it - written += write_uint_adaptive(f, len(bit_stream)) - written += write_bytes(f, bit_stream) - return written - - -def read_ip_remaining(f): - flag = read_uchars(f, 1)[0] - qp = flag - stream_length = read_uint_adaptive(f) - bit_stream = read_bytes(f, stream_length) - return qp, bit_stream + def get_sps_id(self, target_sps): + min_id = -1 + for sps in self.spss: + if sps['height'] == target_sps['height'] and sps['width'] == target_sps['width']: + return sps['sps_id'], False + if sps['sps_id'] > min_id: + min_id = sps['sps_id'] + assert min_id < 15 + sps = target_sps.copy() + sps['sps_id'] = min_id + 1 + self.spss.append(sps) + return sps['sps_id'], True diff --git a/src/utils/transforms.py b/src/utils/transforms.py index 9b96d17..271d075 100644 --- a/src/utils/transforms.py +++ b/src/utils/transforms.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + import numpy as np import scipy.ndimage import torch @@ -6,22 +9,9 @@ YCBCR_WEIGHTS = { # Spec: (K_r, K_g, K_b) with K_g = 1 - K_r - K_b - "ITU-R_BT.709": (0.2126, 0.7152, 0.0722) + 'ITU-R_BT.709': (0.2126, 0.7152, 0.0722) } - - -def ycbcr420_to_444_np(y, uv, order=0, separate=False): - ''' - y is 1xhxw Y float numpy array - uv is 2x(h/2)x(w/2) UV float numpy array - order: 0 nearest neighbor (default), 1: binear - return value is 3xhxw YCbCr float numpy array - ''' - uv = scipy.ndimage.zoom(uv, (1, 2, 2), order=order) - if separate: - return y, uv - yuv = np.concatenate((y, uv), axis=0) - return yuv +Kr, Kg, Kb = YCBCR_WEIGHTS['ITU-R_BT.709'] def rgb2ycbcr(rgb, is_bgr=False): @@ -29,7 +19,6 @@ def rgb2ycbcr(rgb, is_bgr=False): b, g, r = rgb.chunk(3, -3) else: r, g, b = rgb.chunk(3, -3) - Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] y = Kr * r + Kg * g + Kb * b cb = 0.5 * (b - y) / (1 - Kb) + 0.5 cr = 0.5 * (r - y) / (1 - Kr) + 0.5 @@ -38,9 +27,33 @@ def rgb2ycbcr(rgb, is_bgr=False): return ycbcr +def rgb2ycbcr_np(rgb, quant=False): + ''' + Note: channel_last memory format + input is hxwx3 RGB float numpy array + output is ycbcr: hxwx3 + ''' + h, w, c = rgb.shape + assert c == 3 + assert h % 2 == 0 + assert w % 2 == 0 + r, g, b = np.split(rgb, 3, axis=2) + y = Kr * r + Kg * g + Kb * b + cb = 0.5 * (b - y) / (1 - Kb) + 0.5 + cr = 0.5 * (r - y) / (1 - Kr) + 0.5 + ycbcr = np.concatenate((y, cb, cr), axis=2) + ycbcr = np.clip(ycbcr, 0., 1.) + + if quant: + ycbcr = np.round(ycbcr * 255.) / 255. + + return ycbcr + + def ycbcr2rgb(ycbcr, is_bgr=False, clamp=True): + dtype = ycbcr.dtype + ycbcr = ycbcr.float() y, cb, cr = ycbcr.chunk(3, -3) - Kr, Kg, Kb = YCBCR_WEIGHTS["ITU-R_BT.709"] r = y + (2 - 2 * Kr) * (cr - 0.5) b = y + (2 - 2 * Kb) * (cb - 0.5) g = (y - Kr * r - Kb * b) / Kg @@ -50,7 +63,21 @@ def ycbcr2rgb(ycbcr, is_bgr=False, clamp=True): rgb = torch.cat((r, g, b), dim=-3) if clamp: rgb = torch.clamp(rgb, 0., 1.) - return rgb + return rgb.to(dtype) + + +def ycbcr420_to_444_np(y, uv, order=0, separate=False): + ''' + y is 1xhxw Y float numpy array + uv is 2x(h/2)x(w/2) UV float numpy array + order: 0 nearest neighbor (default), 1: binear + return value is 3xhxw YCbCr float numpy array + ''' + uv = scipy.ndimage.zoom(uv, (1, 2, 2), order=order) + if separate: + return y, uv + yuv = np.concatenate((y, uv), axis=0) + return yuv def yuv_444_to_420(yuv): diff --git a/src/utils/video_reader.py b/src/utils/video_reader.py index a251845..d17054c 100644 --- a/src/utils/video_reader.py +++ b/src/utils/video_reader.py @@ -1,9 +1,9 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +import numpy as np import os -import numpy as np from PIL import Image @@ -28,7 +28,7 @@ def read_one_frame(self): return None png_path = os.path.join(self.src_path, - f"im{str(self.current_frame_index).zfill(self.padding)}.png" + f'im{str(self.current_frame_index).zfill(self.padding)}.png' ) if not os.path.exists(png_path): self.eof = True @@ -60,9 +60,7 @@ def __init__(self, src_path, width, height, skip_frame=0): self.uv_size = width * height // 2 self.uv_width = width // 2 self.uv_height = height // 2 - # pylint: disable=R1732 - self.file = open(src_path, "rb") - # pylint: enable=R1732 + self.file = open(src_path, 'rb') skipped_frame = 0 while not self.eof and skipped_frame < skip_frame: y = self.file.read(self.y_size) @@ -86,5 +84,16 @@ def read_one_frame(self): return y, uv + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + return False + + def __del__(self): + self.close() + def close(self): - self.file.close() + if self.file and not self.file.closed: + self.file.close() diff --git a/src/utils/video_writer.py b/src/utils/video_writer.py index d61089d..7d5f01a 100644 --- a/src/utils/video_writer.py +++ b/src/utils/video_writer.py @@ -20,7 +20,7 @@ def write_one_frame(self, rgb): rgb = rgb.transpose(1, 2, 0) png_path = os.path.join(self.dst_path, - f"im{str(self.current_frame_index).zfill(self.padding)}.png" + f'im{str(self.current_frame_index).zfill(self.padding)}.png' ) Image.fromarray(rgb).save(png_path) @@ -38,9 +38,7 @@ def __init__(self, dst_path, width, height): self.width = width self.height = height - # pylint: disable=R1732 - self.file = open(dst_path, "wb") - # pylint: enable=R1732 + self.file = open(dst_path, 'wb') def write_one_frame(self, y, uv): # y: 1xhxw uint8 numpy array @@ -48,5 +46,16 @@ def write_one_frame(self, y, uv): self.file.write(y.tobytes()) self.file.write(uv.tobytes()) + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + return False + + def __del__(self): + self.close() + def close(self): - self.file.close() + if self.file and not self.file.closed: + self.file.close() diff --git a/test_cfg/all_RGB.json b/test_cfg/all_RGB.json new file mode 100644 index 0000000..77b5bea --- /dev/null +++ b/test_cfg/all_RGB.json @@ -0,0 +1,100 @@ +{ + "root_path": "/data/test_sequences/PNG_BT709/", + "test_classes": { + "UVG": { + "test": 1, + "base_path": "UVG", + "src_type": "png", + "sequences": { + "Beauty_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "Bosphorus_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "HoneyBee_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "Jockey_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "ShakeNDry_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 300, "intra_period": -1}, + "YachtRide_1920x1080_120fps_420_8bit_YUV": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1} + } + }, + "MCL-JCV": { + "test": 1, + "base_path": "MCL-JCV", + "src_type": "png", + "sequences": { + "videoSRC01_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC02_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC03_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC04_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC05_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC06_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC07_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC08_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC09_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC10_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC11_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC12_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC13_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC14_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC15_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC16_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC17_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC18_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC19_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC20_1920x1080_25": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC21_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC22_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC23_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC24_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC25_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC26_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC27_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC28_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC29_1920x1080_24": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC30_1920x1080_30": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1} + } + }, + "HEVC_B": { + "test": 1, + "base_path": "HEVC_B", + "src_type": "png", + "sequences": { + "BQTerrace_1920x1080_60": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "BasketballDrive_1920x1080_50": {"width": 1920, "height": 1080, "frames": 500, "intra_period": -1}, + "Cactus_1920x1080_50": {"width": 1920, "height": 1080, "frames": 500, "intra_period": -1}, + "Kimono1_1920x1080_24": {"width": 1920, "height": 1080, "frames": 240, "intra_period": -1}, + "ParkScene_1920x1080_24": {"width": 1920, "height": 1080, "frames": 240, "intra_period": -1} + } + }, + "HEVC_E": { + "test": 1, + "base_path": "HEVC_E", + "src_type": "png", + "sequences": { + "FourPeople_1280x720_60": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1}, + "Johnny_1280x720_60": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1}, + "KristenAndSara_1280x720_60": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1} + } + }, + "HEVC_C": { + "test": 1, + "base_path": "HEVC_C", + "src_type": "png", + "sequences": { + "BQMall_832x480_60": {"width": 832, "height": 480, "frames": 600, "intra_period": -1}, + "BasketballDrill_832x480_50": {"width": 832, "height": 480, "frames": 500, "intra_period": -1}, + "PartyScene_832x480_50": {"width": 832, "height": 480, "frames": 500, "intra_period": -1}, + "RaceHorses_832x480_30": {"width": 832, "height": 480, "frames": 300, "intra_period": -1} + } + }, + "HEVC_D": { + "test": 1, + "base_path": "HEVC_D", + "src_type": "png", + "sequences": { + "BasketballPass_416x240_50": {"width": 416, "height": 240, "frames": 500, "intra_period": -1}, + "BlowingBubbles_416x240_50": {"width": 416, "height": 240, "frames": 500, "intra_period": -1}, + "BQSquare_416x240_60": {"width": 416, "height": 240, "frames": 600, "intra_period": -1}, + "RaceHorses_416x240_30": {"width": 416, "height": 240, "frames": 300, "intra_period": -1} + } + } + } +} diff --git a/test_cfg/all_yuv420.json b/test_cfg/all_yuv420.json new file mode 100644 index 0000000..f03cb97 --- /dev/null +++ b/test_cfg/all_yuv420.json @@ -0,0 +1,100 @@ +{ + "root_path": "/data/test_sequences/YUV/", + "test_classes": { + "UVG": { + "test": 1, + "base_path": "UVG", + "src_type": "yuv420", + "sequences": { + "Beauty_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "HoneyBee_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "Jockey_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "ReadySteadyGo_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "ShakeNDry_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 300, "intra_period": -1}, + "YachtRide_1920x1080_120fps_420_8bit_YUV.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1} + } + }, + "MCL-JCV": { + "test": 1, + "base_path": "MCL-JCV", + "src_type": "yuv420", + "sequences": { + "videoSRC01_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC02_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC03_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC04_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC05_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC06_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC07_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC08_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC09_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC10_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC11_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC12_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC13_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC14_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC15_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC16_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC17_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC18_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC19_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC20_1920x1080_25.yuv": {"width": 1920, "height": 1080, "frames": 125, "intra_period": -1}, + "videoSRC21_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC22_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC23_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC24_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC25_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC26_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC27_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC28_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1}, + "videoSRC29_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 120, "intra_period": -1}, + "videoSRC30_1920x1080_30.yuv": {"width": 1920, "height": 1080, "frames": 150, "intra_period": -1} + } + }, + "HEVC_B": { + "test": 1, + "base_path": "HEVC_B", + "src_type": "yuv420", + "sequences": { + "BQTerrace_1920x1080_60.yuv": {"width": 1920, "height": 1080, "frames": 600, "intra_period": -1}, + "BasketballDrive_1920x1080_50.yuv": {"width": 1920, "height": 1080, "frames": 500, "intra_period": -1}, + "Cactus_1920x1080_50.yuv": {"width": 1920, "height": 1080, "frames": 500, "intra_period": -1}, + "Kimono1_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 240, "intra_period": -1}, + "ParkScene_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 240, "intra_period": -1} + } + }, + "HEVC_E": { + "test": 1, + "base_path": "HEVC_E", + "src_type": "yuv420", + "sequences": { + "FourPeople_1280x720_60.yuv": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1}, + "Johnny_1280x720_60.yuv": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1}, + "KristenAndSara_1280x720_60.yuv": {"width": 1280, "height": 720, "frames": 600, "intra_period": -1} + } + }, + "HEVC_C": { + "test": 1, + "base_path": "HEVC_C", + "src_type": "yuv420", + "sequences": { + "BQMall_832x480_60.yuv": {"width": 832, "height": 480, "frames": 600, "intra_period": -1}, + "BasketballDrill_832x480_50.yuv": {"width": 832, "height": 480, "frames": 500, "intra_period": -1}, + "PartyScene_832x480_50.yuv": {"width": 832, "height": 480, "frames": 500, "intra_period": -1}, + "RaceHorses_832x480_30.yuv": {"width": 832, "height": 480, "frames": 300, "intra_period": -1} + } + }, + "HEVC_D": { + "test": 1, + "base_path": "HEVC_D", + "src_type": "yuv420", + "sequences": { + "BasketballPass_416x240_50.yuv": {"width": 416, "height": 240, "frames": 500, "intra_period": -1}, + "BlowingBubbles_416x240_50.yuv": {"width": 416, "height": 240, "frames": 500, "intra_period": -1}, + "BQSquare_416x240_60.yuv": {"width": 416, "height": 240, "frames": 600, "intra_period": -1}, + "RaceHorses_416x240_30.yuv": {"width": 416, "height": 240, "frames": 300, "intra_period": -1} + } + } + } +} diff --git a/test_cfg/runtime_avg.json b/test_cfg/runtime_avg.json new file mode 100644 index 0000000..27da9df --- /dev/null +++ b/test_cfg/runtime_avg.json @@ -0,0 +1,17 @@ +{ + "root_path": "/data/test_sequences/YUV/", + "test_classes": { + "HEVC_B": { + "test": 1, + "base_path": "HEVC_B", + "src_type": "yuv420", + "sequences": { + "BQTerrace_1920x1080_60.yuv": {"width": 1920, "height": 1080, "frames": 97, "intra_period": -1}, + "BasketballDrive_1920x1080_50.yuv": {"width": 1920, "height": 1080, "frames": 97, "intra_period": -1}, + "Cactus_1920x1080_50.yuv": {"width": 1920, "height": 1080, "frames": 97, "intra_period": -1}, + "Kimono1_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 97, "intra_period": -1}, + "ParkScene_1920x1080_24.yuv": {"width": 1920, "height": 1080, "frames": 97, "intra_period": -1} + } + } + } +} diff --git a/test_compress_time.py b/test_compress_time.py new file mode 100644 index 0000000..cb1646c --- /dev/null +++ b/test_compress_time.py @@ -0,0 +1,73 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +import json +import os +import sys + + +def parse_args(argv): + parser = argparse.ArgumentParser() + + parser.add_argument('--img', action='store_true', help='test image codec') + parser.add_argument('--model_structure', type=str, default='ld', choices=['htl', 'hts', 'ld'], + help='model structure to test') + parser.add_argument('--output_path', type=str, default='temp.json') + + args = parser.parse_args(argv) + + return args + + +def main(argv): + args = parse_args(argv) + + model_path_i = 'checkpoints/cvpr2026_image.pth.tar' + model_path_p = f'checkpoints/cvpr2026_video_{args.model_structure}.pth.tar' + + dataset = 'HEVC_B' + benchmark_config = 'test_cfg/runtime_avg.json' + + if args.img: + img_arg = ' --force_intra 1' + else: + img_arg = ' --force_intra 0' + + command_line = (f' python test_video.py --verbose 2 --rate_num 4 {img_arg}' + f' --test_config {benchmark_config}' + f' --force_frame_num -1' + f' --cuda_idx 0 -w 1' + ' --skip_thres 0.15' + f' --output_path {args.output_path}' + f' --model_path_i {model_path_i}' + f' --model_path_p {model_path_p}' + f' --model_structure {args.model_structure}') + + print(command_line, flush=True) + os.system(command_line) + + res = json.load(open(args.output_path, 'r')) + res = res[dataset] + encoding_time = [] + decoding_time = [] + for seq in res: + for qp in res[seq]: + enc_t = res[seq][qp]['avg_frame_encoding_time'] + dec_t = res[seq][qp]['avg_frame_decoding_time'] + encoding_time.append(enc_t) + decoding_time.append(dec_t) + avg_encoding_time = sum(encoding_time) / len(encoding_time) + avg_decoding_time = sum(decoding_time) / len(decoding_time) + if args.model_structure == 'ld': + from src.models.video_model_ld import g_frame_delay as frame_delay + else: + from src.models.video_model_ht import g_frame_delay as frame_delay + print(f'Average encoding time on {dataset}' + f' = {avg_encoding_time * 1000:.4f} ms / {frame_delay / avg_encoding_time:.4f} fps') + print(f'Average decoding time on {dataset}' + f' = {avg_decoding_time * 1000:.4f} ms / {frame_delay / avg_decoding_time:.4f} fps') + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/test_video.py b/test_video.py index 8658569..9f8ce7b 100644 --- a/test_video.py +++ b/test_video.py @@ -6,92 +6,31 @@ import io import json import multiprocessing +import numpy as np import os import time - import torch -import numpy as np + from tqdm import tqdm -from src.layers.cuda_inference import replicate_pad -from src.models.video_model import DMC from src.models.image_model import DMCI -from src.utils.common import str2bool, create_folder, generate_log_json, get_state_dict, \ - dump_json, set_torch_env +from src.utils.common import ModelStructure, str2bool, create_folder, generate_log_json, \ + get_state_dict, dump_json, set_torch_env +from src.utils.metrics import calc_msssim, calc_msssim_rgb, calc_psnr from src.utils.stream_helper import SPSHelper, NalType, write_sps, read_header, \ read_sps_remaining, read_ip_remaining, write_ip +from src.utils.transforms import rgb2ycbcr, ycbcr2rgb, yuv_444_to_420, ycbcr420_to_444_np from src.utils.video_reader import PNGReader, YUV420Reader from src.utils.video_writer import PNGWriter, YUV420Writer -from src.utils.metrics import calc_psnr, calc_msssim, calc_msssim_rgb -from src.utils.transforms import rgb2ycbcr, ycbcr2rgb, yuv_444_to_420, ycbcr420_to_444_np -def parse_args(): - parser = argparse.ArgumentParser(description="Example testing script") - - parser.add_argument('--force_zero_thres', type=float, default=None, required=False) - parser.add_argument('--model_path_i', type=str) - parser.add_argument('--model_path_p', type=str) - parser.add_argument('--rate_num', type=int, default=4) - parser.add_argument('--qp_i', type=int, nargs="+") - parser.add_argument('--qp_p', type=int, nargs="+") - parser.add_argument("--force_intra", type=str2bool, default=False) - parser.add_argument("--force_frame_num", type=int, default=-1) - parser.add_argument("--force_intra_period", type=int, default=-1) - parser.add_argument('--reset_interval', type=int, default=32, required=False) - parser.add_argument('--test_config', type=str, required=True) - parser.add_argument('--force_root_path', type=str, default=None, required=False) - parser.add_argument("--worker", "-w", type=int, default=1, help="worker number") - parser.add_argument("--cuda", type=str2bool, default=False) - parser.add_argument('--cuda_idx', type=int, nargs="+", help='GPU indexes to use') - parser.add_argument('--calc_ssim', type=str2bool, default=False, required=False) - parser.add_argument('--write_stream', type=str2bool, default=False) - parser.add_argument('--check_existing', type=str2bool, default=False) - parser.add_argument('--stream_path', type=str, default="out_bin") - parser.add_argument('--save_decoded_frame', type=str2bool, default=False) - parser.add_argument('--output_path', type=str, required=True) - parser.add_argument('--verbose_json', type=str2bool, default=False) - parser.add_argument('--verbose', type=int, default=0) - - args = parser.parse_args() - return args - - -def np_image_to_tensor(img, device): - image = torch.from_numpy(img).to(device=device).to(dtype=torch.float32) / 255.0 - image = image.unsqueeze(0) - return image - - -def get_src_reader(args): - if args['src_type'] == 'png': - src_reader = PNGReader(args['src_path'], args['src_width'], args['src_height']) - elif args['src_type'] == 'yuv420': - src_reader = YUV420Reader(args['src_path'], args['src_width'], args['src_height']) - return src_reader - - -def get_src_frame(args, src_reader, device): - if args['src_type'] == 'yuv420': - y, uv = src_reader.read_one_frame() - yuv = ycbcr420_to_444_np(y, uv) - x = np_image_to_tensor(yuv, device) - y = y[0, :, :] - u = uv[0, :, :] - v = uv[1, :, :] - rgb = None - else: - assert args['src_type'] == 'png' - rgb = src_reader.read_one_frame() - x = np_image_to_tensor(rgb, device) - x = rgb2ycbcr(x) - y, u, v = None, None, None - - x = x.to(torch.float16) - return x, y, u, v, rgb +def finalize_model(net, device): + net = net.half().to(device) + return net.to(memory_format=torch.channels_last) def get_distortion(args, x_hat, y, u, v, rgb): + x_hat = x_hat + 0.5 if args['src_type'] == 'yuv420': y_rec, uv_rec = yuv_444_to_420(x_hat) y_rec = torch.clamp(y_rec * 255, 0, 255).squeeze(0).cpu().numpy() @@ -127,14 +66,112 @@ def get_distortion(args, x_hat, y, u, v, rgb): return curr_psnr, curr_ssim -def run_one_point_with_stream(p_frame_net, i_frame_net, args): +def get_src_frame(args, src_reader, device, maximum_read, is_intra, np_only=False): + if args['src_type'] == 'yuv420': + processed = 0 + x, y, u, v, rgb = [], [], [], [], [] + while processed < maximum_read: + curr_y, curr_uv = src_reader.read_one_frame() + curr_yuv = ycbcr420_to_444_np(curr_y, curr_uv) + curr_x = torch.from_numpy(curr_yuv).unsqueeze(0) + curr_y = curr_y[0, :, :] + curr_u = curr_uv[0, :, :] + curr_v = curr_uv[1, :, :] + curr_rgb = None + x.append(curr_x) + y.append(curr_y) + u.append(curr_u) + v.append(curr_v) + rgb.append(curr_rgb) + processed += 1 + else: + assert args['src_type'] == 'png' + processed = 0 + x, y, u, v, rgb = [], [], [], [], [] + while processed < maximum_read: + curr_rgb = src_reader.read_one_frame() + curr_x = torch.from_numpy(curr_rgb).unsqueeze(0).to(device=device, non_blocking=True) + curr_x = curr_x.float() / 255.0 + curr_x = rgb2ycbcr(curr_x) + curr_y, curr_u, curr_v = None, None, None + x.append(curr_x) + y.append(curr_y) + u.append(curr_u) + v.append(curr_v) + rgb.append(curr_rgb) + processed += 1 + + while not is_intra and processed < g_frame_delay: + x.append(x[-1]) + y.append(y[-1]) + u.append(u[-1]) + v.append(v[-1]) + rgb.append(rgb[-1]) + processed += 1 + + if np_only: + return y, u, v, rgb + + x = torch.cat(x, dim=1) + if args['src_type'] == 'yuv420': + x = x.to(device=device, non_blocking=True) + x = x.half() + if args['src_type'] == 'yuv420': + x = x / 255.0 + x = x - 0.5 + x = x.to(memory_format=torch.channels_last) + return x, y, u, v, rgb + + +def get_src_reader(args): + if args['src_type'] == 'png': + src_reader = PNGReader(args['src_path'], args['src_width'], args['src_height']) + elif args['src_type'] == 'yuv420': + src_reader = YUV420Reader(args['src_path'], args['src_width'], args['src_height']) + else: + assert False + return src_reader + + +def parse_args(): + parser = argparse.ArgumentParser() + + parser.add_argument('--skip_thres', type=float, default=0) + parser.add_argument('--model_path_i', type=str) + parser.add_argument('--model_path_p', type=str) + parser.add_argument('--rate_num', type=int, default=4) + parser.add_argument('--qp_i', type=int, nargs='+') + parser.add_argument('--qp_p', type=int, nargs='+') + parser.add_argument('--force_intra', type=str2bool, default=False) + parser.add_argument('--force_frame_num', type=int, default=-1) + parser.add_argument('--force_intra_period', type=int, default=-1) + parser.add_argument('--reset_interval', type=int, default=32) + parser.add_argument('--test_config', type=str, required=True) + parser.add_argument('--force_root_path', type=str, default=None, required=False) + parser.add_argument('--worker', '-w', type=int, default=1, help='worker number') + parser.add_argument('--model_structure', type=str, default='ld', choices=['htl', 'hts', 'ld']) + parser.add_argument('--cuda_idx', type=int, nargs='+', help='GPU indexes to use') + parser.add_argument('--calc_ssim', type=str2bool, default=False, required=False) + parser.add_argument('--check_existing', type=str2bool, default=False) + parser.add_argument('--stream_path', type=str, default='out_bin') + parser.add_argument('--save_decoded_frame', type=str2bool, default=False) + parser.add_argument('--output_path', type=str, required=True) + parser.add_argument('--verbose_json', type=str2bool, default=False) + parser.add_argument('--verbose', type=int, default=0) + + args = parser.parse_args() + return args + + +@torch.inference_mode() +def run_one_point_with_stream(p_net, i_net, args): if args['check_existing'] and os.path.exists(args['curr_json_path']) and \ os.path.exists(args['curr_bin_path']): with open(args['curr_json_path']) as f: log_result = json.load(f) if log_result['i_frame_num'] + log_result['p_frame_num'] == args['frame_num']: return log_result - print(f"incorrect log for {args['curr_json_path']}, try to rerun.") + print(f'incorrect log for {args['curr_json_path']}, try to rerun.') frame_num = args['frame_num'] save_decoded_frame = args['save_decoded_frame'] @@ -142,99 +179,99 @@ def run_one_point_with_stream(p_frame_net, i_frame_net, args): reset_interval = args['reset_interval'] intra_period = args['intra_period'] verbose_json = args['verbose_json'] - device = next(i_frame_net.parameters()).device + device = next(i_net.parameters()).device src_reader = get_src_reader(args) pic_height = args['src_height'] pic_width = args['src_width'] padding_r, padding_b = DMCI.get_padding_size(pic_height, pic_width, 16) - use_two_entropy_coders = pic_height * pic_width > 1280 * 720 - i_frame_net.set_use_two_entropy_coders(use_two_entropy_coders) - p_frame_net.set_use_two_entropy_coders(use_two_entropy_coders) - frame_types = [] psnrs = [] msssims = [] bits = [] + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_time = time.time() encoding_time = [] decoding_time = [] - index_map = [0, 1, 0, 2, 0, 2, 0, 2] output_buff = io.BytesIO() sps_helper = SPSHelper() - p_frame_net.set_curr_poc(0) - with torch.no_grad(): - last_qp = 0 - for frame_idx in range(frame_num): - x, y, u, v, rgb = get_src_frame(args, src_reader, device) - - torch.cuda.synchronize(device=device) - frame_start_time = time.time() - - # pad if necessary - x_padded = replicate_pad(x, padding_b, padding_r) - - is_i_frame = False - if frame_idx == 0 or (intra_period > 0 and frame_idx % intra_period == 0): - is_i_frame = True - curr_qp = args['qp_i'] - sps = { - 'sps_id': -1, - 'height': pic_height, - 'width': pic_width, - 'ec_part': 1 if use_two_entropy_coders else 0, - 'use_ada_i': 0, - } - encoded = i_frame_net.compress(x_padded, args['qp_i']) - p_frame_net.clear_dpb() - p_frame_net.add_ref_frame(None, encoded['x_hat']) - frame_types.append(0) + frame_idx = 0 + while frame_idx < frame_num: + is_intra = False + if frame_idx == 0 or intra_period == 1: + is_intra = True + if intra_period > 1 and frame_idx != 1: + assert intra_period % g_frame_delay == 0 + if frame_idx % intra_period == 1: + is_intra = True + + maximum_read = min(g_frame_delay, frame_num - frame_idx) + if is_intra: + maximum_read = 1 + + x, y, u, v, rgb = get_src_frame(args, src_reader, device, maximum_read, is_intra) + + torch.cuda.synchronize(device=device) + start_event.record() + + if is_intra: + curr_qp = args['qp_i'] + reset_feature_memory = 0 + encoded = i_net.compress(x, curr_qp, padding_b, padding_r) + if not args['force_intra']: + p_net.clear_dpb() + p_net.add_ref_feature_from_frame(encoded['x_hat']) + frame_types.append(0) + else: + if reset_interval > 0 and (frame_idx + g_frame_delay) % reset_interval == 1: + reset_feature_memory = 1 else: - fa_idx = index_map[frame_idx % 8] - if reset_interval > 0 and frame_idx % reset_interval == 1: - use_ada_i = 1 - p_frame_net.prepare_feature_adaptor_i(last_qp) - else: - use_ada_i = 0 - curr_qp = p_frame_net.shift_qp(args['qp_p'], fa_idx) - sps = { - 'sps_id': -1, - 'height': pic_height, - 'width': pic_width, - 'ec_part': 1 if use_two_entropy_coders else 0, - 'use_ada_i': use_ada_i, - } - - encoded = p_frame_net.compress(x_padded, curr_qp) - last_qp = curr_qp + reset_feature_memory = 0 + curr_qp = args['qp_p'] + + encoded = p_net.compress(x, curr_qp, reset_feature_memory, padding_b, padding_r) + for _ in range(maximum_read): frame_types.append(1) - sps_id, sps_new = sps_helper.get_sps_id(sps) - sps['sps_id'] = sps_id - sps_bytes = 0 - if sps_new: - sps_bytes = write_sps(output_buff, sps) - if verbose >= 2: - print("new sps", sps) - stream_bytes = write_ip(output_buff, is_i_frame, sps_id, curr_qp, encoded['bit_stream']) - bits.append(stream_bytes * 8 + sps_bytes * 8) + sps = { + 'sps_id': -1, + 'height': pic_height, + 'width': pic_width, + } + sps_id, sps_new = sps_helper.get_sps_id(sps) + sps['sps_id'] = sps_id + sps_bytes = 0 + if sps_new: + sps_bytes = write_sps(output_buff, sps) + if verbose >= 2: + print('new sps', sps) + stream_bytes = write_ip(output_buff, is_intra, sps_id, curr_qp, + encoded['ec_parallel'], reset_feature_memory, + encoded['bit_stream']) + bits.append(stream_bytes * 8 + sps_bytes * 8) + for _ in range(1, maximum_read): + bits.append(0) + + end_event.record() + torch.cuda.synchronize(device=device) - torch.cuda.synchronize(device=device) - frame_end_time = time.time() + frame_time = start_event.elapsed_time(end_event) / 1000.0 + encoding_time.append(frame_time) - frame_time = frame_end_time - frame_start_time - encoding_time.append(frame_time) + if verbose >= 2: + print(f'frame {frame_idx} encoded, {frame_time * 1000:.3f} ms, ' + f'bits: {bits[-maximum_read]}') - if verbose >= 2: - print(f"frame {frame_idx} encoded, {frame_time * 1000:.3f} ms, " - f"bits: {bits[-1]}") + frame_idx += maximum_read src_reader.close() - with open(args['curr_bin_path'], "wb") as output_file: + with open(args['curr_bin_path'], 'wb') as output_file: bytes_buffer = output_buff.getbuffer() output_file.write(bytes_buffer) total_bytes = bytes_buffer.nbytes @@ -242,8 +279,7 @@ def run_one_point_with_stream(p_frame_net, i_frame_net, args): total_kbps = int(total_bytes * 8 / (frame_num / 30) / 1000) # assume 30 fps output_buff.close() sps_helper = SPSHelper() - input_file = open(args['curr_bin_path'], "rb") - with open(args['curr_bin_path'], "rb") as input_file: + with open(args['curr_bin_path'], 'rb') as input_file: input_buff = io.BytesIO(input_file.read()) decoded_frame_number = 0 src_reader = get_src_reader(args) @@ -255,68 +291,84 @@ def run_one_point_with_stream(p_frame_net, i_frame_net, args): output_yuv_path = args['curr_rec_path'].replace('.yuv', f'_{total_kbps}kbps.yuv') recon_writer = YUV420Writer(output_yuv_path, args['src_width'], args['src_height']) - p_frame_net.set_curr_poc(0) - with torch.no_grad(): - while decoded_frame_number < frame_num: - x, y, u, v, rgb = get_src_frame(args, src_reader, device) - torch.cuda.synchronize(device=device) - frame_start_time = time.time() + while decoded_frame_number < frame_num: + torch.cuda.synchronize(device=device) + start_event.record() + header = read_header(input_buff) + while header['nal_type'] == NalType.NAL_SPS: + sps = read_sps_remaining(input_buff, header['sps_id']) + sps_helper.add_sps_by_id(sps) + if verbose >= 2: + print('new sps', sps) header = read_header(input_buff) - while header['nal_type'] == NalType.NAL_SPS: - sps = read_sps_remaining(input_buff, header['sps_id']) - sps_helper.add_sps_by_id(sps) - if verbose >= 2: - print("new sps", sps) - header = read_header(input_buff) - continue - sps_id = header['sps_id'] - - sps = sps_helper.get_sps_by_id(sps_id) - qp, bit_stream = read_ip_remaining(input_buff) - - if header['nal_type'] == NalType.NAL_I: - decoded = i_frame_net.decompress(bit_stream, sps, qp) - p_frame_net.clear_dpb() - p_frame_net.add_ref_frame(None, decoded['x_hat']) - elif header['nal_type'] == NalType.NAL_P: - if sps['use_ada_i']: - p_frame_net.reset_ref_feature() - decoded = p_frame_net.decompress(bit_stream, sps, qp) - - recon_frame = decoded['x_hat'] - x_hat = recon_frame[:, :, :pic_height, :pic_width] - - torch.cuda.synchronize(device=device) - frame_end_time = time.time() - - frame_time = frame_end_time - frame_start_time - decoding_time.append(frame_time) - - curr_psnr, curr_ssim = get_distortion(args, x_hat, y, u, v, rgb) + continue + sps_id = header['sps_id'] + + sps = sps_helper.get_sps_by_id(sps_id) + qp, ec_part, reset_feature_memory, bit_stream = read_ip_remaining(input_buff) + + if header['nal_type'] == NalType.NAL_I: + decoded = i_net.decompress(bit_stream, sps, qp, ec_part) + if not args['force_intra']: + p_net.clear_dpb() + p_net.add_ref_feature_from_frame(decoded['x_hat'], apply_feature_adaptor=False) + elif header['nal_type'] == NalType.NAL_P: + decoded = p_net.decompress(bit_stream, sps, qp, ec_part, reset_feature_memory) + + recon_frame = decoded['x_hat'] + + end_event.record() + torch.cuda.synchronize(device=device) + + frame_time = start_event.elapsed_time(end_event) / 1000.0 + decoding_time.append(frame_time) + + is_intra = header['nal_type'] == NalType.NAL_I + maximum_read = min(g_frame_delay, frame_num - decoded_frame_number) + if is_intra: + maximum_read = 1 + y, u, v, rgb = get_src_frame(args, src_reader, device, maximum_read, is_intra, np_only=True) + + for i in range(maximum_read): + if isinstance(recon_frame, list): + x_hat = recon_frame[i] + else: + x_hat = recon_frame + x_hat = x_hat[:, :, :pic_height, :pic_width] + curr_psnr, curr_ssim = get_distortion(args, x_hat, y[i], u[i], v[i], rgb[i]) psnrs.append(curr_psnr) msssims.append(curr_ssim) - if verbose >= 2: - stream_length = 0 if bit_stream is None else len(bit_stream) * 8 - print(f"frame {decoded_frame_number} decoded, {frame_time * 1000:.3f} ms, " - f"bits: {stream_length}, PSNR: {curr_psnr[0]:.4f} ") - - if save_decoded_frame: + if verbose >= 2: + stream_length = 0 if bit_stream is None else len(bit_stream) * 8 + print(f'frame {decoded_frame_number} decoded, {frame_time * 1000:.3f} ms, ' + f'bits: {stream_length}, ', end='') + for i in range(-maximum_read, 0, 1): + print(f'PSNR: {psnrs[i][0]:.4f}, ', end='') + print() + + if save_decoded_frame: + for i in range(maximum_read): + if isinstance(recon_frame, list): + x_hat = recon_frame[i] + else: + x_hat = recon_frame + x_hat = x_hat[:, :, :pic_height, :pic_width] if args['src_type'] == 'yuv420': - y_rec, uv_rec = yuv_444_to_420(x_hat) - y_rec = torch.clamp(y_rec * 255, 0, 255).round().to(dtype=torch.uint8) + y_rec, uv_rec = yuv_444_to_420(x_hat + 0.5) + y_rec = torch.clamp(y_rec * 255, 0, 255).round().byte() y_rec = y_rec.squeeze(0).cpu().numpy() - uv_rec = torch.clamp(uv_rec * 255, 0, 255).to(dtype=torch.uint8) + uv_rec = torch.clamp(uv_rec * 255, 0, 255).byte() uv_rec = uv_rec.squeeze(0).cpu().numpy() recon_writer.write_one_frame(y_rec, uv_rec) else: assert args['src_type'] == 'png' - rgb_rec = ycbcr2rgb(x_hat) - rgb_rec = torch.clamp(rgb_rec * 255, 0, 255).round().to(dtype=torch.uint8) + rgb_rec = ycbcr2rgb(x_hat + 0.5) + rgb_rec = torch.clamp(rgb_rec * 255, 0, 255).round().byte() rgb_rec = rgb_rec.squeeze(0).cpu().numpy() recon_writer.write_one_frame(rgb_rec) - decoded_frame_number += 1 + decoded_frame_number += maximum_read input_buff.close() src_reader.close() @@ -325,15 +377,15 @@ def run_one_point_with_stream(p_frame_net, i_frame_net, args): test_time = time.time() - start_time test_time_frame_numuber = len(encoding_time) - time_bypass_frame_num = 10 # bypass the first 10 frames as warmup + time_bypass_frame_num = 4 # bypass the first 4 * g_frame_delay frames as warmup if verbose >= 1 and test_time_frame_numuber > time_bypass_frame_num: encoding_time = encoding_time[time_bypass_frame_num:] decoding_time = decoding_time[time_bypass_frame_num:] avg_encoding_time = sum(encoding_time)/len(encoding_time) avg_decoding_time = sum(decoding_time)/len(decoding_time) - print(f"encoding/decoding {test_time_frame_numuber} frames, " - f"average encoding time {avg_encoding_time * 1000:.3f} ms, " - f"average decoding time {avg_decoding_time * 1000:.3f} ms.") + print(f'encoding/decoding {len(encoding_time)} * {g_frame_delay} frames, ' + f'average encoding time {avg_encoding_time * 1000:.3f} ms, ' + f'average decoding time {avg_decoding_time * 1000:.3f} ms.') else: avg_encoding_time = None avg_decoding_time = None @@ -347,35 +399,9 @@ def run_one_point_with_stream(p_frame_net, i_frame_net, args): return log_result -i_frame_net = None # the model is initialized after each process is spawn, thus OK for multiprocess -p_frame_net = None - - -def worker(args): - global i_frame_net - global p_frame_net - - sub_dir_name = args['seq'] - bin_folder = os.path.join(args['stream_path'], args['ds_name']) - assert args['write_stream'], "" - create_folder(bin_folder, True) - - args['src_path'] = os.path.join(args['dataset_path'], sub_dir_name) - args['bin_folder'] = bin_folder - args['curr_bin_path'] = os.path.join(bin_folder, - f"{args['seq']}_q{args['qp_i']}.bin") - args['curr_rec_path'] = args['curr_bin_path'].replace('.bin', '.yuv') - args['curr_json_path'] = args['curr_bin_path'].replace('.bin', '.json') - - result = run_one_point_with_stream(p_frame_net, i_frame_net, args) - - result['ds_name'] = args['ds_name'] - result['seq'] = args['seq'] - result['rate_idx'] = args['rate_idx'] - result['qp_i'] = args['qp_i'] - result['qp_p'] = args['qp_p'] if 'qp_p' in args else args['qp_i'] - - return result +g_i_net = None # the model is initialized after each process is spawn, thus OK for multiprocess +g_p_net = None +g_frame_delay = None # depending on the model_structure (1 or 8) def init_func(args, gpu_num): @@ -390,28 +416,62 @@ def init_func(args, gpu_num): if args.cuda_idx is not None: gpu_id = args.cuda_idx[gpu_id] os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id) - device = "cuda:0" + device = 'cuda:0' + else: + device = 'cpu' + + # one-time setup of default cuda stream. cuda graph does not support stream 0 + custom_stream = torch.cuda.Stream(device, 0) + torch.cuda.set_stream(custom_stream) + + model_structure = ModelStructure(args.model_structure) + + if model_structure == ModelStructure.LD: + from src.models.video_model_ld import DMC, g_frame_delay as frame_delay else: - device = "cpu" + from src.models.video_model_ht import DMC, g_frame_delay as frame_delay - global i_frame_net - i_frame_net = DMCI() + global g_i_net + g_i_net = DMCI() + g_i_net = g_i_net.eval() i_state_dict = get_state_dict(args.model_path_i) - i_frame_net.load_state_dict(i_state_dict) - i_frame_net = i_frame_net.to(device) - i_frame_net.eval() - i_frame_net.update(args.force_zero_thres) - i_frame_net.half() - - global p_frame_net - p_frame_net = DMC() + g_i_net.load_state_dict(i_state_dict) + g_i_net.update(args.skip_thres) + g_i_net = finalize_model(g_i_net, device) + if not args.force_intra: + global g_p_net + if model_structure == ModelStructure.LD: + g_p_net = DMC() + else: + g_p_net = DMC(model_structure=model_structure) + g_p_net = g_p_net.eval() p_state_dict = get_state_dict(args.model_path_p) - p_frame_net.load_state_dict(p_state_dict) - p_frame_net = p_frame_net.to(device) - p_frame_net.eval() - p_frame_net.update(args.force_zero_thres) - p_frame_net.half() + g_p_net.load_state_dict(p_state_dict) + g_p_net.update(args.skip_thres) + g_p_net = finalize_model(g_p_net, device) + + global g_frame_delay + g_frame_delay = frame_delay + + +def worker(args): + sub_dir_name = args['seq'] + bin_folder = os.path.join(args['stream_path'], args['ds_name']) + create_folder(bin_folder, True) + + args['src_path'] = os.path.join(args['dataset_path'], sub_dir_name) + args['bin_folder'] = bin_folder + args['curr_bin_path'] = os.path.join(bin_folder, f'{args['seq']}_q{args['qp_i']}.bin') + args['curr_rec_path'] = args['curr_bin_path'].replace('.bin', '.mp4') + args['curr_json_path'] = args['curr_bin_path'].replace('.bin', '.json') + + result = run_one_point_with_stream(g_p_net, g_i_net, args) + + result['ds_name'] = args['ds_name'] + result['seq'] = args['seq'] + result['rate_idx'] = args['rate_idx'] + return result def main(): @@ -419,9 +479,10 @@ def main(): args = parse_args() - if args.force_zero_thres is not None and args.force_zero_thres < 0: - args.force_zero_thres = None + if not torch.cuda.is_available(): + raise RuntimeError('test_video.py requires CUDA (torch.cuda.is_available() is False)') + args.skip_thres = max(0, args.skip_thres) if args.cuda_idx is not None: cuda_device = ','.join([str(s) for s in args.cuda_idx]) os.environ['CUDA_VISIBLE_DEVICES'] = cuda_device @@ -432,11 +493,8 @@ def main(): with open(args.test_config) as f: config = json.load(f) - gpu_num = 0 - if args.cuda: - gpu_num = torch.cuda.device_count() - - multiprocessing.set_start_method("spawn") + gpu_num = torch.cuda.device_count() + multiprocessing.set_start_method('spawn') threadpool_executor = concurrent.futures.ProcessPoolExecutor(max_workers=worker_num, initializer=init_func, initargs=(args, gpu_num)) @@ -451,8 +509,8 @@ def main(): assert len(args.qp_i) == rate_num qp_i = args.qp_i else: - assert 2 <= rate_num <= DMC.get_qp_num() - for i in np.linspace(0, DMC.get_qp_num() - 1, num=rate_num): + assert 2 <= rate_num <= DMCI.qp_num() + for i in np.linspace(0, DMCI.qp_num() - 1, num=rate_num): qp_i.append(int(i+0.5)) if not args.force_intra: @@ -462,10 +520,7 @@ def main(): else: qp_p = qp_i - print(f"testing {rate_num} rates, using qp: ", end='') - for q in qp_i: - print(f"{q}, ", end='') - print() + print(f'testing {rate_num} rates, using qp: {', '.join(str(q) for q in qp_i)}') root_path = args.force_root_path if args.force_root_path is not None else config['root_path'] config = config['test_classes'] @@ -496,7 +551,6 @@ def main(): cur_args['frame_num'] = args.force_frame_num cur_args['calc_ssim'] = args.calc_ssim cur_args['dataset_path'] = os.path.join(root_path, config[ds_name]['base_path']) - cur_args['write_stream'] = args.write_stream cur_args['check_existing'] = args.check_existing cur_args['stream_path'] = args.stream_path cur_args['save_decoded_frame'] = args.save_decoded_frame @@ -523,7 +577,7 @@ def main(): log_result[ds_name][seq] = {} for res in results: - log_result[res['ds_name']][res['seq']][f"{res['rate_idx']:03d}"] = res + log_result[res['ds_name']][res['seq']][f'{res['rate_idx']:03d}'] = res out_json_dir = os.path.dirname(args.output_path) if len(out_json_dir) > 0: @@ -537,5 +591,5 @@ def main(): print(f'Total elapsed time: {total_minutes:.1f} min') -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/third_party/.gitkeep b/third_party/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/train_image.py b/train_image.py new file mode 100644 index 0000000..700941d --- /dev/null +++ b/train_image.py @@ -0,0 +1,140 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +import math +import sys +import time +import torch +import torch.distributed as dist + +from torch.nn.utils import clip_grad_norm_ + +from src.datasets.image_dataset import ImageFolder +from src.models.image_model import DMCI +from src.utils.common import start_train, save_ckpt, save_status, get_current_device, \ + get_training_lambdas, get_dataloader, init_train, cleanup_train, load_existing_weights, wrap_ddp + + +def get_training_strategy(): + # epoch is for referencing purpose + # lr is the learning rate for the current epoch + training_strategy = \ + [[0, 2e-4, 256, 256]] * 45 + \ + [[49, 5e-5, 256, 256]] * 25 + \ + [[69, 1e-5, 256, 256]] * 20 + \ + [[90, 2e-4, 512, 512]] * 5 + \ + [[95, 5e-5, 512, 512]] * 4 + \ + [[99, 1e-5, 512, 512]] * 4 + \ + [[103, 1e-6, 512, 512]] * 2 + \ + [[105, 1e-6, 512, 512]] # noqa: E501 E221 + # epo, lr, patch_size # noqa: E116 E501 + + return training_strategy + + +def parse_args(argv): + parser = argparse.ArgumentParser() + + parser.add_argument('--batch_size', type=int, default=16) + parser.add_argument('-e', '--epochs', default=104, type=int) + parser.add_argument('--lambdas', type=float, nargs='+', required=True) + parser.add_argument('-n', '--num_workers', type=int, default=4, + help='Dataloaders worker per trainer') + parser.add_argument('--save_dir', type=str, required=True, help='Path to save models') + parser.add_argument('--train_dataset', type=str, required=True) + + args = parser.parse_args(argv) + return args + + +def train_one_epoch(i_net, dataloader, optimizer, epoch, rank): + training_strategy = get_training_strategy() + i_net.train() + device = next(i_net.parameters()).device + + idx = min(len(training_strategy) - 1, epoch) + _, lr, patch_width, patch_height = training_strategy[idx] + + for g in optimizer.param_groups: + g['lr'] = lr + + world_size = dist.get_world_size() if rank >= 0 else 1 + dataloader.dataset.set_patch_size(patch_width, patch_height) + + t0 = time.time() + for i, batch in enumerate(dataloader): + batch = [t.to(device) for t in batch] + batch_size = batch[0].size(0) + qp = batch[-2] + curr_lambdas = batch[-1] + + print_loss_info = rank <= 0 and i % 200 == 0 + + loss, info = i_net(batch[0], qp, lambdas=curr_lambdas, get_loss_info=print_loss_info) + optimizer.zero_grad() + loss.backward() + + total_norm = clip_grad_norm_(i_net.parameters(), max_norm=0.1, + error_if_nonfinite=False).item() + if math.isnan(total_norm) or math.isinf(total_norm): + if rank <= 0: + print('non-finite norm, skip this batch') + continue + + optimizer.step() + + if print_loss_info: + numer = i * batch_size * world_size + denom = len(dataloader.dataset) + t1 = time.time() + print( + f'Time: {t1-t0:.3f} seconds, Train epoch {epoch}:' + f' [{numer} / {denom} ({100. * numer / denom:.0f}%)]' + f' MSE: {info['mse']} | Bpp y: {info['bpp_y']} | Bpp z: {info['bpp_z']} |' + f' Losses: {info['losses']} | lr: {optimizer.param_groups[0]['lr']:.1e}' + ) + t0 = t1 + + +def train(rank, args): + world_size = init_train(rank, args.save_dir) + train_dataset = ImageFolder(args.train_dataset, 256, 256, DMCI.qp_num(), + get_training_lambdas(args.lambdas, DMCI.qp_num())) + + i_net = DMCI() + begin_epoch, opt_status = load_existing_weights(args.save_dir, i_net, rank) + + device = get_current_device(rank) + if rank >= 0: + i_net = i_net.cuda(rank) + else: + i_net = i_net.to(device) + i_net = wrap_ddp(i_net, rank) + + optimizer = torch.optim.AdamW(i_net.parameters(), lr=1e-4) + if opt_status is not None: + optimizer.load_state_dict(opt_status) + + dataloader = get_dataloader(train_dataset, rank, world_size, args.batch_size, + args.num_workers) + for epoch in range(begin_epoch, args.epochs): + if rank >= 0: + dataloader.sampler.set_epoch(epoch) + train_one_epoch(i_net, dataloader, optimizer, epoch, rank) + + if rank <= 0: + save_status(args.save_dir, i_net, optimizer, epoch) + + if rank <= 0: + save_ckpt(args.save_dir, i_net) + cleanup_train(rank) + + +def main(argv): + args = parse_args(argv) + start_train(train, args) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/train_video.py b/train_video.py new file mode 100644 index 0000000..99ec658 --- /dev/null +++ b/train_video.py @@ -0,0 +1,249 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +import math +import sys +import time +import torch +import torch.distributed as dist + +from torch.nn.parallel import DistributedDataParallel as DDP +from torch.nn.utils import clip_grad_norm_ + +from src.datasets.video_dataset import VideoFolder +from src.models.image_model import DMCI +from src.utils.common import ModelStructure, save_status, start_train, save_ckpt, \ + get_current_device, get_training_lambdas, get_dataloader, init_train, cleanup_train, \ + load_existing_weights, get_state_dict, wrap_ddp + + +def get_training_strategy(training_scheduling, frame_delay, model_structure): + # epoch is for referencing purpose + # lr is the learning rate for the current epoch + if model_structure == ModelStructure.LD: + if training_scheduling == 'stage0': + training_strategy = \ + [[0, 1e-4, 2, False, 256, 256]] * 5 + \ + [[5, 1e-4, 3, False, 256, 256]] * 5 + \ + [[10, 1e-4, 6, False, 256, 256]] * 45 + \ + [[55, 1e-4, 6, False, 256, 256]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + elif training_scheduling == 'stage1': + training_strategy = \ + [[0, 5e-5, 8, True, 256, 256]] * 5 + \ + [[5, 5e-5, 16, True, 256, 256]] * 5 + \ + [[10, 5e-5, 24, True, 256, 256]] * 5 + \ + [[15, 5e-5, 32, True, 256, 256]] * 15 + \ + [[30, 5e-6, 32, True, 256, 256]] * 7 + \ + [[37, 5e-6, 32, True, 256, 256]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + elif training_scheduling == 'stage2': + training_strategy = \ + [[0, 5e-5, 33, True, 512, 512]] * 14 + \ + [[14, 5e-6, 33, True, 512, 512]] * 4 + \ + [[18, 2e-5, 49, True, 512, 512]] * 7 + \ + [[25, 2e-6, 49, True, 512, 512]] * 2 + \ + [[27, 5e-6, 65, True, 512, 512]] * 7 + \ + [[34, 2e-6, 65, True, 512, 512]] * 6 + \ + [[40, 2e-6, 65, True, 512, 512]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + elif training_scheduling == 'stage3': + training_strategy = \ + [[0, 2e-6, 97, True, 512, 512]] * 2 + \ + [[2, 5e-7, 129, True, 512, 512]] * 2 + \ + [[4, 5e-7, 129, True, 512, 512]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + else: + assert False + + return training_strategy + + if training_scheduling == 'stage0': + training_strategy = \ + [[0, 1e-4, 1 + 1 * frame_delay, False, 256, 256]] * 5 + \ + [[5, 1e-4, 1 + 2 * frame_delay, False, 256, 256]] * 5 + \ + [[10, 1e-4, 1 + 4 * frame_delay, False, 256, 256]] * 35 + \ + [[45, 1e-4, 1 + 4 * frame_delay, False, 256, 256]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + elif training_scheduling == 'stage1': + training_strategy = \ + [[0, 5e-5, 17, True, 256, 256]] * 2 + \ + [[2, 5e-5, 25, True, 256, 256]] * 1 + \ + [[3, 5e-5, 33, True, 256, 256]] * 3 + \ + [[6, 5e-6, 33, True, 256, 256]] * 4 + \ + [[10, 5e-6, 33, True, 256, 256]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + elif training_scheduling == 'stage2': + training_strategy = \ + [[0, 5e-5, 33, True, 512, 512]] * 10 + \ + [[10, 5e-5, 49, True, 512, 512]] * 10 + \ + [[20, 1e-5, 65, True, 512, 512]] * 12 + \ + [[32, 2e-6, 65, True, 512, 512]] * 8 + \ + [[40, 2e-6, 65, True, 512, 512]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + elif training_scheduling == 'stage3': + training_strategy = \ + [[0, 1e-5, 97, True, 512, 512]] * 2 + \ + [[2, 2e-6, 129, True, 512, 512]] * 2 + \ + [[4, 2e-6, 129, True, 512, 512]] # noqa: E501 E221 + # epo, lr, frame_num, cascade, patch_size # noqa: E116 E501 + else: + assert False + + return training_strategy + + +def parse_args(argv): + parser = argparse.ArgumentParser() + + parser.add_argument('--batch_size', type=int, default=16) + parser.add_argument('-e', '--epochs', default=100, type=int) + parser.add_argument('--lambdas', type=float, nargs='+', required=True) + parser.add_argument('--model_path_i', type=str, required=True) + parser.add_argument('--model_structure', type=str, default='ld', choices=['htl', 'hts', 'ld']) + parser.add_argument('-n', '--num_workers', type=int, default=4, + help='Dataloaders worker per trainer') + parser.add_argument('--save_dir', type=str, required=True, help='Path to save models') + parser.add_argument('--train_dataset', type=str, required=True) + parser.add_argument('--pretrain_path', type=str, default=None) + parser.add_argument('--training_scheduling', type=str, default='stage0', + choices=['stage0', 'stage1', 'stage2', 'stage3'], + help='How to schedule the training strategy') + + args = parser.parse_args(argv) + return args + + +def train_one_epoch(p_net, i_net, args, dataloader, optimizer, epoch, rank, + frame_delay, model_structure): + p_net_module = p_net.module if isinstance(p_net, DDP) else p_net + training_strategy = get_training_strategy(args.training_scheduling, frame_delay, + model_structure) + p_net.train() + device = next(p_net.parameters()).device + + idx = min(len(training_strategy) - 1, epoch) + _, lr, train_seq_length, is_cascaded, patch_width, patch_height = training_strategy[idx] + + for g in optimizer.param_groups: + g['lr'] = lr + + world_size = dist.get_world_size() if rank >= 0 else 1 + use_ckpt = is_cascaded and patch_width > 256 + p_net_module.set_use_ckpt(use_ckpt) + + dataloader.dataset.set_frame_num(train_seq_length) + dataloader.dataset.set_patch_size(patch_width, patch_height) + + t0 = time.time() + for i, batch in enumerate(dataloader): + batch = [t.to(device) for t in batch] + batch_size = batch[0].size(0) + frame_nums = len(batch) - 2 + frame_stop = 2 if is_cascaded else frame_nums + qp = batch[-2] + curr_lambdas = batch[-1] + + print_loss_info = rank <= 0 and i % (100 if train_seq_length >= 8 else 200) == 0 + + ref_frame = batch[0] + if train_seq_length > 1 + 1 * frame_delay or is_cascaded: + with torch.inference_mode(): + ref_frame = i_net.forward_one_frame(ref_frame, qp, recon_only=True) + + p_net_module.clear_dpb() + p_net_module.add_ref_feature_from_frame(ref_frame, apply_feature_adaptor=False) + + for frame_idx in range(1, frame_stop): + if is_cascaded: + cur_frame = batch[1:-2] + else: + cur_frame = batch[frame_idx] + loss, info = p_net(cur_frame, qp, lambdas=curr_lambdas, get_loss_info=print_loss_info, + curr_poc=frame_idx) + + optimizer.zero_grad() + loss.backward() + + total_norm = clip_grad_norm_(p_net.parameters(), max_norm=0.2, + error_if_nonfinite=False).item() + if math.isnan(total_norm) or math.isinf(total_norm): + if rank <= 0: + print('non-finite norm, skip this batch') + continue + + optimizer.step() + + if print_loss_info: + numer = i * batch_size * world_size + denom = len(dataloader.dataset) + t1 = time.time() + print( + f'Time: {t1-t0:.3f} seconds, Train epoch {epoch}:' + f' [{numer} / {denom} ({100. * numer / denom:.0f}%)]' + f' MSE: {info['mse']} | Bpp y: {info['bpp_y']} | Bpp z: {info['bpp_z']} |' + f' Losses: {info['losses']} | lr: {optimizer.param_groups[0]['lr']:.1e}' + ) + t0 = t1 + + +def train(rank, args): + world_size = init_train(rank, args.save_dir) + model_structure = ModelStructure(args.model_structure) + if model_structure == ModelStructure.LD: + from src.models.video_model_ld import DMC, g_frame_delay as frame_delay + else: + from src.models.video_model_ht import DMC, g_frame_delay as frame_delay + train_dataset = VideoFolder(args.train_dataset, 256, 256, DMCI.qp_num(), + get_training_lambdas(args.lambdas, DMCI.qp_num()), + group_of_pictures=frame_delay) + + i_state_dict = get_state_dict(args.model_path_i) + i_net = DMCI() + i_net.load_state_dict(i_state_dict) + i_net = i_net.eval() + + if model_structure == ModelStructure.LD: + p_net = DMC() + else: + p_net = DMC(model_structure=model_structure) + begin_epoch, opt_status = load_existing_weights( + args.save_dir, p_net, rank, args.pretrain_path) + + device = get_current_device(rank) + if rank >= 0: + p_net = p_net.cuda(rank) + i_net = i_net.cuda(rank) + else: + p_net = p_net.to(device) + i_net = i_net.to(device) + p_net = wrap_ddp(p_net, rank, find_unused_parameters=True) + + optimizer = torch.optim.AdamW(p_net.parameters(), lr=1e-4) + if opt_status is not None: + optimizer.load_state_dict(opt_status) + + dataloader = get_dataloader(train_dataset, rank, world_size, args.batch_size, + args.num_workers) + for epoch in range(begin_epoch, args.epochs): + if rank >= 0: + dataloader.sampler.set_epoch(epoch) + train_one_epoch(p_net, i_net, args, dataloader, optimizer, epoch, rank, + frame_delay, model_structure) + + if rank <= 0: + save_status(args.save_dir, p_net, optimizer, epoch) + + if rank <= 0: + save_ckpt(args.save_dir, p_net) + cleanup_train(rank) + + +def main(argv): + args = parse_args(argv) + start_train(train, args) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/training.md b/training.md new file mode 100644 index 0000000..09cf956 --- /dev/null +++ b/training.md @@ -0,0 +1,378 @@ +# Training DCVC-UF + +This document describes how to train DCVC-UF and DCVC-UF-Intra from scratch, including the dataset format, launcher scripts, and the multi-stage training schedule. + +## Train dataset + +Training uses RGB PNG images. The dataset loaders are implemented in `src/datasets/image_dataset.py` (`ImageFolder`) and `src/datasets/video_dataset.py` (`VideoFolder`). + +### Image dataset + +Organize a collection of PNG images under a root folder and provide a `description.json` that lists the relative path of each image: + +``` +/path/to/image_dataset/ +├── description.json +├── img_000001.png +├── img_000002.png +└── ... +``` + +`description.json` is a flat JSON array of relative image paths: +```json +[ + "img_000001.png", + "img_000002.png", + "..." +] +``` + +### Video dataset + +Organize video sequences as folders of numbered PNG frames under a root folder and provide a `description.json` that describes the sequences: + +``` +/path/to/video_dataset/ +├── description.json +├── sequence_001/ +│ ├── im00001.png +│ ├── im00002.png +│ └── ... +├── sequence_002/ +│ ├── im00001.png +│ └── ... +└── ... +``` + +`description.json` contains two fields — `seqs` (a list of sequence metadata) and `frames` (a list of frame filenames): +```json +{ + "seqs": [ + { + "path": "sequence_001", + "width": 1920, + "height": 1080, + "seq_length": 100 + }, + { + "path": "sequence_002", + "width": 1280, + "height": 720, + "seq_length": 200 + } + ], + "frames": [ + "im00001.png", + "im00002.png", + "im00003.png", + "..." + ] +} +``` + +The `frames` list is shared across all sequences (i.e., all sequences use the same frame naming scheme). Each entry in `seqs` specifies the subdirectory path, resolution, and number of frames for that sequence. + +## Train the image model (DCVC-UF-Intra) + +Create a `train_image.sh` file with the contents below, edit the user-configurable variables, then run: + +```bash +bash train_image.sh +``` + +The script trains for 105 epochs with an adaptive learning rate schedule (1e-6 to 2e-4) and progressive patch sizes (256x256 → 512x512). + +**Training dataset:** We used subsets 0, 1, and 2 of the [Open Images](https://github.com/cvdfoundation/open-images-dataset) training set. + +### `train_image.sh` + +```bash +#!/bin/bash + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Train the DMCI image model from scratch. +# 1 stage: 105 epochs, 256x256 patches for first 90 epochs, then 512x512. + +set -e + +# ========== User-configurable variables ========== +TRAIN_DATASET=/path/to/image_dataset +SAVE_DIR=/path/to/output/image_model +LAMBDAS="10 2048" +# ================================================== + +python train_image.py \ + --train_dataset ${TRAIN_DATASET} \ + --save_dir ${SAVE_DIR} \ + --lambdas ${LAMBDAS} \ + --batch_size 16 \ + -n 4 \ + -e 105 +``` + +## Train the video model (DCVC-UF) + +Each variant uses its own launcher script. Create the launcher file shown below for the variant(s) you want to train, edit the user-configurable variables (dataset paths, pretrained image model path, save directory), then run: + +```bash +bash train_video_htl.sh # HT-L variant +bash train_video_hts.sh # HT-S variant +bash train_video_ld.sh # LD variant +``` + +Training requires a pretrained image model (DCVC-UF-Intra). Each script runs a multi-stage pipeline that progressively increases the sequence length and patch size. Longer training sequences enable the model to learn more comprehensive temporal dependencies through cross-chunk feature propagation, which is a key advantage of the chunk-based framework. + +- **HT-L/HT-S**: 4 stages, 99 epochs total, with cascading loss from stage 1 +- **LD**: 4 stages, 136 epochs total, with cascading loss from stage 1 + +**Training datasets:** We used two video datasets for training: +1. The septuplet subset of [Vimeo-90k](http://toflow.csail.mit.edu/index.html). +2. We also process the [original videos](http://data.csail.mit.edu/tofu/dataset/original_video_list.txt) of [Vimeo-90k](http://toflow.csail.mit.edu/index.html) to generate long sequences. + +### `train_video_htl.sh` + +```bash +#!/bin/bash + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Train the DMC-HTL video model (high throughput, frame_delay=8). +# 4 stages: +# stage0: 45 epochs, non-cascaded, 256x256 +# stage1: 10 epochs, cascaded, 256x256 +# stage2: 40 epochs, cascaded, 512x512 +# stage3: 4 epochs, cascaded, 512x512 + +set -e + +# ========== User-configurable variables ========== +TRAIN_DATASET_STAGE0=/path/to/video_dataset_stage0 +TRAIN_DATASET_STAGE1=/path/to/video_dataset_stage1 +TRAIN_DATASET_STAGE2=/path/to/video_dataset_stage2 +TRAIN_DATASET_STAGE3=/path/to/video_dataset_stage3 + +MODEL_PATH_I=/path/to/image_model.pth.tar +SAVE_DIR=/path/to/output/video_model_htl +LAMBDAS="1 768" +# ================================================== + +MODEL_STRUCTURE=htl + +# stage0: base training +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE0} \ + --save_dir ${SAVE_DIR}/s0 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage0 \ + --batch_size 16 \ + -n 4 \ + -e 45 + +# stage1: cascaded finetuning at 256x256 +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE1} \ + --save_dir ${SAVE_DIR}/s1 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage1 \ + --pretrain_path ${SAVE_DIR}/s0/ckpt.pth.tar \ + --batch_size 8 \ + -n 4 \ + -e 10 + +# stage2: cascaded finetuning at 512x512 +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE2} \ + --save_dir ${SAVE_DIR}/s2 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage2 \ + --pretrain_path ${SAVE_DIR}/s1/ckpt.pth.tar \ + --batch_size 8 \ + -n 8 \ + -e 40 + +# stage3: cascaded finetuning at 512x512 with longer sequences +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE3} \ + --save_dir ${SAVE_DIR}/s3 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage3 \ + --pretrain_path ${SAVE_DIR}/s2/ckpt.pth.tar \ + --batch_size 16 \ + -n 8 \ + -e 4 +``` + +### `train_video_hts.sh` + +```bash +#!/bin/bash + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Train the DMC-HTS video model (high throughput, frame_delay=8). +# 4 stages: +# stage0: 45 epochs, non-cascaded, 256x256 +# stage1: 10 epochs, cascaded, 256x256 +# stage2: 40 epochs, cascaded, 512x512 +# stage3: 4 epochs, cascaded, 512x512 + +set -e + +# ========== User-configurable variables ========== +TRAIN_DATASET_STAGE0=/path/to/video_dataset_stage0 +TRAIN_DATASET_STAGE1=/path/to/video_dataset_stage1 +TRAIN_DATASET_STAGE2=/path/to/video_dataset_stage2 +TRAIN_DATASET_STAGE3=/path/to/video_dataset_stage3 + +MODEL_PATH_I=/path/to/image_model.pth.tar +SAVE_DIR=/path/to/output/video_model_hts +LAMBDAS="1 768" +# ================================================== + +MODEL_STRUCTURE=hts + +# stage0: base training +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE0} \ + --save_dir ${SAVE_DIR}/s0 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage0 \ + --batch_size 16 \ + -n 4 \ + -e 45 + +# stage1: cascaded finetuning at 256x256 +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE1} \ + --save_dir ${SAVE_DIR}/s1 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage1 \ + --pretrain_path ${SAVE_DIR}/s0/ckpt.pth.tar \ + --batch_size 8 \ + -n 4 \ + -e 10 + +# stage2: cascaded finetuning at 512x512 +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE2} \ + --save_dir ${SAVE_DIR}/s2 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage2 \ + --pretrain_path ${SAVE_DIR}/s1/ckpt.pth.tar \ + --batch_size 8 \ + -n 8 \ + -e 40 + +# stage3: cascaded finetuning at 512x512 with longer sequences +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE3} \ + --save_dir ${SAVE_DIR}/s3 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage3 \ + --pretrain_path ${SAVE_DIR}/s2/ckpt.pth.tar \ + --batch_size 16 \ + -n 8 \ + -e 4 +``` + +### `train_video_ld.sh` + +```bash +#!/bin/bash + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Train the DMC-LD video model (low delay, frame_delay=1). +# 4 stages: +# stage0: 55 epochs, non-cascaded, 256x256 +# stage1: 37 epochs, cascaded, 256x256 +# stage2: 40 epochs, cascaded, 512x512 +# stage3: 4 epochs, cascaded, 512x512 + +set -e + +# ========== User-configurable variables ========== +TRAIN_DATASET_STAGE0=/path/to/video_dataset_stage0 +TRAIN_DATASET_STAGE1=/path/to/video_dataset_stage1 +TRAIN_DATASET_STAGE2=/path/to/video_dataset_stage2 +TRAIN_DATASET_STAGE3=/path/to/video_dataset_stage3 + +MODEL_PATH_I=/path/to/image_model.pth.tar +SAVE_DIR=/path/to/output/video_model_ld +LAMBDAS="1 768" +# ================================================== + +MODEL_STRUCTURE=ld + +# stage0: base training +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE0} \ + --save_dir ${SAVE_DIR}/s0 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage0 \ + --batch_size 16 \ + -n 4 \ + -e 55 + +# stage1: cascaded finetuning at 256x256 +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE1} \ + --save_dir ${SAVE_DIR}/s1 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage1 \ + --pretrain_path ${SAVE_DIR}/s0/ckpt.pth.tar \ + --batch_size 8 \ + -n 4 \ + -e 37 + +# stage2: cascaded finetuning at 512x512 +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE2} \ + --save_dir ${SAVE_DIR}/s2 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage2 \ + --pretrain_path ${SAVE_DIR}/s1/ckpt.pth.tar \ + --batch_size 8 \ + -n 8 \ + -e 40 + +# stage3: cascaded finetuning at 512x512 with longer sequences +python train_video.py \ + --model_structure ${MODEL_STRUCTURE} \ + --model_path_i ${MODEL_PATH_I} \ + --train_dataset ${TRAIN_DATASET_STAGE3} \ + --save_dir ${SAVE_DIR}/s3 \ + --lambdas ${LAMBDAS} \ + --training_scheduling stage3 \ + --pretrain_path ${SAVE_DIR}/s2/ckpt.pth.tar \ + --batch_size 4 \ + -n 8 \ + -e 4 +```