19#ifndef HIGHWAY_HWY_CONTRIB_SORT_RESULT_INL_H_
20#define HIGHWAY_HWY_CONTRIB_SORT_RESULT_INL_H_
36 std::sort(seconds.begin(), seconds.end());
39 const size_t num = seconds.size();
40 for (
size_t i = num / 4; i < num / 2; ++i) {
51#if defined(HIGHWAY_HWY_CONTRIB_SORT_RESULT_TOGGLE) == \
52 defined(HWY_TARGET_TOGGLE)
53#ifdef HIGHWAY_HWY_CONTRIB_SORT_RESULT_TOGGLE
54#undef HIGHWAY_HWY_CONTRIB_SORT_RESULT_TOGGLE
56#define HIGHWAY_HWY_CONTRIB_SORT_RESULT_TOGGLE
77 const double bytes =
static_cast<double>(
num_keys) *
80 printf(
"%10s: %12s: %7s: %9s: %05g %4.0f MB/s (%2zu threads)\n",
96template <
class Traits,
typename LaneType>
98 const LaneType* out,
const size_t num_lanes,
99 const size_t k,
const char* caller) {
100 constexpr size_t N1 = st.LanesPerKey();
106 for (
size_t i = 0; i < num_lanes - N1; i += N1) {
107 output_stats.
Notify(out[i]);
108 if (N1 == 2) output_stats.
Notify(out[i + 1]);
111 if (i < k - N1 && st.Compare1(out + i + N1, out + i)) {
112 fprintf(stderr,
"%s: i=%d of %d lanes: N1=%d", caller,
113 static_cast<int>(i),
static_cast<int>(num_lanes),
114 static_cast<int>(N1));
116 fprintf(stderr,
"%5.0f %5.0f vs. %5.0f %5.0f\n\n",
117 static_cast<double>(out[i + 1]),
static_cast<double>(out[i + 0]),
118 static_cast<double>(out[i + N1 + 1]),
119 static_cast<double>(out[i + N1]));
121 static_cast<int>(
sizeof(
LaneType) * 8 * N1));
124 output_stats.
Notify(out[num_lanes - N1]);
125 if (N1 == 2) output_stats.
Notify(out[num_lanes - N1 + 1]);
127 return input_stats == output_stats;
130template <
class Traits,
typename LaneType>
132 const LaneType* out,
size_t num_lanes,
const char* caller) {
133 constexpr size_t N1 = st.LanesPerKey();
138 for (
size_t i = 0; i < num_lanes - N1; i += N1) {
139 output_stats.
Notify(out[i]);
140 if (N1 == 2) output_stats.
Notify(out[i + 1]);
142 if (st.Compare1(out + i + N1, out + i)) {
143 fprintf(stderr,
"%s: i=%d of %d lanes: N1=%d", caller,
144 static_cast<int>(i),
static_cast<int>(num_lanes),
145 static_cast<int>(N1));
147 fprintf(stderr,
"%5.0f %5.0f vs. %5.0f %5.0f\n\n",
148 static_cast<double>(out[i + 1]),
static_cast<double>(out[i + 0]),
149 static_cast<double>(out[i + N1 + 1]),
150 static_cast<double>(out[i + N1]));
152 static_cast<int>(
sizeof(
LaneType) * 8 * N1));
155 output_stats.
Notify(out[num_lanes - N1]);
156 if (N1 == 2) output_stats.
Notify(out[num_lanes - N1 + 1]);
158 return input_stats == output_stats;
161template <
class Traits,
typename LaneType>
163 const LaneType* out,
const size_t num_lanes,
const size_t k,
164 const char* caller) {
165 constexpr size_t N1 = st.LanesPerKey();
171 for (
size_t i = 0; i < num_lanes - N1; i += N1) {
172 output_stats.
Notify(out[i]);
173 if (N1 == 2) output_stats.
Notify(out[i + 1]);
175 if (i < k ? st.Compare1(out + k, out + i) : st.Compare1(out + i, out + k)) {
176 fprintf(stderr,
"%s: i=%d of %d lanes: N1=%d k=%d\t", caller,
177 static_cast<int>(i),
static_cast<int>(num_lanes),
178 static_cast<int>(N1),
static_cast<int>(k));
179 fprintf(stderr,
"%5.0f %5.0f vs. %5.0f %5.0f\n\n",
180 static_cast<double>(out[i]),
static_cast<double>(out[i + 1]),
181 static_cast<double>(out[k]),
static_cast<double>(out[k + 1]));
182 HWY_ABORT(
"%d-bit select is incorrect\n",
183 static_cast<int>(
sizeof(
LaneType) * 8 * N1));
186 output_stats.
Notify(out[num_lanes - N1]);
187 if (N1 == 2) output_stats.
Notify(out[num_lanes - N1 + 1]);
189 return input_stats == output_stats;
#define HWY_ABORT(format,...)
Definition base.h:233
#define HWY_ASSERT(condition)
Definition base.h:237
#define HWY_TARGET
Definition detect_targets.h:543
bool VerifySort(Traits st, const InputStats< LaneType > &input_stats, const LaneType *out, size_t num_lanes, const char *caller)
Definition result-inl.h:131
bool VerifySelect(Traits st, const InputStats< LaneType > &input_stats, const LaneType *out, const size_t num_lanes, const size_t k, const char *caller)
Definition result-inl.h:162
bool VerifyPartialSort(Traits st, const InputStats< LaneType > &input_stats, const LaneType *out, const size_t num_lanes, const size_t k, const char *caller)
Definition result-inl.h:97
decltype(GetLane(V())) LaneType
Definition generic_ops-inl.h:39
static const char * DistName(Dist dist)
Definition algo-inl.h:113
Dist
Definition algo-inl.h:107
static const char * AlgoName(Algo algo)
Definition algo-inl.h:207
static HWY_MAYBE_UNUSED const char * TargetName(int64_t target)
Definition targets.h:85
static double SummarizeMeasurements(std::vector< double > &seconds)
Definition result-inl.h:35
Algo
Definition algo-inl.h:174
#define HWY_NAMESPACE
Definition set_macros-inl.h:166
Definition result-inl.h:63
double sec
Definition result-inl.h:91
Result(const Algo algo, Dist dist, size_t num_keys, size_t num_threads, double sec, size_t sizeof_key, const char *key_name)
Definition result-inl.h:65
Algo algo
Definition result-inl.h:87
size_t sizeof_key
Definition result-inl.h:92
Dist dist
Definition result-inl.h:88
void Print() const
Definition result-inl.h:76
int64_t target
Definition result-inl.h:86
std::string key_name
Definition result-inl.h:93
size_t num_threads
Definition result-inl.h:90
Result()
Definition result-inl.h:64
size_t num_keys
Definition result-inl.h:89