From 5c97a99839cfb9ccdf46a9baf5f75568ed304868 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 13 Apr 2024 13:56:29 +0100 Subject: [PATCH] Execution ports homework --- haversine_02/src/repetition_testing/main.cpp | 56 +++++++++++++++++++ .../repetition_testing/reptest_functions.asm | 24 ++++++++ 2 files changed, 80 insertions(+) diff --git a/haversine_02/src/repetition_testing/main.cpp b/haversine_02/src/repetition_testing/main.cpp index c8d9a0f..363b6b2 100644 --- a/haversine_02/src/repetition_testing/main.cpp +++ b/haversine_02/src/repetition_testing/main.cpp @@ -27,10 +27,12 @@ extern "C" void rat_add(u64 size); extern "C" void rat_mov_add(u64 size); extern "C" void read_1(char *buffer, u64 size); extern "C" void read_2(char *buffer, u64 size); +extern "C" void read_3(char *buffer, u64 size); extern "C" void read_4(char *buffer, u64 size); extern "C" void read_8(char *buffer, u64 size); extern "C" void write_1(char *buffer, u64 size); extern "C" void write_2(char *buffer, u64 size); +extern "C" void write_3(char *buffer, u64 size); extern "C" void write_4(char *buffer, u64 size); extern "C" void write_8(char *buffer, u64 size); extern "C" void read_1x2_low(char *buffer, u64 size); @@ -60,10 +62,12 @@ void test_rat_add(reptester *tester, alloc_type type); void test_rat_mov_add(reptester *tester, alloc_type type); void test_read_1(reptester *tester, alloc_type type); void test_read_2(reptester *tester, alloc_type type); +void test_read_3(reptester *tester, alloc_type type); void test_read_4(reptester *tester, alloc_type type); void test_read_8(reptester *tester, alloc_type type); void test_write_1(reptester *tester, alloc_type type); void test_write_2(reptester *tester, alloc_type type); +void test_write_3(reptester *tester, alloc_type type); void test_write_4(reptester *tester, alloc_type type); void test_write_8(reptester *tester, alloc_type type); void test_read_1x2_low(reptester *tester, alloc_type type); @@ -151,10 +155,12 @@ int main(int argc, char *argv[]) { // {{"RAT MOV ADD", "RAT MOV ADD WITH MALLOC"}, test_rat_mov_add}, // {{"READ 1", "READ 1 WITH MALLOC"}, test_read_1}, // {{"READ 2", "READ 2 WITH MALLOC"}, test_read_2}, + // {{"READ 3", "READ 3 WITH MALLOC"}, test_read_3}, // {{"READ 4", "READ 4 WITH MALLOC"}, test_read_4}, // {{"READ 8", "READ 8 WITH MALLOC"}, test_read_8}, // {{"WRITE 1", "WRITE 1 WITH MALLOC"}, test_write_1}, // {{"WRITE 2", "WRITE 2 WITH MALLOC"}, test_write_2}, + // {{"WRITE 3", "WRITE 3 WITH MALLOC"}, test_write_3}, // {{"WRITE 4", "WRITE 4 WITH MALLOC"}, test_write_4}, // {{"WRITE 8", "WRITE 8 WITH MALLOC"}, test_write_8}, {{"READ 1x2 LOW", "READ 1x2 LOW WITH MALLOC"}, test_read_1x2_low}, @@ -732,6 +738,31 @@ void test_read_2(reptester *tester, alloc_type type) { handle_free(tester, type); } +void test_read_3(reptester *tester, alloc_type type) { + u64 start = read_cpu_timer(); + u64 fault_count_start = page_fault_count(); + + handle_alloc(tester, type); + + u64 total_size = tester->params.read_size * tester->params.read_count; + + read_3(tester->params.buffer, total_size); + + u64 fault_count_end = page_fault_count(); + u64 end = read_cpu_timer(); + + u64 read_time = end - start; + u64 page_faults = fault_count_end - fault_count_start; + + tester->results = { + total_size, + read_time, + page_faults, + }; + + handle_free(tester, type); +} + void test_read_4(reptester *tester, alloc_type type) { u64 start = read_cpu_timer(); u64 fault_count_start = page_fault_count(); @@ -832,6 +863,31 @@ void test_write_2(reptester *tester, alloc_type type) { handle_free(tester, type); } +void test_write_3(reptester *tester, alloc_type type) { + u64 start = read_cpu_timer(); + u64 fault_count_start = page_fault_count(); + + handle_alloc(tester, type); + + u64 total_size = tester->params.read_size * tester->params.read_count; + + write_3(tester->params.buffer, total_size); + + u64 fault_count_end = page_fault_count(); + u64 end = read_cpu_timer(); + + u64 read_time = end - start; + u64 page_faults = fault_count_end - fault_count_start; + + tester->results = { + total_size, + read_time, + page_faults, + }; + + handle_free(tester, type); +} + void test_write_4(reptester *tester, alloc_type type) { u64 start = read_cpu_timer(); u64 fault_count_start = page_fault_count(); diff --git a/haversine_02/src/repetition_testing/reptest_functions.asm b/haversine_02/src/repetition_testing/reptest_functions.asm index 0c531f0..1a950e9 100644 --- a/haversine_02/src/repetition_testing/reptest_functions.asm +++ b/haversine_02/src/repetition_testing/reptest_functions.asm @@ -16,10 +16,12 @@ global rat_add global rat_mov_add global read_1 global read_2 +global read_3 global read_4 global read_8 global write_1 global write_2 +global write_3 global write_4 global write_8 global read_1x2_low @@ -248,6 +250,17 @@ read_2: ret +read_3: + align 64 + .loop: + %rep 3 + mov rax, [rdi] + %endrep + sub rsi, 3 + jnle .loop + + ret + read_4: align 64 .loop: @@ -290,6 +303,17 @@ write_2: ret +write_3: + align 64 + .loop: + %rep 3 + mov QWORD [rdi], 0 + %endrep + sub rsi, 3 + jnle .loop + + ret + write_4: align 64 .loop: