Simplify enum_type_list usage.

Using C++17 auto template parameters enables two improvements:

1. Enum type no longer needed in `enum_type_list`:

```
// Old:
nvbench::enum_type_list<my_enum, my_enum::value1, my_enum::value2, ...>
// New:
nvbench::enum_type_list<my_enum::value1, my_enum::value2, ...>
```

2. New `nvbench::enum_type` helper cuts down on verbosity when writing
benchmarks

```
// Old
template <typename T, my_enum_a MyEnumA, my_enum_b MyEnumB>
void my_bench(nvbench::state &state,
              nvbench::type_list<T,
                                 std::integral_constant<my_enum_a,
                                                        MyEnumA>,
                                 std::integral_constant<my_enum_b,
                                                        MyEnumB>>)
{ ... }

// New
template <typename T, my_enum_a MyEnumA, my_enum_b MyEnumB>
void my_bench(nvbench::state &state,
              nvbench::type_list<T,
                                 nvbench::enum_type<MyEnumA>,
                                 nvbench::enum_type<MyEnumB>>)
{ ... }
```
This commit is contained in:
Allison Vacanti
2021-03-18 02:59:51 -04:00
parent 01cb22cad0
commit ab8fc13aac
3 changed files with 72 additions and 44 deletions

View File

@@ -126,8 +126,10 @@ NVBENCH_BENCH(runtime_enum_sweep_int64)
// * `C` (MyEnum::ValueC)
// ```
// Optional:
// Tell NVBench how to turn your enum into strings for display, commandline
// args, `--list` output, tables, etc.
// Reasonable defaults will be used if omitted.
NVBENCH_DECLARE_ENUM_TYPE_STRINGS(
// Enum type:
MyEnum,
@@ -170,7 +172,7 @@ NVBENCH_DECLARE_ENUM_TYPE_STRINGS(
template <MyEnum EnumValue>
void compile_time_enum_sweep(
nvbench::state &state,
nvbench::type_list<std::integral_constant<MyEnum, EnumValue>>)
nvbench::type_list<nvbench::enum_type<EnumValue>>)
{
// Use EnumValue in compile-time contexts.
// Template parameters, static dispatch, etc.
@@ -181,7 +183,7 @@ void compile_time_enum_sweep(
});
}
using MyEnumList =
nvbench::enum_type_list<MyEnum, MyEnum::ValueA, MyEnum::ValueB, MyEnum::ValueC>;
nvbench::enum_type_list<MyEnum::ValueA, MyEnum::ValueB, MyEnum::ValueC>;
NVBENCH_BENCH_TYPES(compile_time_enum_sweep, NVBENCH_TYPE_AXES(MyEnumList))
.set_type_axes_names({"MyEnum"});
@@ -199,7 +201,7 @@ NVBENCH_BENCH_TYPES(compile_time_enum_sweep, NVBENCH_TYPE_AXES(MyEnumList))
template <nvbench::int32_t IntValue>
void compile_time_int_sweep(
nvbench::state &state,
nvbench::type_list<std::integral_constant<nvbench::int32_t, IntValue>>)
nvbench::type_list<nvbench::enum_type<IntValue>>)
{
// Use IntValue in compile time contexts.
// Template parameters, static dispatch, etc.
@@ -209,6 +211,6 @@ void compile_time_int_sweep(
nvbench::sleep_kernel<<<1, 1, 0, launch.get_stream()>>>(1e-3);
});
}
using MyInts = nvbench::enum_type_list<nvbench::int32_t, 0, 16, 4096, -12>;
using MyInts = nvbench::enum_type_list<0, 16, 4096, -12>;
NVBENCH_BENCH_TYPES(compile_time_int_sweep, NVBENCH_TYPE_AXES(MyInts))
.set_type_axes_names({"SomeInts"});