diff --git a/InterleavingTest.cpp b/InterleavingTest.cpp index 41a90be..cfd4d27 100644 --- a/InterleavingTest.cpp +++ b/InterleavingTest.cpp @@ -1,16 +1,24 @@ #include #include +#ifdef __x86_64__ +#include +#endif #define ANKERL_NANOBENCH_IMPLEMENT #include "third_party/nanobench.h" struct Job { - int input; + int *input; }; bool stepJob(void *x) { auto *j = (Job *)x; - return --j->input == 0; + auto &val = *j->input; + auto result = --val == 0; +#ifdef __x86_64__ + _mm_clflush(j->input); +#endif + return result; } // So we can look at the disassembly more easily @@ -108,9 +116,11 @@ int main() { Job jobs[kNumJobs]; Job jobsCopy[kNumJobs]; int iters = 0; + int originalInput[kNumJobs]; for (int i = 0; i < kNumJobs; ++i) { - jobs[i].input = rand() % 5 + 3; - iters += jobs[i].input; + originalInput[i] = rand() % 5 + 3; + jobs[i].input = new int{originalInput[i]}; + iters += *jobs[i].input; } bench.batch(iters); @@ -120,6 +130,9 @@ int main() { std::make_pair(interleaveBoundedCyclicList, "interleaveBoundedCyclicList"), std::make_pair(interleaveCyclicList, "interleaveCyclicList")}) { + for (int i = 0; i < kNumJobs; ++i) { + *jobs[i].input = originalInput[i]; + } memcpy(jobsCopy, jobs, sizeof(jobs)); void *ps[kNumJobs]; for (int i = 0; i < kNumJobs; ++i) { @@ -127,13 +140,16 @@ int main() { } scheduler(ps, stepJob, kNumJobs); for (int i = 0; i < kNumJobs; ++i) { - if (jobsCopy[i].input != 0) { + if (*jobsCopy[i].input != 0) { fprintf(stderr, "%s failed\n", name); abort(); } } bench.run(name, [&]() { + for (int i = 0; i < kNumJobs; ++i) { + *jobs[i].input = originalInput[i]; + } memcpy(jobsCopy, jobs, sizeof(jobs)); void *ps[kNumJobs]; for (int i = 0; i < kNumJobs; ++i) { @@ -142,4 +158,7 @@ int main() { scheduler(ps, stepJob, kNumJobs); }); } + for (int i = 0; i < kNumJobs; ++i) { + delete jobs[i].input; + } }