-
Notifications
You must be signed in to change notification settings - Fork 247
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #12867 from KratosMultiphysics/external/adding-goo…
…gle-benchmark [External] Adding Google benchmark option in CMake
- Loading branch information
Showing
5 changed files
with
192 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
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,13 @@ | ||
# This function automatically configures a given application to build its benchmarks | ||
macro(kratos_add_benchmarks) | ||
set(options USE_MPI USE_CUSTOM_MAIN) | ||
set(oneValueArgs TARGET WORKING_DIRECTORY) | ||
set(multiValueArgs SOURCES) | ||
|
||
cmake_parse_arguments(KRATOS_ADD_BENCHMARK "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
|
||
if(KRATOS_ADD_BENCHMARK_SOURCES) | ||
include(GoogleBenchmark) | ||
endif(KRATOS_ADD_BENCHMARK_SOURCES) | ||
|
||
endmacro(kratos_add_benchmarks) |
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,46 @@ | ||
// | / | | ||
// ' / __| _` | __| _ \ __| | ||
// . \ | ( | | ( |\__ ` | ||
// _|\_\_| \__,_|\__|\___/ ____/ | ||
// Multi-Physics | ||
// | ||
// License: BSD License | ||
// Kratos default license: kratos/license.txt | ||
// | ||
// Main authors: Vicente Mataix Ferrandiz | ||
// | ||
|
||
// System includes | ||
|
||
// External includes | ||
#include <benchmark/benchmark.h> | ||
|
||
// Project includes | ||
#include "geometries/point.h" | ||
#include "geometries/triangle_3d_3.h" | ||
#include "utilities/geometry_utilities/nearest_point_utilities.h" | ||
|
||
namespace Kratos | ||
{ | ||
|
||
// Sample data for benchmarking | ||
Point::Pointer p_point_1(make_shared<Point>( 0.0, 0.0, 0.0)); | ||
Point::Pointer p_point_2(make_shared<Point>( 1.0, 0.0, 0.0)); | ||
Point::Pointer p_point_3(make_shared<Point>( 0.0, 1.0, 0.0)); | ||
|
||
Triangle3D3<Point> triangle(p_point_1, p_point_3, p_point_2); | ||
Point nearest_point(0.0, 0.0, 0.0); | ||
Point inside_point(0.2, 0.1, 0.00); | ||
|
||
static void BM_TriangleNearestPoint(benchmark::State& state) { | ||
for (auto _ : state) { | ||
NearestPointUtilities::TriangleNearestPoint(inside_point, triangle, nearest_point); | ||
} | ||
} | ||
|
||
// Register the function as a benchmark | ||
BENCHMARK(BM_TriangleNearestPoint); | ||
|
||
} // namespace Kratos | ||
|
||
BENCHMARK_MAIN(); |
89 changes: 89 additions & 0 deletions
89
kratos/python_scripts/benchmark/generate_plot_google_benchmark.py
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,89 @@ | ||
import json | ||
import pandas as pd | ||
import matplotlib.pyplot as plt | ||
import argparse | ||
|
||
def main(filenames): | ||
""" | ||
Main function to generate a combined plot from multiple Google Benchmark JSON outputs. | ||
Args: | ||
filenames (list of str): List of paths to the JSON files containing benchmark results. | ||
The function performs the following steps: | ||
1. Loads the JSON files specified in the filenames list. | ||
2. Combines the 'benchmarks' section of all JSON data into a single pandas DataFrame. | ||
3. Plots the 'cpu_time' and 'real_time' for each benchmark with bars grouped by input filename. | ||
The resulting plot displays: | ||
- X-axis: Benchmark names (with labels based on input filenames) | ||
- Y-axis: Time in nanoseconds | ||
- Bars grouped by CPU Time and Real Time for each file | ||
NOTE: The JSON files must be generated using Google Benchmark with: | ||
./benchmark_name --benchmark_format=json --benchmark_out=filename.json | ||
""" | ||
combined_data = [] | ||
|
||
# Process each JSON file | ||
for filename in filenames: | ||
with open(filename) as f: | ||
data = json.load(f) | ||
|
||
# Extract benchmark information and add filename as a source | ||
benchmarks = data["benchmarks"] | ||
for benchmark in benchmarks: | ||
benchmark["source"] = filename | ||
combined_data.extend(benchmarks) | ||
|
||
# Convert combined data to a pandas DataFrame | ||
benchmark_df = pd.DataFrame(combined_data) | ||
|
||
# Plot the results | ||
plt.figure(figsize=(12, 8)) | ||
bar_width = 0.35 | ||
x_labels = benchmark_df["name"].unique() | ||
x = range(len(x_labels)) | ||
offset = 0 | ||
|
||
# Plot for each input file | ||
for filename in filenames: | ||
subset = benchmark_df[benchmark_df["source"] == filename] | ||
plt.bar( | ||
[pos + offset for pos in x], | ||
subset["real_time"], | ||
bar_width, | ||
label=f"{filename} - Real Time", | ||
alpha=0.7 | ||
) | ||
plt.bar( | ||
[pos + offset for pos in x], | ||
subset["cpu_time"], | ||
bar_width, | ||
label=f"{filename} - CPU Time", | ||
alpha=0.7 | ||
) | ||
offset += bar_width | ||
|
||
# Customize the plot | ||
plt.title("Benchmark Performance Across Files") | ||
plt.xlabel("Benchmark Name") | ||
plt.ylabel("Time (ns)") | ||
plt.xticks([pos + bar_width for pos in x], x_labels, rotation=45, ha="right") | ||
plt.legend() | ||
plt.tight_layout() | ||
|
||
# Show the plot | ||
plt.show() | ||
|
||
if __name__ == "__main__": | ||
""" | ||
This script can be run from the command line to generate a combined plot from multiple Google Benchmark JSON outputs. | ||
Example usage: | ||
python generate_plot_google_benchmark.py --filenames filename1.json filename2.json | ||
""" | ||
# Parse command line arguments | ||
parser = argparse.ArgumentParser(description='Generate a combined plot from multiple Google Benchmark JSON results.') | ||
parser.add_argument('--filenames', nargs='+', type=str, help='The list of JSON files containing benchmark results') | ||
args = parser.parse_args() | ||
main(args.filenames) |