Untitled
unknown
c_cpp
a year ago
2.1 kB
12
Indexable
#include <iostream>
#include <chrono>
void ASM_PUSH();
int main() {
ASM_PUSH();
return 0;
}
void ASM_PUSH() {
const size_t numIterations = 1000000;
const size_t arraySize = 1024 * 1024 * 10;
char* data = new char[arraySize];
if (!data) {
std::cerr << "Memory allocation failed" << std::endl;
return;
}
memset(data, 'A', arraySize);
auto start = std::chrono::high_resolution_clock::now();
asm volatile (
"mov x1, %[data]\n\t" // Set x1 to point to data
"mov x2, %[arraySize]\n\t" // Set x2 to arraySize
"mov x3, %[numIterations]\n\t" // Set x3 to numIterations
"1:\n\t" // Outer loop label
"mov x4, x2\n\t" // Reset inner loop counter
"2:\n\t" // Inner loop label
"ldr b0, [x1], #1\n\t" // Load byte from memory and increment pointer
"ldr b0, [x1], #1\n\t"
"ldr b0, [x1], #1\n\t"
"ldr b0, [x1], #1\n\t"
"ldr b0, [x1], #1\n\t"
"ldr b0, [x1], #1\n\t"
"ldr b0, [x1], #1\n\t"
"ldr b0, [x1], #1\n\t"
"subs x4, x4, #8\n\t" // Decrement inner loop counter by 8
"b.ne 2b\n\t" // Branch to inner loop label if not zero
"subs x3, x3, #1\n\t" // Decrement outer loop counter
"b.ne 1b\n\t" // Branch to outer loop label if not zero
:
: [data] "r" (data), [arraySize] "r" (arraySize), [numIterations] "r" (numIterations)
: "x0", "x1", "x2", "x3", "x4", "memory"
);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
double elapsedTime = elapsed.count();
double bandwidthMBps = (arraySize * numIterations / (1024.0 * 1024.0)) / elapsedTime;
std::cout << "Elapsed Time: " << elapsedTime << " seconds" << std::endl;
std::cout << "Memory Read Bandwidth: " << bandwidthMBps << " MB/s" << std::endl;
delete[] data;
}
Editor is loading...
Leave a Comment