-
Notifications
You must be signed in to change notification settings - Fork 46
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rocFFT and hipFFT examples (part I) (#141)
* Resolve "rocFFT callback Example" * feat: add hipFFT plan examples * Resolve "rocFFT multi_gpu Example" * Fixed CMake linting * Added rocFFT callback and multi_gpu VS files * Resolve "Generate VS files from external meta-data repository" * Fixed Markdown linting * Fixed installed target in hipFFT plan examples * Added explicit result scaling * Renamed hipFFT's main programs to use C++ extension * Renamed rocFFT/callback's main program to use HIP extension --------- Co-authored-by: Nick Breed <[email protected]> Co-authored-by: Nara Prasetya <[email protected]> Co-authored-by: Robin Voetter <[email protected]>
- Loading branch information
1 parent
80958ca
commit b6e6ecc
Showing
70 changed files
with
4,198 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
// MIT License | ||
// | ||
// Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. | ||
// | ||
// Permission is hereby granted, free of charge, to any person obtaining a copy | ||
// of this software and associated documentation files (the "Software"), to deal | ||
// in the Software without restriction, including without limitation the rights | ||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
// copies of the Software, and to permit persons to whom the Software is | ||
// furnished to do so, subject to the following conditions: | ||
// | ||
// The above copyright notice and this permission notice shall be included in all | ||
// copies or substantial portions of the Software. | ||
// | ||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
// SOFTWARE. | ||
|
||
#ifndef COMMON_HIPFFT_UTILS_HPP | ||
#define COMMON_HIPFFT_UTILS_HPP | ||
|
||
#include <hipfft/hipfft.h> | ||
|
||
#include <iomanip> | ||
#include <iostream> | ||
|
||
/// \brief Converts a \p hipfftResult_t variable to its correspondent string. | ||
inline const char* hipfftResultToString(hipfftResult_t status) | ||
{ | ||
switch(status) | ||
{ | ||
case HIPFFT_SUCCESS: return "HIPFFT_SUCCESS"; | ||
case HIPFFT_INVALID_PLAN: return "HIPFFT_INVALID_PLAN"; | ||
case HIPFFT_ALLOC_FAILED: return "HIPFFT_ALLOC_FAILED"; | ||
case HIPFFT_INVALID_TYPE: return "HIPFFT_INVALID_TYPE"; | ||
case HIPFFT_INVALID_VALUE: return "HIPFFT_INVALID_VALUE"; | ||
case HIPFFT_INTERNAL_ERROR: return "HIPFFT_INTERNAL_ERROR"; | ||
case HIPFFT_EXEC_FAILED: return "HIPFFT_EXEC_FAILED"; | ||
case HIPFFT_SETUP_FAILED: return "HIPFFT_SETUP_FAILED"; | ||
case HIPFFT_INVALID_SIZE: return "HIPFFT_INVALID_SIZE"; | ||
case HIPFFT_UNALIGNED_DATA: return "HIPFFT_UNALIGNED_DATA"; | ||
case HIPFFT_INCOMPLETE_PARAMETER_LIST: return "HIPFFT_INCOMPLETE_PARAMETER_LIST"; | ||
case HIPFFT_INVALID_DEVICE: return "HIPFFT_INVALID_DEVICE"; | ||
case HIPFFT_PARSE_ERROR: return "HIPFFT_PARSE_ERROR"; | ||
case HIPFFT_NO_WORKSPACE: return "HIPFFT_NO_WORKSPACE"; | ||
case HIPFFT_NOT_IMPLEMENTED: return "HIPFFT_NOT_IMPLEMENTED"; | ||
case HIPFFT_NOT_SUPPORTED: return "HIPFFT_NOT_SUPPORTED"; | ||
|
||
// We do use default because we are not in control of these enumeration values. | ||
// Ideally this function is something hipFFT would provide | ||
default: return "<unknown hipfftResult_t value>"; | ||
} | ||
} | ||
|
||
/// \brief Checks if the provided status code is \p HIPFFT_SUCCESS and if not, | ||
/// prints an error message to the standard error output and terminates the program | ||
/// with an error code. | ||
#define HIPFFT_CHECK(condition) \ | ||
{ \ | ||
const hipfftResult status = condition; \ | ||
if(status != HIPFFT_SUCCESS) \ | ||
{ \ | ||
std::cerr << "hipFFT error encountered: \"" << hipfftResultToString(status) \ | ||
<< "\" at " << __FILE__ << ':' << __LINE__ << std::endl; \ | ||
std::exit(error_exit_code); \ | ||
} \ | ||
} | ||
|
||
/// \brief Prints an {1,2,3}-dimensional array. The last dimension (fastest-index) specified in | ||
/// \p n will be printed horizontally. | ||
template<class T> | ||
void print_nd_data(const std::vector<T> data, const std::vector<int> n, const int column_width = 4) | ||
{ | ||
// Note: we want to print the last dimension horizontally (on the x-axis)! | ||
int size_x = n[n.size() - 1]; | ||
int size_y = n.size() > 1 ? n[n.size() - 2] : 1; | ||
int size_z = n.size() > 2 ? n[n.size() - 3] : 1; | ||
for(int z = 0; z < size_z; ++z) | ||
{ | ||
for(int y = 0; y < size_y; ++y) | ||
{ | ||
for(int x = 0; x < size_x; ++x) | ||
{ | ||
auto index = (z * size_y + y) * size_x + x; | ||
std::cout << std::setfill(' ') << std::setw(column_width) << data[index] << " "; | ||
} | ||
std::cout << "\n"; | ||
} | ||
if(z != size_z - 1) | ||
{ | ||
std::cout << "\n"; | ||
} | ||
} | ||
std::cout << std::flush; | ||
} | ||
|
||
#endif // COMMON_HIPFFT_UTILS_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// MIT License | ||
// | ||
// Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. | ||
// | ||
// Permission is hereby granted, free of charge, to any person obtaining a copy | ||
// of this software and associated documentation files (the "Software"), to deal | ||
// in the Software without restriction, including without limitation the rights | ||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
// copies of the Software, and to permit persons to whom the Software is | ||
// furnished to do so, subject to the following conditions: | ||
// | ||
// The above copyright notice and this permission notice shall be included in all | ||
// copies or substantial portions of the Software. | ||
// | ||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
// SOFTWARE. | ||
|
||
#ifndef COMMON_ROCFFT_UTILS_HPP | ||
#define COMMON_ROCFFT_UTILS_HPP | ||
|
||
#include "example_utils.hpp" | ||
|
||
#include <rocfft/rocfft.h> | ||
|
||
#include <iostream> | ||
|
||
/// \brief Converts a \p rocfft_status variable to its correspondent string. | ||
inline const char* rocfftStatusToString(rocfft_status status) | ||
{ | ||
switch(status) | ||
{ | ||
case rocfft_status_success: return "rocfft_status_success"; | ||
case rocfft_status_failure: return "rocfft_status_failure"; | ||
case rocfft_status_invalid_arg_value: return "rocfft_status_invalid_arg_value"; | ||
case rocfft_status_invalid_dimensions: return "rocfft_status_invalid_dimensions"; | ||
case rocfft_status_invalid_array_type: return "rocfft_status_invalid_array_type"; | ||
case rocfft_status_invalid_strides: return "rocfft_status_invalid_strides"; | ||
case rocfft_status_invalid_distance: return "rocfft_status_invalid_distance"; | ||
case rocfft_status_invalid_offset: return "rocfft_status_invalid_offset"; | ||
case rocfft_status_invalid_work_buffer: return "rocfft_status_invalid_work_buffer"; | ||
|
||
// We do use default because we are not in control of these enumeration values. | ||
// Ideally this function is something rocFFT would provide | ||
default: return "<unknown rocfft_status value>"; | ||
} | ||
} | ||
|
||
/// \brief Checks if the provided status code is \p rocfft_status_success and if not, | ||
/// prints an error message to the standard error output and terminates the program | ||
/// with an error code. | ||
#define ROCFFT_CHECK(condition) \ | ||
{ \ | ||
const rocfft_status status = condition; \ | ||
if(status != rocfft_status_success) \ | ||
{ \ | ||
std::cerr << "rocFFT error encountered: \"" << rocfftStatusToString(status) \ | ||
<< "\" at " << __FILE__ << ':' << __LINE__ << std::endl; \ | ||
std::exit(error_exit_code); \ | ||
} \ | ||
} | ||
|
||
#endif // COMMON_ROCFFT_UTILS_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# MIT License | ||
# | ||
# Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. | ||
# | ||
# Permission is hereby granted, free of charge, to any person obtaining a copy | ||
# of this software and associated documentation files (the "Software"), to deal | ||
# in the Software without restriction, including without limitation the rights | ||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
# copies of the Software, and to permit persons to whom the Software is | ||
# furnished to do so, subject to the following conditions: | ||
# | ||
# The above copyright notice and this permission notice shall be included in all | ||
# copies or substantial portions of the Software. | ||
# | ||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
# SOFTWARE. | ||
|
||
cmake_minimum_required(VERSION 3.21 FATAL_ERROR) | ||
project(hipFFT_examples LANGUAGES CXX) | ||
|
||
file(RELATIVE_PATH folder_bin ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) | ||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${folder_bin}) | ||
|
||
if(WIN32) | ||
set(ROCM_ROOT | ||
"$ENV{HIP_PATH}" | ||
CACHE PATH | ||
"Root directory of the ROCm installation" | ||
) | ||
else() | ||
set(ROCM_ROOT | ||
"/opt/rocm" | ||
CACHE PATH | ||
"Root directory of the ROCm installation" | ||
) | ||
endif() | ||
|
||
list(APPEND CMAKE_PREFIX_PATH "${ROCM_ROOT}") | ||
|
||
find_package(hipfft) | ||
if(NOT hipfft_FOUND) | ||
message(STATUS "hipFFT could not be found, not building hipFFT examples") | ||
return() | ||
endif() | ||
|
||
add_subdirectory(plan_d2z) | ||
add_subdirectory(plan_z2z) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
# MIT License | ||
# | ||
# Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. | ||
# | ||
# Permission is hereby granted, free of charge, to any person obtaining a copy | ||
# of this software and associated documentation files (the "Software"), to deal | ||
# in the Software without restriction, including without limitation the rights | ||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
# copies of the Software, and to permit persons to whom the Software is | ||
# furnished to do so, subject to the following conditions: | ||
# | ||
# The above copyright notice and this permission notice shall be included in all | ||
# copies or substantial portions of the Software. | ||
# | ||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
# SOFTWARE. | ||
|
||
EXAMPLES := \ | ||
plan_d2z \ | ||
plan_z2z | ||
|
||
all: $(EXAMPLES) | ||
|
||
clean: TARGET=clean | ||
clean: all | ||
|
||
$(EXAMPLES): | ||
$(MAKE) -C $@ $(TARGET) | ||
|
||
.PHONY: all clean $(EXAMPLES) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# hipFFT Examples | ||
|
||
## Summary | ||
|
||
The examples in this subdirectory showcase the functionality of [hipFFT](https://github.com/ROCm/hipFFT), a (Fast Fourier Transform) FFT marshalling library for rocFFT and cuFFT. | ||
|
||
## Prerequisites | ||
|
||
### Linux | ||
|
||
- [CMake](https://cmake.org/download/) (at least version 3.21) | ||
- OR GNU Make - available via the distribution's package manager | ||
- [ROCm](https://docs.amd.com/bundle/ROCm-Installation-Guide-v5.1.3/page/Overview_of_ROCm_Installation_Methods.html) (at least version 5.x.x) | ||
- [hipFFT](https://github.com/ROCm/hipFFT) | ||
|
||
### Windows | ||
|
||
- [Visual Studio](https://visualstudio.microsoft.com/) 2019 or 2022 with the "Desktop Development with C++" workload | ||
- ROCm toolchain for Windows (No public release yet) | ||
- The Visual Studio ROCm extension needs to be installed to build with the solution files. | ||
- [hipFFT](https://github.com/ROCm/hipFFT) | ||
- [CMake](https://cmake.org/download/) (optional, to build with CMake. Requires at least version 3.21) | ||
- [Ninja](https://ninja-build.org/) (optional, to build with CMake) | ||
|
||
## Building | ||
|
||
### Linux | ||
|
||
Make sure that the dependencies are installed, or use one of the [provided Dockerfiles](../../Dockerfiles/) to build and run the examples in a containerized environment. | ||
|
||
#### Using CMake | ||
|
||
All examples in the `hipFFT` subdirectory can either be built by a single CMake project or be built independently. | ||
|
||
- `$ cd Libraries/hipFFT` | ||
- `$ cmake -S . -B build` (on ROCm) or `$ cmake -S . -B build -D GPU_RUNTIME=CUDA` (on CUDA) | ||
- `$ cmake --build build` | ||
|
||
#### Using Make | ||
|
||
All examples can be built by a single invocation to Make or be built independently. | ||
|
||
- `$ cd Libraries/hipFFT` | ||
- `$ make` (on ROCm) or `$ make GPU_RUNTIME=CUDA` (on CUDA) | ||
|
||
### Windows | ||
|
||
#### Visual Studio | ||
|
||
Visual Studio solution files are available for the individual examples. To build all examples for hipFFT open the top level solution file [ROCm-Examples-VS2019.sln](../../ROCm-Examples-VS2019.sln) and filter for hipFFT. | ||
|
||
For more detailed build instructions refer to the top level [README.md](../../README.md#visual-studio). | ||
|
||
#### CMake | ||
|
||
All examples in the `hipFFT` subdirectory can either be built by a single CMake project or be built independently. For build instructions refer to the top-level [README.md](../../README.md#cmake-2). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
hipfft_plan_d2z |
Oops, something went wrong.