Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions nvbench_helper/nvbench_helper/nvbench_helper.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ NVBENCH_DECLARE_TYPE_STRINGS(complex64, "C64", "complex64");

NVBENCH_DECLARE_TYPE_STRINGS(::cuda::std::false_type, "false", "false_type");
NVBENCH_DECLARE_TYPE_STRINGS(::cuda::std::true_type, "true", "true_type");
NVBENCH_DECLARE_TYPE_STRINGS(cub::ArgMin, "ArgMin", "cub::ArgMin");
NVBENCH_DECLARE_TYPE_STRINGS(cub::ArgMax, "ArgMax", "cub::ArgMax");
NVBENCH_DECLARE_TYPE_STRINGS(cub::detail::arg_min, "arg_min", "cub::detail::arg_min");
NVBENCH_DECLARE_TYPE_STRINGS(cub::detail::arg_max, "arg_max", "cub::detail::arg_max");

template <typename T, T I>
struct nvbench::type_strings<::cuda::std::integral_constant<T, I>>
Expand Down
67 changes: 67 additions & 0 deletions thrust/benchmarks/bench/extrema/basic.cu
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <thrust/device_vector.h>
#include <thrust/execution_policy.h>
#include <thrust/extrema.h>

#include "nvbench_helper.cuh"

template <typename T, typename Func>
static void bench_extremum(nvbench::state& state, nvbench::type_list<T>, Func func)
{
const auto elements = static_cast<std::size_t>(state.get_int64("Elements"));

thrust::device_vector<T> in = generate(elements);

using offset_t = typename decltype(in.cbegin())::difference_type;

state.add_element_count(elements);
state.add_global_memory_reads<T>(elements);
state.add_global_memory_writes<offset_t>(1);

caching_allocator_t alloc;
state.exec(nvbench::exec_tag::gpu | nvbench::exec_tag::no_batch | nvbench::exec_tag::sync,
[&](nvbench::launch& launch) {
do_not_optimize(func(policy(alloc, launch), in.cbegin(), in.cend()));
});
}

template <typename T>
static void min_element(nvbench::state& state, nvbench::type_list<T> list)
{
bench_extremum(state, list, [](auto&&... args) {
return thrust::min_element(args...);
});
}

NVBENCH_BENCH_TYPES(min_element, NVBENCH_TYPE_AXES(fundamental_types))
.set_name("min_element")
.set_type_axes_names({"T{ct}"})
.add_int64_power_of_two_axis("Elements", nvbench::range(16, 28, 4));

template <typename T>
static void max_element(nvbench::state& state, nvbench::type_list<T> list)
{
bench_extremum(state, list, [](auto&&... args) {
return thrust::max_element(args...);
});
}

NVBENCH_BENCH_TYPES(max_element, NVBENCH_TYPE_AXES(fundamental_types))
.set_name("max_element")
.set_type_axes_names({"T{ct}"})
.add_int64_power_of_two_axis("Elements", nvbench::range(16, 28, 4));

template <typename T>
static void minmax_element(nvbench::state& state, nvbench::type_list<T> list)
{
bench_extremum(state, list, [](auto&&... args) {
return thrust::minmax_element(args...);
});
}

NVBENCH_BENCH_TYPES(minmax_element, NVBENCH_TYPE_AXES(fundamental_types))
.set_name("minmax_element")
.set_type_axes_names({"T{ct}"})
.add_int64_power_of_two_axis("Elements", nvbench::range(16, 28, 4));
Loading
Loading