#include
#include
#include
#include
#include
#include
#ifdef WIN32
#include
#define aligned_alloc(align, size) _aligned_malloc((size), (align))
#endif
#ifdef __EMSCRIPTEN__
#include
#endif
#include "tick.h"
char dst[1024*1024*64+16] = {};
uint8_t resultCheckSum = 0;
void __attribute__((noinline)) test_memset(int numTimes, int copySize)
{
for(int i = 0; i < numTimes - 8; i += 8)
{
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
}
numTimes &= 15;
for(int i = 0; i < numTimes; ++i)
{
memset(dst, i ^ 0xAA, copySize); resultCheckSum += dst[copySize >> 1];
}
}
std::vector copySizes;
std::vector results;
std::vector testCases;
double totalTimeSecs = 0.0;
void test_case(int copySize)
{
const int minimumCopyBytes = 1024*1024*64;
int numTimes = (minimumCopyBytes + copySize-1) / copySize;
if (numTimes < 8) numTimes = 8;
tick_t bestResult = 1e9;
#ifndef NUM_TRIALS
#define NUM_TRIALS 5
#endif
for(int i = 0; i < NUM_TRIALS; ++i)
{
double t0 = tick();
test_memset(numTimes, copySize);
double t1 = tick();
if (t1 - t0 < bestResult) bestResult = t1 - t0;
totalTimeSecs += (double)(t1 - t0) / ticks_per_sec();
}
unsigned long long totalBytesTransferred = numTimes * copySize;
copySizes.push_back(copySize);
tick_t ticksElapsed = bestResult;
if (ticksElapsed > 0)
{
double seconds = (double)ticksElapsed / ticks_per_sec();
double bytesPerSecond = totalBytesTransferred / seconds;
double mbytesPerSecond = bytesPerSecond / (1024.0*1024.0);
results.push_back(mbytesPerSecond);
}
else
{
results.push_back(0.0);
}
}
void print_results()
{
std::cout