Induce a cache miss in interleaving test
This commit is contained in:
@@ -1,16 +1,24 @@
|
|||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#ifdef __x86_64__
|
||||||
|
#include <immintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ANKERL_NANOBENCH_IMPLEMENT
|
#define ANKERL_NANOBENCH_IMPLEMENT
|
||||||
#include "third_party/nanobench.h"
|
#include "third_party/nanobench.h"
|
||||||
|
|
||||||
struct Job {
|
struct Job {
|
||||||
int input;
|
int *input;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool stepJob(void *x) {
|
bool stepJob(void *x) {
|
||||||
auto *j = (Job *)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
|
// So we can look at the disassembly more easily
|
||||||
@@ -108,9 +116,11 @@ int main() {
|
|||||||
Job jobs[kNumJobs];
|
Job jobs[kNumJobs];
|
||||||
Job jobsCopy[kNumJobs];
|
Job jobsCopy[kNumJobs];
|
||||||
int iters = 0;
|
int iters = 0;
|
||||||
|
int originalInput[kNumJobs];
|
||||||
for (int i = 0; i < kNumJobs; ++i) {
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
jobs[i].input = rand() % 5 + 3;
|
originalInput[i] = rand() % 5 + 3;
|
||||||
iters += jobs[i].input;
|
jobs[i].input = new int{originalInput[i]};
|
||||||
|
iters += *jobs[i].input;
|
||||||
}
|
}
|
||||||
bench.batch(iters);
|
bench.batch(iters);
|
||||||
|
|
||||||
@@ -120,6 +130,9 @@ int main() {
|
|||||||
std::make_pair(interleaveBoundedCyclicList,
|
std::make_pair(interleaveBoundedCyclicList,
|
||||||
"interleaveBoundedCyclicList"),
|
"interleaveBoundedCyclicList"),
|
||||||
std::make_pair(interleaveCyclicList, "interleaveCyclicList")}) {
|
std::make_pair(interleaveCyclicList, "interleaveCyclicList")}) {
|
||||||
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
|
*jobs[i].input = originalInput[i];
|
||||||
|
}
|
||||||
memcpy(jobsCopy, jobs, sizeof(jobs));
|
memcpy(jobsCopy, jobs, sizeof(jobs));
|
||||||
void *ps[kNumJobs];
|
void *ps[kNumJobs];
|
||||||
for (int i = 0; i < kNumJobs; ++i) {
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
@@ -127,13 +140,16 @@ int main() {
|
|||||||
}
|
}
|
||||||
scheduler(ps, stepJob, kNumJobs);
|
scheduler(ps, stepJob, kNumJobs);
|
||||||
for (int i = 0; i < kNumJobs; ++i) {
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
if (jobsCopy[i].input != 0) {
|
if (*jobsCopy[i].input != 0) {
|
||||||
fprintf(stderr, "%s failed\n", name);
|
fprintf(stderr, "%s failed\n", name);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bench.run(name, [&]() {
|
bench.run(name, [&]() {
|
||||||
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
|
*jobs[i].input = originalInput[i];
|
||||||
|
}
|
||||||
memcpy(jobsCopy, jobs, sizeof(jobs));
|
memcpy(jobsCopy, jobs, sizeof(jobs));
|
||||||
void *ps[kNumJobs];
|
void *ps[kNumJobs];
|
||||||
for (int i = 0; i < kNumJobs; ++i) {
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
@@ -142,4 +158,7 @@ int main() {
|
|||||||
scheduler(ps, stepJob, kNumJobs);
|
scheduler(ps, stepJob, kNumJobs);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < kNumJobs; ++i) {
|
||||||
|
delete jobs[i].input;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user