Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions libc/benchmarks/LibcMemoryBenchmark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,33 @@ getOffsetDistribution(size_t BufferSize, size_t MaxSizeValue,
return std::uniform_int_distribution<uint32_t>(0, MaxOffset);
}

class OffsetDistribution {
public:
OffsetDistribution(size_t BufferSize, size_t MaxSizeValue,
MaybeAlign AccessAlignment);

private:
std::uniform_int_distribution<uint32_t> Distribution;
size_t Factor;
};

OffsetDistribution::OffsetDistribution(size_t BufferSize, size_t MaxSizeValue,
MaybeAlign AccessAlignment)
: Distribution(
getOffsetDistribution(BufferSize, MaxSizeValue, AccessAlignment)),
Factor(AccessAlignment.valueOrOne().value()) {}

// Precomputes offset where to insert mismatches between the two buffers.
class MismatchOffsetDistribution {
public:
MismatchOffsetDistribution(size_t BufferSize, size_t MaxSizeValue, size_t MismatchAt);

private:
size_t MismatchAt;
std::vector<size_t> MismatchIndices;
std::uniform_int_distribution<size_t> MismatchIndexSelector;
};

MismatchOffsetDistribution::MismatchOffsetDistribution(size_t BufferSize,
size_t MaxSizeValue,
size_t MismatchAt)
Expand Down Expand Up @@ -80,6 +100,18 @@ static size_t getAvailableBufferSize() {
return getL1DataCacheSize() - L1LeftAsideBytes - ParameterStorageBytes;
}

class ParameterBatch {
public:
ParameterBatch(size_t BufferCount);
size_t getBatchBytes() const;
void checkValid(const ParameterType &P) const;

private:
size_t BufferSize;
size_t BatchSize;
std::vector<ParameterType> Parameters;
};

ParameterBatch::ParameterBatch(size_t BufferCount)
: BufferSize(getAvailableBufferSize() / BufferCount),
BatchSize(ParameterStorageBytes / sizeof(ParameterType)),
Expand Down Expand Up @@ -113,13 +145,42 @@ void ParameterBatch::checkValid(const ParameterType &P) const {
.concat(llvm::Twine(BufferSize)));
}

class CopySetup {
public:
CopySetup();

private:
ParameterBatch ParameterBatch;
AlignedBuffer SrcBuffer;
AlignedBuffer DstBuffer;
};

CopySetup::CopySetup()
: ParameterBatch(2), SrcBuffer(ParameterBatch::BufferSize),
DstBuffer(ParameterBatch::BufferSize) {}

class MoveSetup {
public:
MoveSetup();

private:
ParameterBatch ParameterBatch;
AlignedBuffer Buffer;
};

MoveSetup::MoveSetup()
: ParameterBatch(3), Buffer(ParameterBatch::BufferSize * 3) {}

class ComparisonSetup {
public:
ComparisonSetup();

private:
ParameterBatch ParameterBatch;
AlignedBuffer LhsBuffer;
AlignedBuffer RhsBuffer;
};

ComparisonSetup::ComparisonSetup()
: ParameterBatch(2), LhsBuffer(ParameterBatch::BufferSize),
RhsBuffer(ParameterBatch::BufferSize) {
Expand All @@ -128,6 +189,15 @@ ComparisonSetup::ComparisonSetup()
memset(RhsBuffer.begin(), 0xF, BufferSize);
}

class SetSetup {
public:
SetSetup();

private:
ParameterBatch ParameterBatch;
AlignedBuffer DstBuffer;
};

SetSetup::SetSetup()
: ParameterBatch(1), DstBuffer(ParameterBatch::BufferSize) {}

Expand Down