Created
September 25, 2014 20:54
-
-
Save nkurz/6844adbc58a03eb3420f to your computer and use it in GitHub Desktop.
Test how well compilers optimize division by constants
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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