Skip to content

Instantly share code, notes, and snippets.

@nkurz
Created September 25, 2014 20:54
Show Gist options
  • Save nkurz/6844adbc58a03eb3420f to your computer and use it in GitHub Desktop.
Save nkurz/6844adbc58a03eb3420f to your computer and use it in GitHub Desktop.
Test how well compilers optimize division by constants
// Code to test how well compilers optimize division by constants
// See: http://ridiculousfish.com/blog/posts/labor-of-division-episode-iii.html
// gcc -std=gnu11 -Wall -Wextra -O3 constant_division.c -o constant_division
// objdump -d constant_division | less
#ifndef COUNT
#define COUNT (1000 * 1000)
#endif
#ifndef SEED
#define SEED 1
#endif
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef IACA
// gcc -std=gnu11 -Wall -Wextra -O3 constant_division.c -DIACA -o iaca.o
// /opt/intel/iaca/bin/iaca -mark 0 -64 -arch HSW -analysis THROUGHPUT iaca.o
#include </opt/intel/iaca/include/iacaMarks.h>
#else
#define IACA_START
#define IACA_END
#endif
#ifdef LIKWID
// cc -std=gnu11 -Wall -Wextra -O3 constant_division.c -o constant_division -DLIKWID -llikwid -lpthread -lm
// likwid -m -C2 -g BRANCH constant_division | grep UNHALTED_CORE
#include <likwid.h>
#else
#define likwid_markerInit()
#define likwid_markerThreadInit()
#define likwid_markerStartRegion(name)
#define likwid_markerStopRegion(name)
#define likwid_markerClose()
#endif // LIKWID
int main(int argc, char **argv) {
if (argc && ! argv) exit(1); // quiet warnings
char likwidRegionName[32];
uint32_t randomInt[COUNT];
uint32_t compilerSum = 0;
likwid_markerInit();
likwid_markerThreadInit();
srandom(SEED);
for (int i = 0; i < COUNT; i++) {
randomInt[i] = random();
}
printf("Using %d random 32-bit ints\n", COUNT);
sprintf(likwidRegionName, "compiler_7");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/7;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_37");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/37;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_123");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/123;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_763");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/763;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_1247");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/1247;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_9305");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/9305;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_13307");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/13307;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_52513");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/52513;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_60978747");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/60978747;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
sprintf(likwidRegionName, "compiler_106956295");
likwid_markerStartRegion(likwidRegionName);
for (int i = 0; i < COUNT; i++) {
IACA_START;
compilerSum += randomInt[i]/106956295;
IACA_END;
}
likwid_markerStopRegion(likwidRegionName);
likwid_markerClose();
printf("Sum: %u\n", compilerSum);
exit(0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment