Skip to content

Instantly share code, notes, and snippets.

@Sanghyun-Hong
Forked from brendangregg/memprofiletest.c
Created July 23, 2016 00:34
Show Gist options
  • Save Sanghyun-Hong/22f0d8e311417b65034fe5da2d1467eb to your computer and use it in GitHub Desktop.
Save Sanghyun-Hong/22f0d8e311417b65034fe5da2d1467eb to your computer and use it in GitHub Desktop.
memprofiletest.c
/*
* memprofiletest
*
* USAGE: ./memprofiletest size_kb
*
* eg, ./memprofiletest 10240 # make larger than LLC cache for misses
*/
#include <stdio.h>
#include <stdlib.h>
/* pad methods so they can be LLC profiled without PEBS: */
#define PROF_WORKAROUND
void
memreader(char *p, unsigned long long j) {
char c;
c = p[j];
#ifdef PROF_WORKAROUND
asm(
"mfence\n"
"mfence\n"
"mfence\n"
);
#endif
}
void
cachedreader(char *p, unsigned long long j) {
char c;
c = p[0];
#ifdef PROF_WORKAROUND
asm(
"mfence\n"
"mfence\n"
"mfence\n"
);
#endif
}
void
spinner() {
int i, j;
for (i = 0, j = 0; i < 100; i++) {
j++;
}
#ifdef PROF_WORKAROUND
asm(
"mfence\n"
"mfence\n"
"mfence\n"
);
#endif
}
int
main(int argc, char *argv[])
{
unsigned long long size, i, j;
char *p, c;
if (argc != 2) {
printf("USAGE: memstride size_KB\n");
exit(1);
}
size = atoi(argv[1]) * 1024ULL;
if ((p = malloc(size)) == NULL) {
printf("ERROR: malloc failed\n");
exit(1);
}
printf("Populate...\n");
for (j = 0; j < size; j += 32) {
p[j] = 'a';
}
printf("Stride...\n");
i = 0;
for (;;) {
for (j = 0ULL; j < size; j += 1024) {
i++;
if (i > 100000000ULL) { exit(0); }
memreader(p, j);
cachedreader(p, j);
spinner();
}
}
return (0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment