From e16ad7aaebd1abaac8b42731eabc956a29d98563 Mon Sep 17 00:00:00 2001 From: Abishek <52214183+r-abishek@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:13:42 -0700 Subject: [PATCH] RPP Gaussian Noise Voxel Tensor on HOST and HIP (#323) * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * Initial commit * Merge changes and fixes for gaussian noise 3d * Test suite merge and fixes for gaussian noise 3d * added initial support for gaussian noise HOST NDHWC variant * added NCDHW support * added u8 and i8 bitdepth support * updated gaussian noise voxel host outer api to match with hip api merged gaussian noise voxel kernel codes in 2d kernel codes * resolved black pixels issue across border * minor changes * modified HIP kernel as per the latest changes * modified the description as per the latest changes * made changes in test suite * added new host compute functions for gaussian noise 3d * Bump rocm-docs-core[api_reference] from 0.35.0 to 0.35.1 in /docs/sphinx (#319) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.35.0 to 0.35.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.35.0...v0.35.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * moved the copy 3d function to rpp_cpu_common.hpp * reverted incorrect changes happened with merge * fix test suite issue with RMN * revert incorrect merge changes remove empty blank lines * modify suffix from 3d to voxel for gaussian noise added U8 support for gaussian noise HIP voxel kernel * added separate copy kernel for copying input to output when mean and stddev passed is 0 * Bump rocm-docs-core[api_reference] from 0.35.1 to 0.36.0 in /docs/sphinx (#322) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.35.1 to 0.36.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.35.1...v0.36.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fixed bug in test suite * Docs - Bump rocm-docs-core[api_reference] from 0.36.0 to 0.37.0 in /docs/sphinx (#328) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.36.0 to 0.37.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.36.0...v0.37.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Link cleanup (#326) * link updates * update tables * pare down index * API cleanup * consistency * verbiage * Update notes * change function name from CHECK to CHECK_RETURN_STATUS * Docs - Bump rocm-docs-core[api_reference] from 0.37.0 to 0.37.1 in /docs/sphinx (#329) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.37.0 to 0.37.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.37.0...v0.37.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Voxel Flip on HIP and HOST (#285) * added support for flip voxel * added test suite support * added golden outputs for flip voxel made changes in test suite to run QA tests for flip * updated golden outputs with correct values * minor bug fix in the hip test suite * made changes to variable names for better readability fixed comments in test suite minor cleanup * combined the flip axis factor as ternary operator in HIP kernel added new enum for error handling when source and destination layouts are not matching * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted flip voxel golden outputs to bin files * changed copyright from 2023 to 2024 * Update flip_voxel.hpp license * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * Bump rocm-docs-core[api_reference] from 0.34.2 to 0.35.0 in /docs/sphinx (#313) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.2 to 0.35.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.2...v0.35.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Reduction - Tensor min and Tensor max on HOST and HIP (#260) * Minor Change * Add Validation check for DST_FOLDER path * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * Add Validation checks for all options in testAllScript.sh * Add sanity check for dual Input cases Set Max Dimension and Max Image Dump Replaced Fast DCT tag with Accurate DCT * Regenerate golden outputs using accurate dct Flag Add golden outputs for some new augmentations * Fix Flip golden outputs mismatch Fix PLN3 variants mismatch in QA mode * Add MAX_BATCH_SIZE check removed Augmentations function calls for failing Qa modes code cleanup * Add crop and gamma correction augmentations code cleanup * Add comments to functions in rpp_test_suite_common.h * minor change * code cleanup * minor code changes * Change roi and Image sizes for crop augmentation * Change numIterations option to numRuns Addressed PR comments * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * Add turboJpeg header to update maxHeight and maxWidth values * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Change the performance Timings logic * Add Avx2 implementation for F32 and U8 toggle variants * minor change to support u8_f16 and u8_f32 cases * Regenerate LUT golden outputs with ACCURATE_DCT tag * Minor code changes * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * Made changes to the runTests.py in Host to remove testAllScipts.sh * Made changes to the runTests.py in HIP to remove testAllScipts.sh * Initial commit - Image min and max Reduction kernel Includes * u8 datatype for both min and max HOST Tensor of all variants. * Testsuite changes. * NWC -initial code for min max PLN3 - PLN3 * made changes to split min and max kernels seperately * splitted kernels for min and max * made changes to print final max/min in the R,G,B channels * fixed inaccuracies in min/max computation * made changes to typecast intermediate output to output requested by user added comments for the code code cleanup and minor changes in test suite * fixed build issues removed image folders used for min, max and sum reverted unwanted file changes * minor changes in test suite * removed support for unwanted test case in Tensor_hip.cpp * Adds new option roi * remove testAllScripts.sh * Adds roi Option in HIP backend * Implement f32 variants * Implement f16 and i8 datatype variants * change F32 load and store logic * Add build flags in CMakeLists.txt to set AVX/SSE flags based on the system configuration * minor code changes * Initial commit - Image sum Reduction kernel Includes u8 PLN1 -> PLN1 conversion for HOST Tensor * Implement PKD3 and PLN3 for Image sum Tensor HOST * Support i8, f16 and f32 datatypes * Initial commit - Image sum Reduction HIP kernel Includes u8 PLN1 -> PLN1 conversion for Tensor * Implement PKD3 and PLN3 for Image sum Tensor HIP * Add support in testsuite Revert normalization for i8 HOST Tensor variants * Fix HIP testsuite Remove additional blanks for 1 channel output * Modify print statement in HIP testsuite * Improve readability for testsuite outputs * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * Fix HIP to support larger inputs * optimized load and store functions for water U8 and F32 variants in host removed commented code * Cleanup * removed golden outputs for water * minor changes * Cleanup Support Reduction QA test in testsuite * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * Remove unused variables and C style casting * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * Optimize u8 datatype further * Fix static_cast * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * added rotate case with golden outputs changed generic bilinear HOST codes to match with HIP codes * Add golden output for remaining all tensor augmentations * fix python script issues * Optimize u8 and i8 datatype Uses uint and int internal processing instead of float * Fix testsuite build errors * minor change * Fix QA check * Modify api naming from image_sum to tensor_sum Includes changes for both HOST and HIP * Support HIP Backend for RICAP * change rcm and rmn golden outputs * Fix HIP pkd3->pkd3 variant * changes based on review comments * change test_suite folder to tests * Optimize u8 and i8 datatype of HIP Includes modification in naming of shared memory * minor fix * changed generic nn F32 loads using gather and setr instructions * Optimize and cleanup U8 HIP * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Fix i8 datatype variants Includes cleanup * Fix the issues with color_to_greyscale * remove the empty folder creation * reverting back the folder name change * minor change * added comments for latest changes * minor change * Improve readability and Cleanup * Fix QA for HIP Includes cleanup * resolved review comments * minor change * Modify api naming from image_ to tensor_ for HOST * Add support for QA tests * removed range check for RMN U8-F32 and U8-F16 variants changed from hipMemset to hipMemsetAsync for RMN HIP Kernel removed multiplication by 255 for stdDev in RMN HOST U8-F16 and U8-F32 variants * Modify naming of shared memory with _smem in HIP Includes cleanup * Typecast and reuse markArr for HIP U8 and I8 * Cleanup and minor optimization * minor fix * fix codacy warnings * Additional cleanup * Cleanup and move #define * Changed the complexity of if statements in runTests.py * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Codacy fixes * Fix codacy warnings * Codacy fix * Address other codacy warnings * cleanup * Change Image functions to generic * Update ricap.hpp with reference paper * resolved minor issues happened with merge * minor changes * fixed minor issue with getting profiler times * minor formatting changes * resolved build issues in test suite renamed the min and max kernel file names * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * Cmake fix to prevent warning * Fix paths in new python scripts * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * Test suite fixes after tensor_min / tensor_max HOST merge * Fix max case * QA tests fix for hip and host * naming convention changes as per new std * Substitute imagePartial with partial * Substitute imageMin/imageMax with min/max * Replace hipMemset with hipMemsetAsync, and replace hipDeviceSynchronize with hipStreamSynchronize * Use variable instead of batchCount*4 * Use post increment effectivly * Resolve codacy warnings * Additional cleanup * remove unused variable * Documentation - Bump rocm-docs-core[api_reference] from 0.28.0 to 0.29.0 in /docs/sphinx (#265) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.28.0 to 0.29.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove auto merge boost * Spaces formatting * Bump rocm-docs-core[api_reference] from 0.29.0 to 0.30.1 in /docs/sphinx (#268) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.29.0 to 0.30.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.29.0...v0.30.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add support for mi300 (#269) * Documentation - Bump rocm-docs-core[api_reference] from 0.30.1 to 0.30.2 in /docs/sphinx (#273) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.1 to 0.30.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.1...v0.30.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Cleanup by removing oneliner functions as inline * RPP Tensor Audio Support - To Decibels (#258) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Replace vectors with arrays * Cleanup * Replace Rpp64s with Rpp32s * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * Fix build errors and qa tests in Audio Test suite * Remove auto-merge repeated funcs * Improve clarity on header docs * made changes based on review comments * stored golden outputs of to_decibels in binary file removed golden output text files for non silent region * removed unused parameter in verify_output function * updated list of cases supported in python script * added error handling for opening golden output file * Codacy fix and tests warning fix * Codacy fix * Codacy fix trial * codacy fix for checking boundaries of fstream --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Documentation - Bump rocm-docs-core[api_reference] from 0.30.2 to 0.30.3 in /docs/sphinx (#274) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.2 to 0.30.3. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.2...v0.30.3) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Adding issue template (#270) * Add files via upload * added ROCm v6, MI300, default component * Fix cast used in testsuite Includes minor fixes * Fix displaying f16 outputs * Optimize HOST min/max reduce function further * Fix spacing in HIP kernels * Fix PLN1 outputs for u8 and i8 datatypes of HOST backend * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Store reference outputs via map for min and max kernels * Update tensor_max.hpp license * Update tensor_min.hpp license * Fix output comparison check * Merge branch 'ar/opt_tensor_min_tensor_max' of https://github.com/r-abishek/rpp into sn/tensor_min_max * Modify exit condition used in outer most kernel * Modify srcIdx for HIP Tensor min * Using maximum as 255 for HIP Tensor min * Modify srcIdx for HIP Tensor max kernel Also fixes build error in testsuite * Fix corrupted outputs displayed for Tensor sum * Fix corruption issue seen with tensor sum kernel * Fix minimum for I8 Tensor max kernel * Modified HIP buffer initialization with a common function * Fix redefinition * Remove additional variables xAlignedLength * Remove unwanted xAlignedLength and xDiff * Remove redefinition of TensorSumReferenceOutputs * Fix for CI issue * Add parenthesis --------- Signed-off-by: dependabot[bot] Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: fiona-gladwin Co-authored-by: Kiriti Gowda Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> * CI - Update precheckin.groovy * added separate kernels for doing flip when horizontal flip is not set * fixed build issue * Add supported case * reverted incorrect changes happened with merge --------- Signed-off-by: dependabot[bot] Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sam Wu Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: Sundarrajan98 Co-authored-by: Pavel Tcherniaev Co-authored-by: fiona-gladwin Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> * RPP Vignette Tensor on HOST and HIP (#311) * Add Vignette Tensor HOST and HIP Implementation * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * Add Vignette Tensor HOST and HIP Implementation * Address review comments * Update rpp_hip_common.hpp * Update vignette.hpp to add rpp_hip_math_nearbyintf8() * Update Tensor_hip.cpp to add hipHostFree * Fix init * Repeated initialization bugfix * Add host case 46 --------- Signed-off-by: dependabot[bot] Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sam Wu Co-authored-by: Kiriti Gowda Co-authored-by: sampath1117 Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: Sundarrajan98 Co-authored-by: Pavel Tcherniaev * Bump rocm-docs-core[api_reference] from 0.37.1 to 0.38.0 in /docs/sphinx (#333) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.37.1 to 0.38.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.37.1...v0.38.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * added doxygen input and output for gaussian noise voxel * RPP Tensor Audio Support - Resample (#310) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Intial commit - slice_audio * Intial commit - mel_filter_bank * Intial commit - spectrogram * Intial commit - resample * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Remove unused variables in header file * Add axes parameter * Replace Rpp64s with Rpp32s * Replace vectors with arrays Includes optimization * Cleanup * Cleanup * Cleanup and optimize * Move malloc outside openMP loop * Optimize and precompute cutOff * Cleanup * Fix buffer used * Fix buffer used * Additional Cleanup * Fix buffer allocation Includes minor optimization * Optimize post incrmeent operation * Optimize post increment operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * move Tensor_host_audio.cpp to host folder * fix qa mismatches * move Tensor_host_audio.cpp to host folder * fix qa mismatches * move Tensor_host_audio.cpp to host folder * Add spectrogram case in Tensor_host_audio.cpp * move Tensor_host_audio.cpp to host folder * fix qa mismatches * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * Add Doxygen comments * Add Doxygen comments * minor change * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * removed unnecessary files * removed debugging print statement * updated copyright * updated description for resample based on latest changes * converted golden outputs for resample to binary files * Passed resampling window as a parameter to resampling function * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * removed unnecessary files removed unncessary validation checks in test suite * modified sinc to use ONE_OVER_6 macro * combined srcLength and channels into single tensor removed the usage of quality parameter since not used in the kernel * minor change * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * used std functions for floor and ceil use static_cast instead of floor in the resample kernel * Bump rocm-docs-core[api_reference] from 0.34.2 to 0.35.0 in /docs/sphinx (#313) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.2 to 0.35.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.2...v0.35.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Reduction - Tensor min and Tensor max on HOST and HIP (#260) * Minor Change * Add Validation check for DST_FOLDER path * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * Add Validation checks for all options in testAllScript.sh * Add sanity check for dual Input cases Set Max Dimension and Max Image Dump Replaced Fast DCT tag with Accurate DCT * Regenerate golden outputs using accurate dct Flag Add golden outputs for some new augmentations * Fix Flip golden outputs mismatch Fix PLN3 variants mismatch in QA mode * Add MAX_BATCH_SIZE check removed Augmentations function calls for failing Qa modes code cleanup * Add crop and gamma correction augmentations code cleanup * Add comments to functions in rpp_test_suite_common.h * minor change * code cleanup * minor code changes * Change roi and Image sizes for crop augmentation * Change numIterations option to numRuns Addressed PR comments * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * Add turboJpeg header to update maxHeight and maxWidth values * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Change the performance Timings logic * Add Avx2 implementation for F32 and U8 toggle variants * minor change to support u8_f16 and u8_f32 cases * Regenerate LUT golden outputs with ACCURATE_DCT tag * Minor code changes * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * Made changes to the runTests.py in Host to remove testAllScipts.sh * Made changes to the runTests.py in HIP to remove testAllScipts.sh * Initial commit - Image min and max Reduction kernel Includes * u8 datatype for both min and max HOST Tensor of all variants. * Testsuite changes. * NWC -initial code for min max PLN3 - PLN3 * made changes to split min and max kernels seperately * splitted kernels for min and max * made changes to print final max/min in the R,G,B channels * fixed inaccuracies in min/max computation * made changes to typecast intermediate output to output requested by user added comments for the code code cleanup and minor changes in test suite * fixed build issues removed image folders used for min, max and sum reverted unwanted file changes * minor changes in test suite * removed support for unwanted test case in Tensor_hip.cpp * Adds new option roi * remove testAllScripts.sh * Adds roi Option in HIP backend * Implement f32 variants * Implement f16 and i8 datatype variants * change F32 load and store logic * Add build flags in CMakeLists.txt to set AVX/SSE flags based on the system configuration * minor code changes * Initial commit - Image sum Reduction kernel Includes u8 PLN1 -> PLN1 conversion for HOST Tensor * Implement PKD3 and PLN3 for Image sum Tensor HOST * Support i8, f16 and f32 datatypes * Initial commit - Image sum Reduction HIP kernel Includes u8 PLN1 -> PLN1 conversion for Tensor * Implement PKD3 and PLN3 for Image sum Tensor HIP * Add support in testsuite Revert normalization for i8 HOST Tensor variants * Fix HIP testsuite Remove additional blanks for 1 channel output * Modify print statement in HIP testsuite * Improve readability for testsuite outputs * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * Fix HIP to support larger inputs * optimized load and store functions for water U8 and F32 variants in host removed commented code * Cleanup * removed golden outputs for water * minor changes * Cleanup Support Reduction QA test in testsuite * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * Remove unused variables and C style casting * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * Optimize u8 datatype further * Fix static_cast * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * added rotate case with golden outputs changed generic bilinear HOST codes to match with HIP codes * Add golden output for remaining all tensor augmentations * fix python script issues * Optimize u8 and i8 datatype Uses uint and int internal processing instead of float * Fix testsuite build errors * minor change * Fix QA check * Modify api naming from image_sum to tensor_sum Includes changes for both HOST and HIP * Support HIP Backend for RICAP * change rcm and rmn golden outputs * Fix HIP pkd3->pkd3 variant * changes based on review comments * change test_suite folder to tests * Optimize u8 and i8 datatype of HIP Includes modification in naming of shared memory * minor fix * changed generic nn F32 loads using gather and setr instructions * Optimize and cleanup U8 HIP * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Fix i8 datatype variants Includes cleanup * Fix the issues with color_to_greyscale * remove the empty folder creation * reverting back the folder name change * minor change * added comments for latest changes * minor change * Improve readability and Cleanup * Fix QA for HIP Includes cleanup * resolved review comments * minor change * Modify api naming from image_ to tensor_ for HOST * Add support for QA tests * removed range check for RMN U8-F32 and U8-F16 variants changed from hipMemset to hipMemsetAsync for RMN HIP Kernel removed multiplication by 255 for stdDev in RMN HOST U8-F16 and U8-F32 variants * Modify naming of shared memory with _smem in HIP Includes cleanup * Typecast and reuse markArr for HIP U8 and I8 * Cleanup and minor optimization * minor fix * fix codacy warnings * Additional cleanup * Cleanup and move #define * Changed the complexity of if statements in runTests.py * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Codacy fixes * Fix codacy warnings * Codacy fix * Address other codacy warnings * cleanup * Change Image functions to generic * Update ricap.hpp with reference paper * resolved minor issues happened with merge * minor changes * fixed minor issue with getting profiler times * minor formatting changes * resolved build issues in test suite renamed the min and max kernel file names * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * Cmake fix to prevent warning * Fix paths in new python scripts * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * Test suite fixes after tensor_min / tensor_max HOST merge * Fix max case * QA tests fix for hip and host * naming convention changes as per new std * Substitute imagePartial with partial * Substitute imageMin/imageMax with min/max * Replace hipMemset with hipMemsetAsync, and replace hipDeviceSynchronize with hipStreamSynchronize * Use variable instead of batchCount*4 * Use post increment effectivly * Resolve codacy warnings * Additional cleanup * remove unused variable * Documentation - Bump rocm-docs-core[api_reference] from 0.28.0 to 0.29.0 in /docs/sphinx (#265) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.28.0 to 0.29.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove auto merge boost * Spaces formatting * Bump rocm-docs-core[api_reference] from 0.29.0 to 0.30.1 in /docs/sphinx (#268) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.29.0 to 0.30.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.29.0...v0.30.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add support for mi300 (#269) * Documentation - Bump rocm-docs-core[api_reference] from 0.30.1 to 0.30.2 in /docs/sphinx (#273) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.1 to 0.30.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.1...v0.30.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Cleanup by removing oneliner functions as inline * RPP Tensor Audio Support - To Decibels (#258) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Replace vectors with arrays * Cleanup * Replace Rpp64s with Rpp32s * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * Fix build errors and qa tests in Audio Test suite * Remove auto-merge repeated funcs * Improve clarity on header docs * made changes based on review comments * stored golden outputs of to_decibels in binary file removed golden output text files for non silent region * removed unused parameter in verify_output function * updated list of cases supported in python script * added error handling for opening golden output file * Codacy fix and tests warning fix * Codacy fix * Codacy fix trial * codacy fix for checking boundaries of fstream --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Documentation - Bump rocm-docs-core[api_reference] from 0.30.2 to 0.30.3 in /docs/sphinx (#274) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.2 to 0.30.3. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.2...v0.30.3) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Adding issue template (#270) * Add files via upload * added ROCm v6, MI300, default component * Fix cast used in testsuite Includes minor fixes * Fix displaying f16 outputs * Optimize HOST min/max reduce function further * Fix spacing in HIP kernels * Fix PLN1 outputs for u8 and i8 datatypes of HOST backend * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Store reference outputs via map for min and max kernels * Update tensor_max.hpp license * Update tensor_min.hpp license * Fix output comparison check * Merge branch 'ar/opt_tensor_min_tensor_max' of https://github.com/r-abishek/rpp into sn/tensor_min_max * Modify exit condition used in outer most kernel * Modify srcIdx for HIP Tensor min * Using maximum as 255 for HIP Tensor min * Modify srcIdx for HIP Tensor max kernel Also fixes build error in testsuite * Fix corrupted outputs displayed for Tensor sum * Fix corruption issue seen with tensor sum kernel * Fix minimum for I8 Tensor max kernel * Modified HIP buffer initialization with a common function * Fix redefinition * Remove additional variables xAlignedLength * Remove unwanted xAlignedLength and xDiff * Remove redefinition of TensorSumReferenceOutputs * Fix for CI issue * Add parenthesis --------- Signed-off-by: dependabot[bot] Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: fiona-gladwin Co-authored-by: Kiriti Gowda Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> * CI - Update precheckin.groovy * Png update (#316) * PNG file conversion * reference .png files * remove JPG files * edit IMAGE_PATH * RPP Test Suite Upgrade 6 - Restructure common HIP/HOST code (#315) * moved the common functions used in a python test suites to to a common python script created helper function for displaying QA test summary * reversed the order of performance runs loop and decode loop in all test suites * modified remaining python scripts to use print qa helper function for displaying QA results * added new helper function for print the performance test results as a summary * added caseMax, caseMin variables in image test suite made changes to run only necessary bitdepths needed incase of qa mode --------- Co-authored-by: sampath1117 * Fix build error * removed outBegin variable * remove duplicate line in readme --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 Co-authored-by: Sam Wu Co-authored-by: Pavel Tcherniaev Co-authored-by: fiona-gladwin Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> Co-authored-by: randyh62 <42045079+randyh62@users.noreply.github.com> * Docs - Missing input and output images for Doxygen (#331) * added missing outputs for image augmentations modified the description with correct output names * added gif for voxel input and outputs * modified the output images for water, resize_crop_mirror and resize_mirror_normalize --------- Co-authored-by: sampath1117 * Scratch buffers rename for HOST and HIP (#324) * Change all maskArr to scratchBufferHip * Change all tempFloatmem to scratchBufferHost * Update CMakeLists.txt Version updates * Rename maskArr to scratchBufferHip --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sam Wu Co-authored-by: Kiriti Gowda Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: Sundarrajan98 Co-authored-by: Pavel Tcherniaev Co-authored-by: fiona-gladwin Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> Co-authored-by: randyh62 <42045079+randyh62@users.noreply.github.com> --- ...augmentations_gaussian_noise_150x150x4.gif | Bin 0 -> 101658 bytes include/rppdefs.h | 8 + include/rppt_tensor_effects_augmentations.h | 43 ++ src/include/cpu/rpp_cpu_common.hpp | 126 ++++- src/include/hip/rpp_hip_common.hpp | 58 ++ src/modules/cpu/kernel/noise_gaussian.hpp | 496 ++++++++++++++++++ src/modules/hip/kernel/noise_gaussian.hpp | 209 ++++++++ .../rppt_tensor_effects_augmentations.cpp | 126 ++++- .../rppt_tensor_geometric_augmentations.cpp | 2 + utilities/test_suite/HIP/Tensor_voxel_hip.cpp | 33 +- utilities/test_suite/HIP/runTests_voxel.py | 7 +- .../test_suite/HOST/Tensor_voxel_host.cpp | 21 + utilities/test_suite/HOST/runTests_voxel.py | 7 +- utilities/test_suite/rpp_test_suite_voxel.h | 3 +- 14 files changed, 1124 insertions(+), 15 deletions(-) create mode 100644 docs/data/doxygenOutputs/effects_augmentations_gaussian_noise_150x150x4.gif diff --git a/docs/data/doxygenOutputs/effects_augmentations_gaussian_noise_150x150x4.gif b/docs/data/doxygenOutputs/effects_augmentations_gaussian_noise_150x150x4.gif new file mode 100644 index 0000000000000000000000000000000000000000..b36bd200136d73db5110e475ad2831a305801bf1 GIT binary patch literal 101658 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 z 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 literal 0 HcmV?d00001 diff --git a/include/rppdefs.h b/include/rppdefs.h index c1eb322f8..99b9bb601 100644 --- a/include/rppdefs.h +++ b/include/rppdefs.h @@ -53,6 +53,14 @@ SOFTWARE. /*! \brief RPP maximum dimensions in tensor \ingroup group_rppdefs \page subpage_rppt */ #define RPPT_MAX_DIMS ( 5 ) +#define CHECK_RETURN_STATUS(x) do { \ + int retval = (x); \ + if (retval != 0) { \ + fprintf(stderr, "Runtime error: %s returned %d at %s:%d", #x, retval, __FILE__, __LINE__); \ + exit(-1); \ + } \ +} while (0) + const float ONE_OVER_6 = 1.0f / 6; const float ONE_OVER_3 = 1.0f / 3; const float ONE_OVER_255 = 1.0f / 255; diff --git a/include/rppt_tensor_effects_augmentations.h b/include/rppt_tensor_effects_augmentations.h index 8e543a264..365c22545 100644 --- a/include/rppt_tensor_effects_augmentations.h +++ b/include/rppt_tensor_effects_augmentations.h @@ -465,6 +465,49 @@ RppStatus rppt_vignette_host(RppPtr_t srcPtr, RpptDescPtr srcDescPtr, RppPtr_t d RppStatus rppt_vignette_gpu(RppPtr_t srcPtr, RpptDescPtr srcDescPtr, RppPtr_t dstPtr, RpptDescPtr dstDescPtr, Rpp32f *vignetteIntensityTensor, RpptROIPtr roiTensorPtrSrc, RpptRoiType roiType, rppHandle_t rppHandle); #endif // GPU_SUPPORT +/*! \brief Gaussian noise augmentation on HOST backend + * \details This function adds gaussian noise to a batch of 4D tensors. + * Support added for u8 -> u8, f32 -> f32 datatypes. + * \image html input150x150x4.gif Sample Input + * \image html effects_augmentations_gaussian_noise_150x150x4.gif Sample Output + * \param [in] srcPtr source tensor in HOST memory + * \param [in] srcGenericDescPtr source tensor descriptor + * \param [out] dstPtr destination tensor in HOST memory + * \param [in] dstGenericDescPtr destination tensor descriptor + * \param [in] meanTensor mean values for each input, which are used to compute the generalized Box-Mueller transforms in a gaussian distribution (1D tensor of size batchSize with meanTensor[i] >= 0 for each image in batch) + * \param [in] stdDevTensor stdDev values for each image, which are used to compute the generalized Box-Mueller transforms in a gaussian distribution (1D tensor of size batchSize with stdDevTensor[i] >= 0 for each image in batch) + * \param [in] seed A user-defined seed value (single Rpp32u value) + * \param [in] roiGenericPtrSrc ROI data for each image in source tensor (tensor of batchSize RpptRoiGeneric values) + * \param [in] roiType ROI type used (RpptRoi3DType::XYZWHD or RpptRoi3DType::LTFRBB) + * \param [in] rppHandle RPP HOST handle created with \ref rppCreateWithBatchSize() + * \return A \ref RppStatus enumeration. + * \retval RPP_SUCCESS Successful completion. + * \retval RPP_ERROR* Unsuccessful completion. + */ +RppStatus rppt_gaussian_noise_voxel_host(RppPtr_t srcPtr, RpptGenericDescPtr srcGenericDescPtr, RppPtr_t dstPtr, RpptGenericDescPtr dstGenericDescPtr, Rpp32f *meanTensor, Rpp32f *stdDevTensor, Rpp32u seed, RpptROI3DPtr roiGenericPtrSrc, RpptRoi3DType roiType, rppHandle_t rppHandle); + +#ifdef GPU_SUPPORT +/*! \brief Gaussian noise augmentation on HIP backend + * \details This function adds gaussian noise to a batch of 4D tensors. + * Support added for u8 -> u8, f32 -> f32 datatypes. + * \image html input150x150x4.gif Sample Input + * \image html effects_augmentations_gaussian_noise_150x150x4.gif Sample Output + * \param [in] srcPtr source tensor in HIP memory + * \param [in] srcGenericDescPtr source tensor descriptor + * \param [out] dstPtr destination tensor in HIP memory + * \param [in] dstGenericDescPtr destination tensor descriptor + * \param [in] meanTensor mean values for each input, which are used to compute the generalized Box-Mueller transforms in a gaussian distribution (1D tensor of size batchSize with meanTensor[i] >= 0 for each image in batch) + * \param [in] stdDevTensor stdDev values for each input, which are used to compute the generalized Box-Mueller transforms in a gaussian distribution (1D tensor of size batchSize with stdDevTensor[i] >= 0 for each image in batch) + * \param [in] seed A user-defined seed value (single Rpp32u value) + * \param [in] roiGenericPtrSrc ROI data for each image in source tensor (tensor of batchSize RpptRoiGeneric values) + * \param [in] roiType ROI type used (RpptRoi3DType::XYZWHD or RpptRoi3DType::LTFRBB) + * \param [in] rppHandle RPP HIP handle created with \ref rppCreateWithStreamAndBatchSize() + * \return A \ref RppStatus enumeration. + * \retval RPP_SUCCESS Successful completion. + * \retval RPP_ERROR* Unsuccessful completion. + */ +RppStatus rppt_gaussian_noise_voxel_gpu(RppPtr_t srcPtr, RpptGenericDescPtr srcDescPtr, RppPtr_t dstPtr, RpptGenericDescPtr dstDescPtr, Rpp32f *meanTensor, Rpp32f *stdDevTensor, Rpp32u seed, RpptROI3DPtr roiGenericPtrSrc, RpptRoi3DType roiType, rppHandle_t rppHandle); +#endif // GPU_SUPPORT /*! @} */ diff --git a/src/include/cpu/rpp_cpu_common.hpp b/src/include/cpu/rpp_cpu_common.hpp index 778ef2894..0445fea4d 100644 --- a/src/include/cpu/rpp_cpu_common.hpp +++ b/src/include/cpu/rpp_cpu_common.hpp @@ -1050,7 +1050,61 @@ inline void generate_bressenham_line_host(T *dstPtr, RppiSize dstSize, Rpp32u *e } } - +// copy ROI of voxel data from input to output +template +void copy_3d_host_tensor(T *srcPtr, + RpptGenericDescPtr srcGenericDescPtr, + T *dstPtr, + RpptGenericDescPtr dstGenericDescPtr, + RpptROI3D *roi, + RppLayoutParams layoutParams) +{ + if((srcGenericDescPtr->layout == RpptLayout::NDHWC) && (dstGenericDescPtr->layout == RpptLayout::NDHWC)) + { + T *srcPtrDepth = srcPtr + (roi->xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi->xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi->xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + T *dstPtrDepth = dstPtr; + Rpp32u width = roi->xyzwhdROI.roiWidth * srcGenericDescPtr->dims[4]; + for(int i = 0; i < roi->xyzwhdROI.roiDepth; i++) + { + T *srcPtrRow = srcPtrDepth; + T *dstPtrRow = dstPtrDepth; + for(int j = 0; j < roi->xyzwhdROI.roiHeight; j++) + { + memcpy(dstPtrRow, srcPtrRow, width * sizeof(T)); + srcPtrRow += srcGenericDescPtr->strides[2]; + dstPtrRow += dstGenericDescPtr->strides[2]; + } + srcPtrDepth += srcGenericDescPtr->strides[1]; + dstPtrDepth += dstGenericDescPtr->strides[1]; + } + } + else if ((srcGenericDescPtr->layout == RpptLayout::NCDHW) && (dstGenericDescPtr->layout == RpptLayout::NCDHW)) + { + T *srcPtrChannel = srcPtr + (roi->xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi->xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi->xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + T *dstPtrChannel = dstPtr; + int channels = srcGenericDescPtr->dims[4]; + for(int c = 0; c < channels; c++) + { + T *srcPtrDepth = srcPtrChannel; + T *dstPtrDepth = dstPtrChannel; + for(int i = 0; i < roi->xyzwhdROI.roiDepth; i++) + { + T *srcPtrRow = srcPtrDepth; + T *dstPtrRow = dstPtrDepth; + for(int j = 0; j < roi->xyzwhdROI.roiHeight; j++) + { + memcpy(dstPtrRow, srcPtrRow, roi->xyzwhdROI.roiWidth * sizeof(T)); + srcPtrRow += srcGenericDescPtr->strides[3]; + dstPtrRow += dstGenericDescPtr->strides[3]; + } + srcPtrDepth += srcGenericDescPtr->strides[2]; + dstPtrDepth += dstGenericDescPtr->strides[2]; + } + srcPtrChannel += srcGenericDescPtr->strides[1]; + dstPtrChannel += dstGenericDescPtr->strides[1]; + } + } +} @@ -3414,6 +3468,17 @@ inline void compute_gaussian_noise_16_host(__m256 *p, __m256i *pxXorwowStateX, _ p[1] = _mm256_fmadd_ps(pSqrt[1], pRngVals[1], p[1]); // return RPPPIXELCHECKF32(pixSqrt * rngVal + pixVal); } +inline void compute_gaussian_noise_voxel_16_host(__m256 *p, __m256i *pxXorwowStateX, __m256i *pxXorwowStateCounter, __m256 *pGaussianNoiseParams) +{ + __m256 pRngVals[2], pSqrt[2]; + + rpp_host_rng_16_gaussian_f32_avx(pRngVals, pxXorwowStateX, pxXorwowStateCounter); // rngVal = rpp_host_rng_1_gaussian_f32(xorwowStatePtr); + pRngVals[0] = _mm256_fmadd_ps(pRngVals[0], pGaussianNoiseParams[1], pGaussianNoiseParams[0]); // rngVal = rngVal * stdDev + mean; + pRngVals[1] = _mm256_fmadd_ps(pRngVals[1], pGaussianNoiseParams[1], pGaussianNoiseParams[0]); // rngVal = rngVal * stdDev + mean; + p[0] = _mm256_add_ps(p[0], pRngVals[0]); // return pixVal + rngVal; + p[1] = _mm256_add_ps(p[1], pRngVals[1]); // return pixVal + rngVal; +} + inline void compute_gaussian_noise_8_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) { __m128 pRngVals[2], pSqrt[2]; @@ -3427,12 +3492,29 @@ inline void compute_gaussian_noise_8_host(__m128 *p, __m128i *pxXorwowStateX, __ p[1] = _mm_fmadd_ps(pSqrt[1], pRngVals[1], p[1]); // return RPPPIXELCHECKF32(pixSqrt * rngVal + pixVal); } +inline void compute_gaussian_noise_voxel_8_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) +{ + __m128 pRngVals[2], pSqrt[2]; + + rpp_host_rng_8_gaussian_f32_sse(pRngVals, pxXorwowStateX, pxXorwowStateCounter); // rngVal = rpp_host_rng_1_gaussian_f32(xorwowStatePtr); + pRngVals[0] = _mm_fmadd_ps(pRngVals[0], pGaussianNoiseParams[1], pGaussianNoiseParams[0]); // rngVal = rngVal * stdDev + mean; + pRngVals[1] = _mm_fmadd_ps(pRngVals[1], pGaussianNoiseParams[1], pGaussianNoiseParams[0]); // rngVal = rngVal * stdDev + mean; + p[0] = _mm_add_ps(p[0], pRngVals[0]); // return (pixVal + rngVal); + p[1] = _mm_add_ps(p[1], pRngVals[1]); // return (pixVal + rngVal); +} + inline void compute_gaussian_noise_16_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) { compute_gaussian_noise_8_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); compute_gaussian_noise_8_host(&p[2], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); } +inline void compute_gaussian_noise_voxel_16_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) +{ + compute_gaussian_noise_voxel_8_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + compute_gaussian_noise_voxel_8_host(&p[2], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); +} + inline void compute_gaussian_noise_48_host(__m256 *p, __m256i *pxXorwowStateX, __m256i *pxXorwowStateCounter, __m256 *pGaussianNoiseParams) { compute_gaussian_noise_16_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); @@ -3440,6 +3522,13 @@ inline void compute_gaussian_noise_48_host(__m256 *p, __m256i *pxXorwowStateX, _ compute_gaussian_noise_16_host(&p[4], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); } +inline void compute_gaussian_noise_voxel_48_host(__m256 *p, __m256i *pxXorwowStateX, __m256i *pxXorwowStateCounter, __m256 *pGaussianNoiseParams) +{ + compute_gaussian_noise_voxel_16_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + compute_gaussian_noise_voxel_16_host(&p[2], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + compute_gaussian_noise_voxel_16_host(&p[4], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); +} + inline void compute_gaussian_noise_48_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) { compute_gaussian_noise_16_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); @@ -3447,6 +3536,13 @@ inline void compute_gaussian_noise_48_host(__m128 *p, __m128i *pxXorwowStateX, _ compute_gaussian_noise_16_host(&p[8], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); } +inline void compute_gaussian_noise_voxel_48_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) +{ + compute_gaussian_noise_voxel_16_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + compute_gaussian_noise_voxel_16_host(&p[4], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + compute_gaussian_noise_voxel_16_host(&p[8], pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); +} + inline void compute_gaussian_noise_24_host(__m256 *p, __m256i *pxXorwowStateX, __m256i *pxXorwowStateCounter, __m256 *pGaussianNoiseParams) { compute_gaussian_noise_16_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); @@ -3458,6 +3554,16 @@ inline void compute_gaussian_noise_24_host(__m256 *p, __m256i *pxXorwowStateX, _ p[2] = _mm256_fmadd_ps(pSqrt, pRngVals[0], p[2]); // return RPPPIXELCHECKF32(pixSqrt * rngVal + pixVal); } +inline void compute_gaussian_noise_voxel_24_host(__m256 *p, __m256i *pxXorwowStateX, __m256i *pxXorwowStateCounter, __m256 *pGaussianNoiseParams) +{ + compute_gaussian_noise_16_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + + __m256 pRngVals[2]; + rpp_host_rng_16_gaussian_f32_avx(pRngVals, pxXorwowStateX, pxXorwowStateCounter); // rngVal = rpp_host_rng_1_gaussian_f32(xorwowStatePtr); + pRngVals[0] = _mm256_fmadd_ps(pRngVals[0], pGaussianNoiseParams[1], pGaussianNoiseParams[0]); // rngVal = rngVal * stdDev + mean; + p[2] = _mm256_add_ps(p[2], pRngVals[0]); // return pixVal + rngVal; +} + inline void compute_gaussian_noise_12_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) { compute_gaussian_noise_8_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); @@ -3469,6 +3575,16 @@ inline void compute_gaussian_noise_12_host(__m128 *p, __m128i *pxXorwowStateX, _ p[2] = _mm_fmadd_ps(pSqrt, pRngVals[0], p[2]); // return RPPPIXELCHECKF32(pixSqrt * rngVal + pixVal); } +inline void compute_gaussian_noise_voxel_12_host(__m128 *p, __m128i *pxXorwowStateX, __m128i *pxXorwowStateCounter, __m128 *pGaussianNoiseParams) +{ + compute_gaussian_noise_8_host(p, pxXorwowStateX, pxXorwowStateCounter, pGaussianNoiseParams); + + __m128 pRngVals[2], pSqrt; + rpp_host_rng_8_gaussian_f32_sse(pRngVals, pxXorwowStateX, pxXorwowStateCounter); // rngVal = rpp_host_rng_1_gaussian_f32(xorwowStatePtr); + pRngVals[0] = _mm_fmadd_ps(pRngVals[0], pGaussianNoiseParams[1], pGaussianNoiseParams[0]); // rngVal = rngVal * stdDev + mean; + p[2] = _mm_add_ps(p[2], pRngVals[0]); // return pixVal + rngVal; +} + inline Rpp32f compute_gaussian_noise_1_host(Rpp32f pixVal, RpptXorwowStateBoxMuller *xorwowStatePtr, Rpp32f mean, Rpp32f stdDev) { Rpp32f rngVal, pixSqrt; @@ -3479,6 +3595,14 @@ inline Rpp32f compute_gaussian_noise_1_host(Rpp32f pixVal, RpptXorwowStateBoxMul return RPPPIXELCHECKF32(pixSqrt * rngVal + pixVal); } +inline Rpp32f compute_gaussian_noise_voxel_1_host(Rpp32f pixVal, RpptXorwowStateBoxMuller *xorwowStatePtr, Rpp32f mean, Rpp32f stdDev) +{ + Rpp32f rngVal, pixSqrt; + rngVal = rpp_host_rng_1_gaussian_f32(xorwowStatePtr); + rngVal = rngVal * stdDev + mean; + return pixVal + rngVal; +} + inline void compute_offset_i8_1c_avx(__m256 &p) { p = _mm256_add_ps(p, avx_p128); diff --git a/src/include/hip/rpp_hip_common.hpp b/src/include/hip/rpp_hip_common.hpp index 6e014287a..169ba8bd5 100644 --- a/src/include/hip/rpp_hip_common.hpp +++ b/src/include/hip/rpp_hip_common.hpp @@ -2541,6 +2541,64 @@ __device__ __forceinline__ void rpp_hip_interpolate24_nearest_neighbor_pkd3(T *s rpp_hip_interpolate3_nearest_neighbor_pkd3(srcPtr, srcStrideH, locPtrSrc_f16->f1[7], locPtrSrc_f16->f1[15], roiPtrSrc_i4, &(dst_f24->f3[7])); } +// copy ROI region from input to output for NCDHW layout tensors + +template +__global__ void copy_ncdhw_hip_tensor(T *srcPtr, + uint3 srcStridesCDH, + T *dstPtr, + uint3 dstStridesCDH, + int channels, + RpptROI3DPtr roiGenericSrc) +{ + int id_x = (hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x) * 8; // W - inner most dim vectorized + int id_y = hipBlockIdx_y * hipBlockDim_y + hipThreadIdx_y; // H - second to inner + int id_z = hipBlockIdx_z * hipBlockDim_z + hipThreadIdx_z; // D - outer most dim + + if ((id_z >= roiGenericSrc->xyzwhdROI.roiDepth) || (id_y >= roiGenericSrc->xyzwhdROI.roiHeight) || (id_x >= roiGenericSrc->xyzwhdROI.roiWidth)) + { + return; + } + + uint srcIdx = ((id_z + roiGenericSrc->xyzwhdROI.xyz.z) * srcStridesCDH.y) + ((id_y + roiGenericSrc->xyzwhdROI.xyz.y) * srcStridesCDH.z) + (id_x + roiGenericSrc->xyzwhdROI.xyz.x); + uint dstIdx = (id_z * dstStridesCDH.y) + (id_y * dstStridesCDH.z) + id_x; + + d_float8 val_f8; + for(int c = 0; c < channels; c++) + { + rpp_hip_load8_and_unpack_to_float8(srcPtr + srcIdx, &val_f8); + rpp_hip_pack_float8_and_store8(dstPtr + dstIdx, &val_f8); + srcIdx += srcStridesCDH.x; + dstIdx += dstStridesCDH.x; + } +} + +// copy ROI region from input to output for NDHWC layout tensors + +template +__global__ void copy_ndhwc_hip_tensor(T *srcPtr, + uint2 srcStridesDH, + T *dstPtr, + uint2 dstStridesDH, + RpptROI3DPtr roiGenericSrc) +{ + int id_x = (hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x) * 8; // WC - inner most dim vectorized + int id_y = hipBlockIdx_y * hipBlockDim_y + hipThreadIdx_y; // H - second to inner + int id_z = hipBlockIdx_z * hipBlockDim_z + hipThreadIdx_z; // D - outer most dim + + if ((id_z >= roiGenericSrc->xyzwhdROI.roiDepth) || (id_y >= roiGenericSrc->xyzwhdROI.roiHeight) || (id_x >= roiGenericSrc->xyzwhdROI.roiWidth)) + { + return; + } + + uint srcIdx = ((id_z + roiGenericSrc->xyzwhdROI.xyz.z) * srcStridesDH.x) + ((id_y + roiGenericSrc->xyzwhdROI.xyz.y) * srcStridesDH.y) + (id_x + roiGenericSrc->xyzwhdROI.xyz.x) * 3; + uint dstIdx = (id_z * dstStridesDH.x) + (id_y * dstStridesDH.y) + id_x * 3; + + d_float24 val_f24; + rpp_hip_load24_pkd3_and_unpack_to_float24_pln3(srcPtr + srcIdx, &val_f24); + rpp_hip_pack_float24_pln3_and_store24_pkd3(dstPtr + dstIdx, &val_f24); +} + // PKD3->PLN3 layout toggle kernel template diff --git a/src/modules/cpu/kernel/noise_gaussian.hpp b/src/modules/cpu/kernel/noise_gaussian.hpp index 67e4b0934..bda8754cb 100644 --- a/src/modules/cpu/kernel/noise_gaussian.hpp +++ b/src/modules/cpu/kernel/noise_gaussian.hpp @@ -1392,3 +1392,499 @@ RppStatus gaussian_noise_i8_i8_host_tensor(Rpp8s *srcPtr, return RPP_SUCCESS; } + +RppStatus gaussian_noise_voxel_u8_u8_host_tensor(Rpp8u *srcPtr, + RpptGenericDescPtr srcGenericDescPtr, + Rpp8u *dstPtr, + RpptGenericDescPtr dstGenericDescPtr, + Rpp32f *meanTensor, + Rpp32f *stdDevTensor, + RpptXorwowStateBoxMuller *xorwowInitialStatePtr, + RpptROI3DPtr roiGenericPtrSrc, + RpptRoi3DType roiType, + RppLayoutParams layoutParams, + rpp::Handle& handle) +{ + RpptROI3D roiDefault; + if(srcGenericDescPtr->layout==RpptLayout::NCDHW) + roiDefault = {0, 0, 0, (Rpp32s)srcGenericDescPtr->dims[4], (Rpp32s)srcGenericDescPtr->dims[3], (Rpp32s)srcGenericDescPtr->dims[2]}; + else if(srcGenericDescPtr->layout==RpptLayout::NDHWC) + roiDefault = {0, 0, 0, (Rpp32s)srcGenericDescPtr->dims[3], (Rpp32s)srcGenericDescPtr->dims[2], (Rpp32s)srcGenericDescPtr->dims[1]}; + Rpp32u numThreads = handle.GetNumThreads(); + Rpp32u batchSize = dstGenericDescPtr->dims[0]; + + omp_set_dynamic(0); +#pragma omp parallel for num_threads(numThreads) + for(int batchCount = 0; batchCount < batchSize; batchCount++) + { + RpptROI3D roi; + RpptROI3DPtr roiPtrInput = &roiGenericPtrSrc[batchCount]; + compute_roi3D_validation_host(roiPtrInput, &roi, &roiDefault, roiType); + + Rpp8u *srcPtrImage, *dstPtrImage; + srcPtrImage = srcPtr + batchCount * srcGenericDescPtr->strides[0]; + dstPtrImage = dstPtr + batchCount * dstGenericDescPtr->strides[0]; + + Rpp32f mean = meanTensor[batchCount]; + Rpp32f stdDev = stdDevTensor[batchCount]; + Rpp32u offset = batchCount * srcGenericDescPtr->strides[0]; + Rpp32u bufferLength = roi.xyzwhdROI.roiWidth * layoutParams.bufferMultiplier; + bool copyInput = (!mean) && (!stdDev); + if (copyInput) + { + copy_3d_host_tensor(srcPtrImage, srcGenericDescPtr, dstPtrImage, dstGenericDescPtr, &roi, layoutParams); + } + else + { + Rpp8u *srcPtrChannel, *dstPtrChannel; + dstPtrChannel = dstPtrImage; + + Rpp32u alignedLength = (bufferLength / 48) * 48; + Rpp32u vectorIncrement = 48; + Rpp32u vectorIncrementPerChannel = 16; + RpptXorwowStateBoxMuller xorwowState; +#if __AVX2__ + __m256i pxXorwowStateX[5], pxXorwowStateCounter; + rpp_host_rng_xorwow_state_offsetted_avx(xorwowInitialStatePtr, xorwowState, offset, pxXorwowStateX, &pxXorwowStateCounter); + __m256 pGaussianNoiseParams[2]; + pGaussianNoiseParams[0] = _mm256_set1_ps(mean); + pGaussianNoiseParams[1] = _mm256_set1_ps(stdDev); +#else + __m128i pxXorwowStateX[5], pxXorwowStateCounter; + rpp_host_rng_xorwow_state_offsetted_sse(xorwowInitialStatePtr, xorwowState, offset, pxXorwowStateX, &pxXorwowStateCounter); + __m128 pGaussianNoiseParams[2]; + pGaussianNoiseParams[0] = _mm_set1_ps(mean); + pGaussianNoiseParams[1] = _mm_set1_ps(stdDev); +#endif + // Gaussian Noise without fused output-layout toggle (NDHWC -> NDHWC) + if((srcGenericDescPtr->dims[4] == 3) && (srcGenericDescPtr->layout == RpptLayout::NDHWC) && (dstGenericDescPtr->layout == RpptLayout::NDHWC)) + { + srcPtrChannel = srcPtrImage + (roi.xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi.xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi.xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + Rpp8u *srcPtrDepth, *dstPtrDepth; + srcPtrDepth = srcPtrChannel; + dstPtrDepth = dstPtrChannel; + for(int i = 0; i < roi.xyzwhdROI.roiDepth; i++) + { + Rpp8u *srcPtrRow, *dstPtrRow; + srcPtrRow = srcPtrDepth; + dstPtrRow = dstPtrDepth; + for(int j = 0; j < roi.xyzwhdROI.roiHeight; j++) + { + Rpp8u *srcPtrTemp, *dstPtrTemp; + srcPtrTemp = srcPtrRow; + dstPtrTemp = dstPtrRow; + + int vectorLoopCount = 0; + for (; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrement) + { +#if __AVX2__ + __m256 p[6]; + rpp_simd_load(rpp_load48_u8pkd3_to_f32pln3_avx, srcPtrTemp, p); // simd loads + rpp_multiply48_constant(p, avx_p1op255); // u8 normalization to range[0,1] + compute_gaussian_noise_voxel_48_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_multiply48_constant(p, avx_p255); // u8 un-normalization + rpp_simd_store(rpp_store48_f32pln3_to_u8pkd3_avx, dstPtrTemp, p); // simd stores +#else + __m128 p[12]; + rpp_simd_load(rpp_load48_u8pkd3_to_f32pln3, srcPtrTemp, p); // simd loads + rpp_multiply48_constant(p, xmm_p1op255); // u8 normalization to range[0,1] + compute_gaussian_noise_voxel_48_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_multiply48_constant(p, xmm_p255); // u8 un-normalization + rpp_simd_store(rpp_store48_f32pln3_to_u8pkd3, dstPtrTemp, p); // simd stores +#endif + srcPtrTemp += vectorIncrement; + dstPtrTemp += vectorIncrement; + } + for (; vectorLoopCount < bufferLength; vectorLoopCount += 3) + { + dstPtrTemp[0] = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)srcPtrTemp[0] * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + dstPtrTemp[1] = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)srcPtrTemp[1] * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + dstPtrTemp[2] = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)srcPtrTemp[2] * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + srcPtrTemp += 3; + dstPtrTemp += 3; + } + srcPtrRow += srcGenericDescPtr->strides[2]; + dstPtrRow += dstGenericDescPtr->strides[2]; + } + srcPtrDepth += srcGenericDescPtr->strides[1]; + dstPtrDepth += dstGenericDescPtr->strides[1]; + } + } + + // Gaussian Noise without fused output-layout toggle (NCDHW -> NCDHW) + else if ((srcGenericDescPtr->dims[1] == 3) && (srcGenericDescPtr->layout == RpptLayout::NCDHW) && (dstGenericDescPtr->layout == RpptLayout::NCDHW)) + { + srcPtrChannel = srcPtrImage + (roi.xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi.xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi.xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + Rpp8u *srcPtrDepthR, *srcPtrDepthG, *srcPtrDepthB, *dstPtrDepthR, *dstPtrDepthG, *dstPtrDepthB; + srcPtrDepthR = srcPtrChannel; + srcPtrDepthG = srcPtrDepthR + srcGenericDescPtr->strides[1]; + srcPtrDepthB = srcPtrDepthG + srcGenericDescPtr->strides[1]; + dstPtrDepthR = dstPtrChannel; + dstPtrDepthG = dstPtrDepthR + dstGenericDescPtr->strides[1]; + dstPtrDepthB = dstPtrDepthG + dstGenericDescPtr->strides[1]; + for(int i = 0; i < roi.xyzwhdROI.roiDepth; i++) + { + Rpp8u *srcPtrRowR, *srcPtrRowG, *srcPtrRowB, *dstPtrRowR, *dstPtrRowG, *dstPtrRowB; + srcPtrRowR = srcPtrDepthR; + srcPtrRowG = srcPtrDepthG; + srcPtrRowB = srcPtrDepthB; + dstPtrRowR = dstPtrDepthR; + dstPtrRowG = dstPtrDepthG; + dstPtrRowB = dstPtrDepthB; + for(int j = 0; j < roi.xyzwhdROI.roiHeight; j++) + { + Rpp8u *srcPtrTempR, *srcPtrTempG, *srcPtrTempB, *dstPtrTempR, *dstPtrTempG, *dstPtrTempB; + srcPtrTempR = srcPtrRowR; + srcPtrTempG = srcPtrRowG; + srcPtrTempB = srcPtrRowB; + dstPtrTempR = dstPtrRowR; + dstPtrTempG = dstPtrRowG; + dstPtrTempB = dstPtrRowB; + int vectorLoopCount = 0; + for (; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrementPerChannel) + { +#if __AVX2__ + __m256 p[6]; + rpp_simd_load(rpp_load48_u8pln3_to_f32pln3_avx, srcPtrTempR, srcPtrTempG, srcPtrTempB, p); // simd loads + rpp_multiply48_constant(p, avx_p1op255); // u8 normalization to range[0,1] + compute_gaussian_noise_voxel_48_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_multiply48_constant(p, avx_p255); // u8 un-normalization + rpp_simd_store(rpp_store48_f32pln3_to_u8pln3_avx, dstPtrTempR, dstPtrTempG, dstPtrTempB, p); // simd stores +#else + __m128 p[12]; + rpp_simd_load(rpp_load48_u8pln3_to_f32pln3, srcPtrTempR, srcPtrTempG, srcPtrTempB, p); // simd loads + rpp_multiply48_constant(p, xmm_p1op255); // u8 normalization to range[0,1] + compute_gaussian_noise_voxel_48_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_multiply48_constant(p, xmm_p255); // u8 un-normalization + rpp_simd_store(rpp_store48_f32pln3_to_u8pln3, dstPtrTempR, dstPtrTempG, dstPtrTempB, p); // simd stores +#endif + srcPtrTempR += vectorIncrementPerChannel; + srcPtrTempG += vectorIncrementPerChannel; + srcPtrTempB += vectorIncrementPerChannel; + dstPtrTempR += vectorIncrementPerChannel; + dstPtrTempG += vectorIncrementPerChannel; + dstPtrTempB += vectorIncrementPerChannel; + } + for (; vectorLoopCount < bufferLength; vectorLoopCount++) + { + *dstPtrTempR++ = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)*srcPtrTempR++ * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + *dstPtrTempG++ = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)*srcPtrTempG++ * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + *dstPtrTempB++ = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)*srcPtrTempB++ * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + } + srcPtrRowR += srcGenericDescPtr->strides[3]; + srcPtrRowG += srcGenericDescPtr->strides[3]; + srcPtrRowB += srcGenericDescPtr->strides[3]; + dstPtrRowR += srcGenericDescPtr->strides[3]; + dstPtrRowG += srcGenericDescPtr->strides[3]; + dstPtrRowB += srcGenericDescPtr->strides[3]; + } + srcPtrDepthR += srcGenericDescPtr->strides[2]; + srcPtrDepthG += srcGenericDescPtr->strides[2]; + srcPtrDepthB += srcGenericDescPtr->strides[2]; + dstPtrDepthR += srcGenericDescPtr->strides[2]; + dstPtrDepthG += srcGenericDescPtr->strides[2]; + dstPtrDepthB += srcGenericDescPtr->strides[2]; + } + } + + // Gaussian Noise without fused output-layout toggle single channel (NCDHW -> NCDHW) + else if ((srcGenericDescPtr->dims[1] == 1) && (srcGenericDescPtr->layout == RpptLayout::NCDHW) && (dstGenericDescPtr->layout == RpptLayout::NCDHW)) + { + srcPtrChannel = srcPtrImage + (roi.xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi.xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi.xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + alignedLength = bufferLength & ~15; + Rpp8u *srcPtrDepth, *dstPtrDepth; + srcPtrDepth = srcPtrChannel; + dstPtrDepth = dstPtrChannel; + for(int i = 0; i < roi.xyzwhdROI.roiDepth; i++) + { + Rpp8u *srcPtrRow, *dstPtrRow; + srcPtrRow = srcPtrDepth; + dstPtrRow = dstPtrDepth; + for(int j = 0; j < roi.xyzwhdROI.roiHeight; j++) + { + Rpp8u *srcPtrTemp, *dstPtrTemp; + srcPtrTemp = srcPtrRow; + dstPtrTemp = dstPtrRow; + int vectorLoopCount = 0; + for (; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrementPerChannel) + { +#if __AVX2__ + __m256 p[2]; + rpp_simd_load(rpp_load16_u8_to_f32_avx, srcPtrTemp, p); // simd loads + rpp_multiply16_constant(p, avx_p1op255); // u8 normalization to range[0,1] + compute_gaussian_noise_voxel_16_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_multiply16_constant(p, avx_p255); // u8 un-normalization + rpp_simd_store(rpp_store16_f32_to_u8_avx, dstPtrTemp, p); // simd stores +#else + __m128 p[4]; + rpp_simd_load(rpp_load16_u8_to_f32, srcPtrTemp, p); // simd loads + rpp_multiply16_constant(p, xmm_p1op255); // u8 normalization to range[0,1] + compute_gaussian_noise_voxel_16_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_multiply16_constant(p, xmm_p255); // u8 un-normalization + rpp_simd_store(rpp_store16_f32_to_u8, dstPtrTemp, p); // simd stores +#endif + srcPtrTemp += vectorIncrementPerChannel; + dstPtrTemp += vectorIncrementPerChannel; + } + for (; vectorLoopCount < bufferLength; vectorLoopCount++) + { + *dstPtrTemp++ = (Rpp8u)(compute_gaussian_noise_voxel_1_host((Rpp32f)*srcPtrTemp++ * ONE_OVER_255, &xorwowState, mean, stdDev) * 255.0f); + } + srcPtrRow += srcGenericDescPtr->strides[3]; + dstPtrRow += dstGenericDescPtr->strides[3]; + } + srcPtrDepth += srcGenericDescPtr->strides[2]; + dstPtrDepth += dstGenericDescPtr->strides[2]; + } + } + } + } + + return RPP_SUCCESS; +} + +RppStatus gaussian_noise_voxel_f32_f32_host_tensor(Rpp32f *srcPtr, + RpptGenericDescPtr srcGenericDescPtr, + Rpp32f *dstPtr, + RpptGenericDescPtr dstGenericDescPtr, + Rpp32f *meanTensor, + Rpp32f *stdDevTensor, + RpptXorwowStateBoxMuller *xorwowInitialStatePtr, + RpptROI3DPtr roiGenericPtrSrc, + RpptRoi3DType roiType, + RppLayoutParams layoutParams, + rpp::Handle& handle) +{ + RpptROI3D roiDefault; + if(srcGenericDescPtr->layout==RpptLayout::NCDHW) + roiDefault = {0, 0, 0, (Rpp32s)srcGenericDescPtr->dims[4], (Rpp32s)srcGenericDescPtr->dims[3], (Rpp32s)srcGenericDescPtr->dims[2]}; + else if(srcGenericDescPtr->layout==RpptLayout::NDHWC) + roiDefault = {0, 0, 0, (Rpp32s)srcGenericDescPtr->dims[3], (Rpp32s)srcGenericDescPtr->dims[2], (Rpp32s)srcGenericDescPtr->dims[1]}; + Rpp32u numThreads = handle.GetNumThreads(); + Rpp32u batchSize = dstGenericDescPtr->dims[0]; + + omp_set_dynamic(0); +#pragma omp parallel for num_threads(numThreads) + for(int batchCount = 0; batchCount < batchSize; batchCount++) + { + RpptROI3D roi; + RpptROI3DPtr roiPtrInput = &roiGenericPtrSrc[batchCount]; + compute_roi3D_validation_host(roiPtrInput, &roi, &roiDefault, roiType); + + Rpp32f *srcPtrImage, *dstPtrImage; + srcPtrImage = srcPtr + batchCount * srcGenericDescPtr->strides[0]; + dstPtrImage = dstPtr + batchCount * dstGenericDescPtr->strides[0]; + + Rpp32f mean = meanTensor[batchCount]; + Rpp32f stdDev = stdDevTensor[batchCount]; + Rpp32u offset = batchCount * srcGenericDescPtr->strides[0]; + Rpp32u bufferLength = roi.xyzwhdROI.roiWidth * layoutParams.bufferMultiplier; + bool copyInput = (!mean) && (!stdDev); + if (copyInput) + { + copy_3d_host_tensor(srcPtrImage, srcGenericDescPtr, dstPtrImage, dstGenericDescPtr, &roi, layoutParams); + } + else + { + Rpp32f *srcPtrChannel, *dstPtrChannel; + dstPtrChannel = dstPtrImage; + RpptXorwowStateBoxMuller xorwowState; +#if __AVX2__ + Rpp32u alignedLength = (bufferLength / 24) * 24; + Rpp32u vectorIncrement = 24; + Rpp32u vectorIncrementPerChannel = 8; + __m256i pxXorwowStateX[5], pxXorwowStateCounter; + rpp_host_rng_xorwow_state_offsetted_avx(xorwowInitialStatePtr, xorwowState, offset, pxXorwowStateX, &pxXorwowStateCounter); + + __m256 pGaussianNoiseParams[2]; + pGaussianNoiseParams[0] = _mm256_set1_ps(mean); + pGaussianNoiseParams[1] = _mm256_set1_ps(stdDev); +#else + Rpp32u alignedLength = (bufferLength / 12) * 12; + Rpp32u vectorIncrement = 12; + Rpp32u vectorIncrementPerChannel = 4; + __m128i pxXorwowStateX[5], pxXorwowStateCounter; + rpp_host_rng_xorwow_state_offsetted_sse(xorwowInitialStatePtr, xorwowState, offset, pxXorwowStateX, &pxXorwowStateCounter); + + __m128 pGaussianNoiseParams[2]; + pGaussianNoiseParams[0] = _mm_set1_ps(mean); + pGaussianNoiseParams[1] = _mm_set1_ps(stdDev); +#endif + // Gaussian Noise without fused output-layout toggle (NDHWC -> NDHWC) + if((srcGenericDescPtr->dims[4] == 3) && (srcGenericDescPtr->layout == RpptLayout::NDHWC) && (dstGenericDescPtr->layout == RpptLayout::NDHWC)) + { + srcPtrChannel = srcPtrImage + (roi.xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi.xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi.xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + Rpp32f *srcPtrDepth, *dstPtrDepth; + srcPtrDepth = srcPtrChannel; + dstPtrDepth = dstPtrChannel; + for(int i = 0; i < roi.xyzwhdROI.roiDepth; i++) + { + Rpp32f *srcPtrRow, *dstPtrRow; + srcPtrRow = srcPtrDepth; + dstPtrRow = dstPtrDepth; + for(int j = 0; j < roi.xyzwhdROI.roiHeight; j++) + { + Rpp32f *srcPtrTemp, *dstPtrTemp; + srcPtrTemp = srcPtrRow; + dstPtrTemp = dstPtrRow; + int vectorLoopCount = 0; + for (; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrement) + { +#if __AVX2__ + __m256 p[3]; + rpp_simd_load(rpp_load24_f32pkd3_to_f32pln3_avx, srcPtrTemp, p); // simd loads + compute_gaussian_noise_voxel_24_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_simd_store(rpp_store24_f32pln3_to_f32pkd3_avx, dstPtrTemp, p); // simd stores +#else + __m128 p[4]; + rpp_simd_load(rpp_load12_f32pkd3_to_f32pln3, srcPtrTemp, p); // simd loads + compute_gaussian_noise_voxel_12_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_simd_store(rpp_store12_f32pln3_to_f32pkd3, dstPtrTemp, p); // simd stores +#endif + srcPtrTemp += vectorIncrement; + dstPtrTemp += vectorIncrement; + } + for (; vectorLoopCount < bufferLength; vectorLoopCount += 3) + { + dstPtrTemp[0] = compute_gaussian_noise_voxel_1_host(srcPtrTemp[0], &xorwowState, mean, stdDev); + dstPtrTemp[1] = compute_gaussian_noise_voxel_1_host(srcPtrTemp[1], &xorwowState, mean, stdDev); + dstPtrTemp[2] = compute_gaussian_noise_voxel_1_host(srcPtrTemp[2], &xorwowState, mean, stdDev); + srcPtrTemp += 3; + dstPtrTemp += 3; + } + srcPtrRow += srcGenericDescPtr->strides[2]; + dstPtrRow += dstGenericDescPtr->strides[2]; + } + srcPtrDepth += srcGenericDescPtr->strides[1]; + dstPtrDepth += dstGenericDescPtr->strides[1]; + } + } + + // Gaussian Noise without fused output-layout toggle (NCDHW -> NCDHW) + else if ((srcGenericDescPtr->dims[1] == 3) && (srcGenericDescPtr->layout == RpptLayout::NCDHW) && (dstGenericDescPtr->layout == RpptLayout::NCDHW)) + { + srcPtrChannel = srcPtrImage + (roi.xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi.xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi.xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); + Rpp32f *srcPtrDepthR, *srcPtrDepthG, *srcPtrDepthB, *dstPtrDepthR, *dstPtrDepthG, *dstPtrDepthB; + srcPtrDepthR = srcPtrChannel; + srcPtrDepthG = srcPtrDepthR + srcGenericDescPtr->strides[1]; + srcPtrDepthB = srcPtrDepthG + srcGenericDescPtr->strides[1]; + dstPtrDepthR = dstPtrChannel; + dstPtrDepthG = dstPtrDepthR + dstGenericDescPtr->strides[1]; + dstPtrDepthB = dstPtrDepthG + dstGenericDescPtr->strides[1]; + for(int i = 0; i < roi.xyzwhdROI.roiDepth; i++) + { + Rpp32f *srcPtrRowR, *srcPtrRowG, *srcPtrRowB, *dstPtrRowR, *dstPtrRowG, *dstPtrRowB; + srcPtrRowR = srcPtrDepthR; + srcPtrRowG = srcPtrDepthG; + srcPtrRowB = srcPtrDepthB; + dstPtrRowR = dstPtrDepthR; + dstPtrRowG = dstPtrDepthG; + dstPtrRowB = dstPtrDepthB; + for(int j = 0; j < roi.xyzwhdROI.roiHeight; j++) + { + Rpp32f *srcPtrTempR, *srcPtrTempG, *srcPtrTempB, *dstPtrTempR, *dstPtrTempG, *dstPtrTempB; + srcPtrTempR = srcPtrRowR; + srcPtrTempG = srcPtrRowG; + srcPtrTempB = srcPtrRowB; + dstPtrTempR = dstPtrRowR; + dstPtrTempG = dstPtrRowG; + dstPtrTempB = dstPtrRowB; + int vectorLoopCount = 0; + for (; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrementPerChannel) + { +#if __AVX2__ + __m256 p[3]; + rpp_simd_load(rpp_load24_f32pln3_to_f32pln3_avx, srcPtrTempR, srcPtrTempG, srcPtrTempB, p); // simd loads + compute_gaussian_noise_voxel_24_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_simd_store(rpp_store24_f32pln3_to_f32pln3_avx, dstPtrTempR, dstPtrTempG, dstPtrTempB, p); // simd stores +#else + __m128 p[4]; + rpp_simd_load(rpp_load12_f32pln3_to_f32pln3, srcPtrTempR, srcPtrTempG, srcPtrTempB, p); // simd loads + compute_gaussian_noise_voxel_12_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_simd_store(rpp_store12_f32pln3_to_f32pln3, dstPtrTempR, dstPtrTempG, dstPtrTempB, p); // simd stores +#endif + srcPtrTempR += vectorIncrementPerChannel; + srcPtrTempG += vectorIncrementPerChannel; + srcPtrTempB += vectorIncrementPerChannel; + dstPtrTempR += vectorIncrementPerChannel; + dstPtrTempG += vectorIncrementPerChannel; + dstPtrTempB += vectorIncrementPerChannel; + } + for (; vectorLoopCount < bufferLength; vectorLoopCount++) + { + *dstPtrTempR++ = compute_gaussian_noise_voxel_1_host(*srcPtrTempR++, &xorwowState, mean, stdDev); + *dstPtrTempG++ = compute_gaussian_noise_voxel_1_host(*srcPtrTempG++, &xorwowState, mean, stdDev); + *dstPtrTempB++ = compute_gaussian_noise_voxel_1_host(*srcPtrTempB++, &xorwowState, mean, stdDev); + } + srcPtrRowR += srcGenericDescPtr->strides[3]; + srcPtrRowG += srcGenericDescPtr->strides[3]; + srcPtrRowB += srcGenericDescPtr->strides[3]; + dstPtrRowR += srcGenericDescPtr->strides[3]; + dstPtrRowG += srcGenericDescPtr->strides[3]; + dstPtrRowB += srcGenericDescPtr->strides[3]; + } + srcPtrDepthR += srcGenericDescPtr->strides[2]; + srcPtrDepthG += srcGenericDescPtr->strides[2]; + srcPtrDepthB += srcGenericDescPtr->strides[2]; + dstPtrDepthR += srcGenericDescPtr->strides[2]; + dstPtrDepthG += srcGenericDescPtr->strides[2]; + dstPtrDepthB += srcGenericDescPtr->strides[2]; + } + } + + // Gaussian Noise without fused output-layout toggle single channel (NCDHW -> NCDHW) + else if ((srcGenericDescPtr->dims[1] == 1) && (srcGenericDescPtr->layout == RpptLayout::NCDHW) && (dstGenericDescPtr->layout == RpptLayout::NCDHW)) + { + srcPtrChannel = srcPtrImage + (roi.xyzwhdROI.xyz.z * srcGenericDescPtr->strides[2]) + (roi.xyzwhdROI.xyz.y * srcGenericDescPtr->strides[3]) + (roi.xyzwhdROI.xyz.x * layoutParams.bufferMultiplier); +#if __AVX2__ + alignedLength = bufferLength & ~15; +#else + alignedLength = bufferLength & ~7; +#endif + Rpp32u vectorIncrementPerChannelDouble = 2 * vectorIncrementPerChannel; + Rpp32f *srcPtrDepth, *dstPtrDepth; + srcPtrDepth = srcPtrChannel; + dstPtrDepth = dstPtrChannel; + for(int i = 0; i < roi.xyzwhdROI.roiDepth; i++) + { + Rpp32f *srcPtrRow, *dstPtrRow; + srcPtrRow = srcPtrDepth; + dstPtrRow = dstPtrDepth; + for(int j = 0; j < roi.xyzwhdROI.roiHeight; j++) + { + Rpp32f *srcPtrTemp, *dstPtrTemp; + srcPtrTemp = srcPtrRow; + dstPtrTemp = dstPtrRow; + int vectorLoopCount = 0; + for (; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrementPerChannelDouble) + { +#if __AVX2__ + __m256 p[2]; + rpp_simd_load(rpp_load16_f32_to_f32_avx, srcPtrTemp, p); // simd loads + compute_gaussian_noise_voxel_16_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_simd_store(rpp_store16_f32_to_f32_avx, dstPtrTemp, p); // simd stores +#else + __m128 p[2]; + rpp_simd_load(rpp_load8_f32_to_f32, srcPtrTemp, p); // simd loads + compute_gaussian_noise_voxel_8_host(p, pxXorwowStateX, &pxXorwowStateCounter, pGaussianNoiseParams); // gaussian_noise adjustment + rpp_simd_store(rpp_store8_f32_to_f32, dstPtrTemp, p); // simd stores +#endif + srcPtrTemp += vectorIncrementPerChannelDouble; + dstPtrTemp += vectorIncrementPerChannelDouble; + } + for (; vectorLoopCount < bufferLength; vectorLoopCount++) + { + *dstPtrTemp++ = compute_gaussian_noise_voxel_1_host(*srcPtrTemp++, &xorwowState, mean, stdDev); + } + srcPtrRow += srcGenericDescPtr->strides[3]; + dstPtrRow += dstGenericDescPtr->strides[3]; + } + srcPtrDepth += srcGenericDescPtr->strides[2]; + dstPtrDepth += dstGenericDescPtr->strides[2]; + } + } + } + } + + return RPP_SUCCESS; +} \ No newline at end of file diff --git a/src/modules/hip/kernel/noise_gaussian.hpp b/src/modules/hip/kernel/noise_gaussian.hpp index cdb7965bc..705aae142 100644 --- a/src/modules/hip/kernel/noise_gaussian.hpp +++ b/src/modules/hip/kernel/noise_gaussian.hpp @@ -30,6 +30,26 @@ __device__ void gaussian_noise_24_hip_compute(d_float24 *pix_f24, RpptXorwowStat rpp_hip_pixel_check_0to1(pix_f24); } +__device__ void gaussian_noise_voxel_8_hip_compute(d_float8 *pix_f8, RpptXorwowStateBoxMuller *xorwowState, float mean, float stdDev) +{ + d_float8 rngVals_f8, pixSqrt_f8; + rpp_hip_rng_8_gaussian_f32(&rngVals_f8, xorwowState); + rpp_hip_math_multiply8_const(&rngVals_f8, &rngVals_f8, (float4)stdDev); + rpp_hip_math_add8_const(&rngVals_f8, &rngVals_f8, (float4)mean); + rpp_hip_math_add8(pix_f8, &rngVals_f8, pix_f8); +} + +__device__ void gaussian_noise_voxel_24_hip_compute(d_float24 *pix_f24, RpptXorwowStateBoxMuller *xorwowState, float mean, float stdDev) +{ + d_float24 rngVals_f24, pixSqrt_f24; + rpp_hip_rng_8_gaussian_f32(&rngVals_f24.f8[0], xorwowState); + rpp_hip_rng_8_gaussian_f32(&rngVals_f24.f8[1], xorwowState); + rpp_hip_rng_8_gaussian_f32(&rngVals_f24.f8[2], xorwowState); + rpp_hip_math_multiply24_const(&rngVals_f24, &rngVals_f24, (float4)stdDev); + rpp_hip_math_add24_const(&rngVals_f24, &rngVals_f24, (float4)mean); + rpp_hip_math_add24(pix_f24, &rngVals_f24, pix_f24); +} + __device__ void gaussian_noise_8_adjusted_input_hip_compute(uchar *srcPtr, d_float8 *pix_f8) { rpp_hip_math_multiply8_const(pix_f8, pix_f8, (float4)ONE_OVER_255); } __device__ void gaussian_noise_8_adjusted_input_hip_compute(float *srcPtr, d_float8 *pix_f8) { } __device__ void gaussian_noise_8_adjusted_input_hip_compute(schar *srcPtr, d_float8 *pix_f8) { rpp_hip_math_add8_const(pix_f8, pix_f8, (float4)128.0f); rpp_hip_math_multiply8_const(pix_f8, pix_f8, (float4)ONE_OVER_255); } @@ -253,6 +273,92 @@ __global__ void gaussian_noise_pln3_pkd3_hip_tensor(T *srcPtr, rpp_hip_pack_float24_pln3_and_store24_pkd3(dstPtr + dstIdx, &pix_f24); } +template +__global__ void gaussian_noise_voxel_ncdhw_hip_tensor(T *srcPtr, + uint3 srcStridesCDH, + T *dstPtr, + uint3 dstStridesCDH, + int channels, + float2 gaussianNoise3dParams_f2, + RpptXorwowStateBoxMuller *xorwowInitialStatePtr, + uint *xorwowSeedStream, + RpptROI3DPtr roiGenericSrc) +{ + int id_x = (hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x) * 8; // W - inner most dim vectorized + int id_y = hipBlockIdx_y * hipBlockDim_y + hipThreadIdx_y; // H - second to inner + int id_z = hipBlockIdx_z * hipBlockDim_z + hipThreadIdx_z; // D - outer most dim + + if ((id_z >= roiGenericSrc->xyzwhdROI.roiDepth) || (id_y >= roiGenericSrc->xyzwhdROI.roiHeight) || (id_x >= roiGenericSrc->xyzwhdROI.roiWidth)) + { + return; + } + + uint srcIdx = ((id_z + roiGenericSrc->xyzwhdROI.xyz.z) * srcStridesCDH.y) + ((id_y + roiGenericSrc->xyzwhdROI.xyz.y) * srcStridesCDH.z) + (id_x + roiGenericSrc->xyzwhdROI.xyz.x); + uint dstIdx = (id_z * dstStridesCDH.y) + (id_y * dstStridesCDH.z) + id_x; + uint seedStreamIdx = (id_y * dstStridesCDH.z) + (hipBlockIdx_x * hipBlockDim_x) + hipThreadIdx_x; + + RpptXorwowStateBoxMuller xorwowState; + uint xorwowSeed = xorwowSeedStream[seedStreamIdx % SEED_STREAM_MAX_SIZE]; + xorwowState.x[0] = xorwowInitialStatePtr->x[0] + xorwowSeed; + xorwowState.x[1] = xorwowInitialStatePtr->x[1] + xorwowSeed; + xorwowState.x[2] = xorwowInitialStatePtr->x[2] + xorwowSeed; + xorwowState.x[3] = xorwowInitialStatePtr->x[3] + xorwowSeed; + xorwowState.x[4] = xorwowInitialStatePtr->x[4] + xorwowSeed; + xorwowState.counter = xorwowInitialStatePtr->counter + xorwowSeed; + + d_float8 val_f8; + for(int c = 0; c < channels; c++) + { + rpp_hip_load8_and_unpack_to_float8(srcPtr + srcIdx, &val_f8); + gaussian_noise_8_adjusted_input_hip_compute(srcPtr, &val_f8); + gaussian_noise_voxel_8_hip_compute(&val_f8, &xorwowState, gaussianNoise3dParams_f2.x, gaussianNoise3dParams_f2.y); + gaussian_noise_8_adjusted_output_hip_compute(srcPtr, &val_f8); + rpp_hip_pack_float8_and_store8(dstPtr + dstIdx, &val_f8); + srcIdx += srcStridesCDH.x; + dstIdx += dstStridesCDH.x; + } +} + +template +__global__ void gaussian_noise_voxel_ndhwc_hip_tensor(T *srcPtr, + uint2 srcStridesDH, + T *dstPtr, + uint2 dstStridesDH, + float2 gaussianNoise3dParams_f2, + RpptXorwowStateBoxMuller *xorwowInitialStatePtr, + uint *xorwowSeedStream, + RpptROI3DPtr roiGenericSrc) +{ + int id_x = (hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x) * 8; // WC - inner most dim vectorized + int id_y = hipBlockIdx_y * hipBlockDim_y + hipThreadIdx_y; // H - second to inner + int id_z = hipBlockIdx_z * hipBlockDim_z + hipThreadIdx_z; // D - outer most dim + + if ((id_z >= roiGenericSrc->xyzwhdROI.roiDepth) || (id_y >= roiGenericSrc->xyzwhdROI.roiHeight) || (id_x >= roiGenericSrc->xyzwhdROI.roiWidth)) + { + return; + } + + uint srcIdx = ((id_z + roiGenericSrc->xyzwhdROI.xyz.z) * srcStridesDH.x) + ((id_y + roiGenericSrc->xyzwhdROI.xyz.y) * srcStridesDH.y) + (id_x + roiGenericSrc->xyzwhdROI.xyz.x) * 3; + uint dstIdx = (id_z * dstStridesDH.x) + (id_y * dstStridesDH.y) + id_x * 3; + uint seedStreamIdx = (id_y * dstStridesDH.y) + (hipBlockIdx_x * hipBlockDim_x) + hipThreadIdx_x; + + RpptXorwowStateBoxMuller xorwowState; + uint xorwowSeed = xorwowSeedStream[seedStreamIdx % SEED_STREAM_MAX_SIZE]; + xorwowState.x[0] = xorwowInitialStatePtr->x[0] + xorwowSeed; + xorwowState.x[1] = xorwowInitialStatePtr->x[1] + xorwowSeed; + xorwowState.x[2] = xorwowInitialStatePtr->x[2] + xorwowSeed; + xorwowState.x[3] = xorwowInitialStatePtr->x[3] + xorwowSeed; + xorwowState.x[4] = xorwowInitialStatePtr->x[4] + xorwowSeed; + xorwowState.counter = xorwowInitialStatePtr->counter + xorwowSeed; + + d_float24 val_f24; + rpp_hip_load24_pkd3_and_unpack_to_float24_pln3(srcPtr + srcIdx, &val_f24); + gaussian_noise_24_adjusted_input_hip_compute(srcPtr, &val_f24); + gaussian_noise_voxel_24_hip_compute(&val_f24, &xorwowState, gaussianNoise3dParams_f2.x, gaussianNoise3dParams_f2.y); + gaussian_noise_24_adjusted_output_hip_compute(srcPtr, &val_f24); + rpp_hip_pack_float24_pln3_and_store24_pkd3(dstPtr + dstIdx, &val_f24); +} + template RppStatus hip_exec_gaussian_noise_tensor(T *srcPtr, RpptDescPtr srcDescPtr, @@ -351,3 +457,106 @@ RppStatus hip_exec_gaussian_noise_tensor(T *srcPtr, return RPP_SUCCESS; } + +template +RppStatus hip_exec_gaussian_noise_voxel_tensor(T *srcPtr, + RpptGenericDescPtr srcGenericDescPtr, + T *dstPtr, + RpptGenericDescPtr dstGenericDescPtr, + RpptXorwowStateBoxMuller *xorwowInitialStatePtr, + Rpp32f *meanTensor, + Rpp32f *stdDevTensor, + RpptROI3DPtr roiGenericPtrSrc, + rpp::Handle& handle) +{ + Rpp32u *xorwowSeedStream; + xorwowSeedStream = (Rpp32u *)&xorwowInitialStatePtr[1]; + CHECK_RETURN_STATUS(hipMemcpy(xorwowSeedStream, rngSeedStream4050, SEED_STREAM_MAX_SIZE * sizeof(Rpp32u), hipMemcpyHostToDevice)); + + if (dstGenericDescPtr->layout == RpptLayout::NCDHW) + { + int globalThreads_x = (dstGenericDescPtr->strides[3] + 7) >> 3; // W - width (x direction) - vectorized for 8 element loads/stores per channel + int globalThreads_y = dstGenericDescPtr->dims[3]; // H - height (y direction) + int globalThreads_z = dstGenericDescPtr->dims[2]; // D - depth (z direction) + + for(int batchCount = 0; batchCount < dstGenericDescPtr->dims[0]; batchCount++) + { + bool copyInput = (!meanTensor[batchCount]) && (!stdDevTensor[batchCount]); + // copy ROI from input to output when mean = 0 and stdDev = 0 + if (copyInput) + { + hipLaunchKernelGGL(copy_ncdhw_hip_tensor, + dim3(ceil((float)globalThreads_x/LOCAL_THREADS_X), ceil((float)globalThreads_y/LOCAL_THREADS_Y), ceil((float)globalThreads_z/LOCAL_THREADS_Z)), + dim3(LOCAL_THREADS_X, LOCAL_THREADS_Y, LOCAL_THREADS_Z), + 0, + handle.GetStream(), + srcPtr + (batchCount * srcGenericDescPtr->strides[0]), + make_uint3(srcGenericDescPtr->strides[1], srcGenericDescPtr->strides[2], srcGenericDescPtr->strides[3]), + dstPtr + (batchCount * dstGenericDescPtr->strides[0]), + make_uint3(dstGenericDescPtr->strides[1], dstGenericDescPtr->strides[2], dstGenericDescPtr->strides[3]), + dstGenericDescPtr->dims[1], + &roiGenericPtrSrc[batchCount]); + } + else + { + hipLaunchKernelGGL(gaussian_noise_voxel_ncdhw_hip_tensor, + dim3(ceil((float)globalThreads_x/LOCAL_THREADS_X), ceil((float)globalThreads_y/LOCAL_THREADS_Y), ceil((float)globalThreads_z/LOCAL_THREADS_Z)), + dim3(LOCAL_THREADS_X, LOCAL_THREADS_Y, LOCAL_THREADS_Z), + 0, + handle.GetStream(), + srcPtr + (batchCount * srcGenericDescPtr->strides[0]), + make_uint3(srcGenericDescPtr->strides[1], srcGenericDescPtr->strides[2], srcGenericDescPtr->strides[3]), + dstPtr + (batchCount * dstGenericDescPtr->strides[0]), + make_uint3(dstGenericDescPtr->strides[1], dstGenericDescPtr->strides[2], dstGenericDescPtr->strides[3]), + dstGenericDescPtr->dims[1], + make_float2(meanTensor[batchCount], stdDevTensor[batchCount]), + xorwowInitialStatePtr, + xorwowSeedStream, + &roiGenericPtrSrc[batchCount]); + } + } + } + else if (dstGenericDescPtr->layout == RpptLayout::NDHWC) + { + int globalThreads_x = (dstGenericDescPtr->strides[2] / 3 + 7) >> 3; // W - width (x direction) - vectorized for 8 element loads/stores per channel + int globalThreads_y = dstGenericDescPtr->dims[2]; // H - height (y direction) + int globalThreads_z = dstGenericDescPtr->dims[1]; // D - depth (z direction) + + for(int batchCount = 0; batchCount < dstGenericDescPtr->dims[0]; batchCount++) + { + bool copyInput = (!meanTensor[batchCount]) && (!stdDevTensor[batchCount]); + // copy ROI from input to output when mean = 0 and stdDev = 0 + if (copyInput) + { + hipLaunchKernelGGL(copy_ndhwc_hip_tensor, + dim3(ceil((float)globalThreads_x/LOCAL_THREADS_X), ceil((float)globalThreads_y/LOCAL_THREADS_Y), ceil((float)globalThreads_z/LOCAL_THREADS_Z)), + dim3(LOCAL_THREADS_X, LOCAL_THREADS_Y, LOCAL_THREADS_Z), + 0, + handle.GetStream(), + srcPtr + (batchCount * srcGenericDescPtr->strides[0]), + make_uint2(srcGenericDescPtr->strides[1], srcGenericDescPtr->strides[2]), + dstPtr + (batchCount * dstGenericDescPtr->strides[0]), + make_uint2(dstGenericDescPtr->strides[1], dstGenericDescPtr->strides[2]), + &roiGenericPtrSrc[batchCount]); + } + else + { + hipLaunchKernelGGL(gaussian_noise_voxel_ndhwc_hip_tensor, + dim3(ceil((float)globalThreads_x/LOCAL_THREADS_X), ceil((float)globalThreads_y/LOCAL_THREADS_Y), ceil((float)globalThreads_z/LOCAL_THREADS_Z)), + dim3(LOCAL_THREADS_X, LOCAL_THREADS_Y, LOCAL_THREADS_Z), + 0, + handle.GetStream(), + srcPtr + (batchCount * srcGenericDescPtr->strides[0]), + make_uint2(srcGenericDescPtr->strides[1], srcGenericDescPtr->strides[2]), + dstPtr + (batchCount * dstGenericDescPtr->strides[0]), + make_uint2(dstGenericDescPtr->strides[1], dstGenericDescPtr->strides[2]), + make_float2(meanTensor[batchCount], stdDevTensor[batchCount]), + xorwowInitialStatePtr, + xorwowSeedStream, + &roiGenericPtrSrc[batchCount]); + } + } + } + + return RPP_SUCCESS; +} diff --git a/src/modules/rppt_tensor_effects_augmentations.cpp b/src/modules/rppt_tensor_effects_augmentations.cpp index b7f4d3aa9..f089b7cde 100644 --- a/src/modules/rppt_tensor_effects_augmentations.cpp +++ b/src/modules/rppt_tensor_effects_augmentations.cpp @@ -434,6 +434,65 @@ RppStatus rppt_gaussian_noise_host(RppPtr_t srcPtr, return RPP_SUCCESS; } +RppStatus rppt_gaussian_noise_voxel_host(RppPtr_t srcPtr, + RpptGenericDescPtr srcGenericDescPtr, + RppPtr_t dstPtr, + RpptGenericDescPtr dstGenericDescPtr, + Rpp32f *meanTensor, + Rpp32f *stdDevTensor, + Rpp32u seed, + RpptROI3DPtr roiGenericPtrSrc, + RpptRoi3DType roiType, + rppHandle_t rppHandle) +{ + RppLayoutParams layoutParams; + if ((srcGenericDescPtr->layout == RpptLayout::NCDHW) && (dstGenericDescPtr->layout == RpptLayout::NCDHW)) + layoutParams = get_layout_params(srcGenericDescPtr->layout, srcGenericDescPtr->dims[1]); + else if ((srcGenericDescPtr->layout == RpptLayout::NDHWC) && (dstGenericDescPtr->layout == RpptLayout::NDHWC)) + layoutParams = get_layout_params(srcGenericDescPtr->layout, srcGenericDescPtr->dims[4]); + if ((srcGenericDescPtr->layout != RpptLayout::NCDHW) && (srcGenericDescPtr->layout != RpptLayout::NDHWC)) return RPP_ERROR_INVALID_SRC_LAYOUT; + if ((dstGenericDescPtr->layout != RpptLayout::NCDHW) && (dstGenericDescPtr->layout != RpptLayout::NDHWC)) return RPP_ERROR_INVALID_DST_LAYOUT; + if (srcGenericDescPtr->layout != dstGenericDescPtr->layout) return RPP_ERROR_INVALID_ARGUMENTS; + + RpptXorwowStateBoxMuller xorwowInitialState[SIMD_FLOAT_VECTOR_LENGTH]; + rpp_host_rng_xorwow_f32_initialize_multiseed_stream_boxmuller(xorwowInitialState, seed); + + if ((srcGenericDescPtr->dataType == RpptDataType::U8) && (dstGenericDescPtr->dataType == RpptDataType::U8)) + { + gaussian_noise_voxel_u8_u8_host_tensor(static_cast(srcPtr) + srcGenericDescPtr->offsetInBytes, + srcGenericDescPtr, + static_cast(dstPtr) + dstGenericDescPtr->offsetInBytes, + dstGenericDescPtr, + meanTensor, + stdDevTensor, + xorwowInitialState, + roiGenericPtrSrc, + roiType, + layoutParams, + rpp::deref(rppHandle)); + } + else if ((srcGenericDescPtr->dataType == RpptDataType::F32) && (dstGenericDescPtr->dataType == RpptDataType::F32)) + { + gaussian_noise_voxel_f32_f32_host_tensor(reinterpret_cast(static_cast(srcPtr) + srcGenericDescPtr->offsetInBytes), + srcGenericDescPtr, + reinterpret_cast(static_cast(dstPtr) + dstGenericDescPtr->offsetInBytes), + dstGenericDescPtr, + meanTensor, + stdDevTensor, + xorwowInitialState, + roiGenericPtrSrc, + roiType, + layoutParams, + rpp::deref(rppHandle)); + } + else + { + return RPP_ERROR_NOT_IMPLEMENTED; + } + + return RPP_SUCCESS; +} + /******************** non_linear_blend ********************/ RppStatus rppt_non_linear_blend_host(RppPtr_t srcPtr1, @@ -1120,7 +1179,7 @@ RppStatus rppt_gaussian_noise_gpu(RppPtr_t srcPtr, RpptXorwowStateBoxMuller *d_xorwowInitialStatePtr; d_xorwowInitialStatePtr = (RpptXorwowStateBoxMuller *) rpp::deref(rppHandle).GetInitHandle()->mem.mgpu.scratchBufferHip.floatmem; - hipMemcpy(d_xorwowInitialStatePtr, &xorwowInitialState, sizeof(RpptXorwowStateBoxMuller), hipMemcpyHostToDevice); + CHECK_RETURN_STATUS(hipMemcpy(d_xorwowInitialStatePtr, &xorwowInitialState, sizeof(RpptXorwowStateBoxMuller), hipMemcpyHostToDevice)); if ((srcDescPtr->dataType == RpptDataType::U8) && (dstDescPtr->dataType == RpptDataType::U8)) { @@ -1173,6 +1232,71 @@ RppStatus rppt_gaussian_noise_gpu(RppPtr_t srcPtr, #endif // backend } +RppStatus rppt_gaussian_noise_voxel_gpu(RppPtr_t srcPtr, + RpptGenericDescPtr srcGenericDescPtr, + RppPtr_t dstPtr, + RpptGenericDescPtr dstGenericDescPtr, + Rpp32f *meanTensor, + Rpp32f *stdDevTensor, + Rpp32u seed, + RpptROI3DPtr roiGenericPtrSrc, + RpptRoi3DType roiType, + rppHandle_t rppHandle) +{ +#ifdef HIP_COMPILE + if ((srcGenericDescPtr->layout != RpptLayout::NCDHW) && (srcGenericDescPtr->layout != RpptLayout::NDHWC)) return RPP_ERROR_INVALID_SRC_LAYOUT; + if ((dstGenericDescPtr->layout != RpptLayout::NCDHW) && (dstGenericDescPtr->layout != RpptLayout::NDHWC)) return RPP_ERROR_INVALID_DST_LAYOUT; + if (srcGenericDescPtr->layout != dstGenericDescPtr->layout) return RPP_ERROR_INVALID_ARGUMENTS; + + RpptXorwowStateBoxMuller xorwowInitialState; + xorwowInitialState.x[0] = 0x75BCD15 + seed; + xorwowInitialState.x[1] = 0x159A55E5 + seed; + xorwowInitialState.x[2] = 0x1F123BB5 + seed; + xorwowInitialState.x[3] = 0x5491333 + seed; + xorwowInitialState.x[4] = 0x583F19 + seed; + xorwowInitialState.counter = 0x64F0C9 + seed; + xorwowInitialState.boxMullerFlag = 0; + xorwowInitialState.boxMullerExtra = 0.0f; + + RpptXorwowStateBoxMuller *d_xorwowInitialStatePtr; + d_xorwowInitialStatePtr = (RpptXorwowStateBoxMuller *) rpp::deref(rppHandle).GetInitHandle()->mem.mgpu.scratchBufferHip.floatmem; + CHECK_RETURN_STATUS(hipMemcpy(d_xorwowInitialStatePtr, &xorwowInitialState, sizeof(RpptXorwowStateBoxMuller), hipMemcpyHostToDevice)); + + if ((srcGenericDescPtr->dataType == RpptDataType::U8) && (dstGenericDescPtr->dataType == RpptDataType::U8)) + { + hip_exec_gaussian_noise_voxel_tensor(static_cast(srcPtr) + srcGenericDescPtr->offsetInBytes, + srcGenericDescPtr, + static_cast(dstPtr) + dstGenericDescPtr->offsetInBytes, + dstGenericDescPtr, + d_xorwowInitialStatePtr, + meanTensor, + stdDevTensor, + roiGenericPtrSrc, + rpp::deref(rppHandle)); + } + else if ((srcGenericDescPtr->dataType == RpptDataType::F32) && (dstGenericDescPtr->dataType == RpptDataType::F32)) + { + hip_exec_gaussian_noise_voxel_tensor(reinterpret_cast(static_cast(srcPtr) + srcGenericDescPtr->offsetInBytes), + srcGenericDescPtr, + reinterpret_cast(static_cast(dstPtr) + dstGenericDescPtr->offsetInBytes), + dstGenericDescPtr, + d_xorwowInitialStatePtr, + meanTensor, + stdDevTensor, + roiGenericPtrSrc, + rpp::deref(rppHandle)); + } + else + { + return RPP_ERROR_NOT_IMPLEMENTED; + } + + return RPP_SUCCESS; +#elif defined(OCL_COMPILE) + return RPP_ERROR_NOT_IMPLEMENTED; +#endif // backend +} + /******************** non_linear_blend ********************/ RppStatus rppt_non_linear_blend_gpu(RppPtr_t srcPtr1, diff --git a/src/modules/rppt_tensor_geometric_augmentations.cpp b/src/modules/rppt_tensor_geometric_augmentations.cpp index 1b1297269..45a0d5221 100644 --- a/src/modules/rppt_tensor_geometric_augmentations.cpp +++ b/src/modules/rppt_tensor_geometric_augmentations.cpp @@ -1884,6 +1884,8 @@ RppStatus rppt_slice_gpu(RppPtr_t srcPtr, #endif // backend } +/******************** crop_and_patch ********************/ + RppStatus rppt_crop_and_patch_gpu(RppPtr_t srcPtr1, RppPtr_t srcPtr2, RpptDescPtr srcDescPtr, diff --git a/utilities/test_suite/HIP/Tensor_voxel_hip.cpp b/utilities/test_suite/HIP/Tensor_voxel_hip.cpp index 8e52ecd62..5834e4307 100644 --- a/utilities/test_suite/HIP/Tensor_voxel_hip.cpp +++ b/utilities/test_suite/HIP/Tensor_voxel_hip.cpp @@ -146,11 +146,10 @@ int main(int argc, char * argv[]) void *pinnedMemArgs; CHECK(hipHostMalloc(&pinnedMemArgs, 2 * noOfFiles * sizeof(Rpp32f))); - // Set the number of threads to be used by OpenMP pragma for RPP batch processing on host. - // If numThreads value passed is 0, number of OpenMP threads used by RPP will be set to batch size - Rpp32u numThreads = 0; rppHandle_t handle; - rppCreateWithBatchSize(&handle, noOfFiles, numThreads); + hipStream_t stream; + CHECK(hipStreamCreate(&stream)); + rppCreateWithStreamAndBatchSize(&handle, stream, batchSize); // Run case-wise RPP API and measure time int missingFuncFlag = 0; @@ -338,6 +337,29 @@ int main(int argc, char * argv[]) break; } + case 6: + { + testCaseName = "gaussian_noise_voxel"; + Rpp32f *meanTensor = reinterpret_cast(pinnedMemArgs); + Rpp32f *stdDevTensor = meanTensor + batchSize; + + Rpp32u seed = 1255459; + for (int i = 0; i < batchSize; i++) + { + meanTensor[i] = 1.4; + stdDevTensor[i] = 0.6; + } + + startWallTime = omp_get_wtime(); + if (inputBitDepth == 0) + rppt_gaussian_noise_voxel_gpu(d_inputU8, descriptorPtr3D, d_outputU8, descriptorPtr3D, meanTensor, stdDevTensor, seed, roiGenericSrcPtr, roiTypeSrc, handle); + else if (inputBitDepth == 2) + rppt_gaussian_noise_voxel_gpu(d_inputF32, descriptorPtr3D, d_outputF32, descriptorPtr3D, meanTensor, stdDevTensor, seed, roiGenericSrcPtr, roiTypeSrc, handle); + else + missingFuncFlag = 1; + + break; + } default: { missingFuncFlag = 1; @@ -470,8 +492,7 @@ int main(int argc, char * argv[]) avgWallTime /= (numRuns * noOfIterations); cout << fixed << "\nmax,min,avg wall times in ms/batch = " << maxWallTime << "," << minWallTime << "," << avgWallTime; } - - rppDestroyHost(handle); + rppDestroyGPU(handle); // Free memory free(niftiDataArray); diff --git a/utilities/test_suite/HIP/runTests_voxel.py b/utilities/test_suite/HIP/runTests_voxel.py index b25040b8d..7f1dff6f4 100644 --- a/utilities/test_suite/HIP/runTests_voxel.py +++ b/utilities/test_suite/HIP/runTests_voxel.py @@ -38,7 +38,7 @@ outFolderPath = os.getcwd() buildFolderPath = os.getcwd() caseMin = 0 -caseMax = 5 +caseMax = 6 def get_log_file_list(preserveOutput): return [ @@ -264,7 +264,7 @@ def rpp_test_suite_parser_and_validator(): subprocess.run(["make", "-j16"], cwd=".") # nosec # List of cases supported -supportedCaseList = ['0', '1', '2', '3', '4', '5'] +supportedCaseList = ['0', '1', '2', '3', '4', '5', '6'] # Create folders based on testType and profilingOption if testType == 1 and profilingOption == "YES": @@ -365,7 +365,7 @@ def rpp_test_suite_parser_and_validator(): print("Unable to open results in " + RESULTS_DIR + "/consolidated_results_" + TYPE + ".stats.csv") # print the results of qa tests -nonQACaseList = [] # Add cases present in supportedCaseList, but without QA support +nonQACaseList = ['6'] # Add cases present in supportedCaseList, but without QA support if qaMode and testType == 0: qaFilePath = os.path.join(outFilePath, "QA_results.txt") @@ -383,6 +383,7 @@ def rpp_test_suite_parser_and_validator(): functionality_group_list = [ "arithmetic_operations", "geometric_augmentations", + "effects_augmentations" ] for log_file in log_file_list: diff --git a/utilities/test_suite/HOST/Tensor_voxel_host.cpp b/utilities/test_suite/HOST/Tensor_voxel_host.cpp index 4c18c4013..968f29b54 100644 --- a/utilities/test_suite/HOST/Tensor_voxel_host.cpp +++ b/utilities/test_suite/HOST/Tensor_voxel_host.cpp @@ -323,6 +323,27 @@ int main(int argc, char * argv[]) break; } + case 6: + { + testCaseName = "gaussian_noise_voxel"; + Rpp32f meanTensor[batchSize]; + Rpp32f stdDevTensor[batchSize]; + + Rpp32u seed = 1255459; + for (int i = 0; i < batchSize; i++) + { + meanTensor[i] = 1.4; + stdDevTensor[i] = 0.6; + } + + startWallTime = omp_get_wtime(); + if (inputBitDepth == 2) + rppt_gaussian_noise_voxel_host(inputF32, descriptorPtr3D, outputF32, descriptorPtr3D, meanTensor, stdDevTensor, seed, roiGenericSrcPtr, roiTypeSrc, handle); + else + missingFuncFlag = 1; + + break; + } default: { missingFuncFlag = 1; diff --git a/utilities/test_suite/HOST/runTests_voxel.py b/utilities/test_suite/HOST/runTests_voxel.py index 8e8696125..ad0dbcf7d 100644 --- a/utilities/test_suite/HOST/runTests_voxel.py +++ b/utilities/test_suite/HOST/runTests_voxel.py @@ -38,7 +38,7 @@ outFolderPath = os.getcwd() buildFolderPath = os.getcwd() caseMin = 0 -caseMax = 5 +caseMax = 6 # Get a list of log files based on a flag for preserving output def get_log_file_list(): @@ -216,7 +216,7 @@ def rpp_test_suite_parser_and_validator(): subprocess.run(["make", "-j16"], cwd=".") # nosec # List of cases supported -supportedCaseList = ['0', '1', '2', '3', '4', '5'] +supportedCaseList = ['0', '1', '2', '3', '4', '5', '6'] print("\n\n\n\n\n") print("##########################################################################################") @@ -244,7 +244,7 @@ def rpp_test_suite_parser_and_validator(): run_performance_test(loggingFolder, logFileLayout, headerPath, dataPath, dstPathTemp, layout, case, numRuns, testType, qaMode, batchSize) # print the results of qa tests -nonQACaseList = [] # Add cases present in supportedCaseList, but without QA support +nonQACaseList = ['6'] # Add cases present in supportedCaseList, but without QA support if qaMode and testType == 0: qaFilePath = os.path.join(outFilePath, "QA_results.txt") @@ -261,6 +261,7 @@ def rpp_test_suite_parser_and_validator(): functionality_group_list = [ "arithmetic_operations", "geometric_augmentations", + "effects_augmentations" ] for log_file in log_file_list: diff --git a/utilities/test_suite/rpp_test_suite_voxel.h b/utilities/test_suite/rpp_test_suite_voxel.h index d72a959d7..c24fc29a8 100644 --- a/utilities/test_suite/rpp_test_suite_voxel.h +++ b/utilities/test_suite/rpp_test_suite_voxel.h @@ -64,7 +64,8 @@ std::map augmentationMap = {2, "add_scalar"}, {3, "subtract_scalar"}, {4, "flip_voxel"}, - {5, "multiply_scalar"} + {5, "multiply_scalar"}, + {6, "gaussian_noise_voxel"} }; void replicate_last_file_to_fill_batch(const string& lastFilePath, vector& filePathVector, vector& fileNamesVector, const string& lastFileName, int noOfFiles, int batchCount)