From 6f41ae9730715ba3bbd0edafa17b44ed1c1a7dd3 Mon Sep 17 00:00:00 2001 From: yenru0 Date: Wed, 22 Oct 2025 03:04:38 +0900 Subject: [PATCH] update 3.md and 4.md --- assets/3_1stackframe.png | Bin 0 -> 56888 bytes notes/3.md | 80 +++++++++-- notes/4.md | 286 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 349 insertions(+), 17 deletions(-) create mode 100644 assets/3_1stackframe.png diff --git a/assets/3_1stackframe.png b/assets/3_1stackframe.png new file mode 100644 index 0000000000000000000000000000000000000000..470cd911db51201bdca8a1fc7c31947950b61228 GIT binary patch literal 56888 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 dRCnXmwYeL?;`Myay=1_nt*NI`qyGB+e*i-_4 ```sh {cmd hide} -while ![ -r 3_6.o ]; do sleep .1; done; objdump -d 3_6.o -Msuffix +while ! [ -r 3_6.o ]; do sleep .1; done; objdump -d 3_6.o -Msuffix ``` **general do-while translation** @@ -426,7 +426,7 @@ long pcount_while(unsigned long x) { ``` ```sh {cmd hide} echo "jmp-to-middle translation" -while ![ -r 3_7.o ]; do sleep .1; done; objdump -d 3_7.o -Msuffix +while ! [ -r 3_7.o ]; do sleep .1; done; objdump -d 3_7.o -Msuffix ``` **general while translation#2** @@ -478,7 +478,7 @@ long pcount_while(unsigned long x) { ``` ```sh {cmd hide} echo "while to do-while conversion" -while ![ -r 3_8.o ]; do sleep .1; done; objdump -d 3_8.o -Msuffix +while ! [ -r 3_8.o ]; do sleep .1; done; objdump -d 3_8.o -Msuffix ``` #### for loop form @@ -560,13 +560,13 @@ long pcount_for(unsigned long x) { ```sh {cmd hide} -while ![ -r 3_9.o ]; do sleep .1; done; objdump -d 3_9.o -Msuffix +while ! [ -r 3_9.o ]; do sleep .1; done; objdump -d 3_9.o -Msuffix ``` ```sh {cmd hide} -while ![ -r 3_10.o ]; do sleep .1; done; objdump -d 3_10.o -Msuffix +while ! [ -r 3_10.o ]; do sleep .1; done; objdump -d 3_10.o -Msuffix ``` @@ -614,7 +614,7 @@ long switch_eg (long x, long y, long z) { ```sh {cmd hide} -while ![ -r 3_11.s ]; do sleep .1; done; cat 3_11.s +while ! [ -r 3_11.s ]; do sleep .1; done; cat 3_11.s ``` @@ -667,7 +667,7 @@ void multstore(long x, long y, long *dest) { ``` ```sh {cmd hide} -while ![ -r 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix +while ! [ -r 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix ``` Procedure call `call label` @@ -687,7 +687,7 @@ Procedure return: `ret` for example with above example ```sh {cmd hide} -while ![ -r 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix +while ! [ -r 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix ``` * with above `mult2` variable `t` is already stored in `%rax` @@ -718,6 +718,38 @@ Deallocated when return, "finish" code and includes pop by `ret`. #### x86-64/Linux Stack Frame +![stack frame image](/assets/3_1stackframe.png) + +* Arguments +* Local variables +* Old `rbp` + +### Register Saving Conventions + +When calling function, the temporary value of registers could be removed by called function, it could be trouble. So there are **conventions** to save the registers value. + +When procedure `yoo` calls `who`: `yoo` is `caller`, `who` is `callee` +* Caller saves temporary values in its frame before the call. +* Callee saves saves temporary values in its frame before using and restores them before returning to caller. + + +#### x86-64 Linux Register Usage + +`%rbx`, `%r12`, `%r13`, `%r14`, `%r15` +* Callee-saved +* Callee must save & restore + +`%rbp` +* Callee-saved +* Callee must save & restore +* May be used as frame pointer by callee +* Can mix & match + +`%rsp` +* Special form of callee-saved +* Restored to original value upon exit from procedure + +#### EX * for compile w/o *stack canary*, add option `-fno-stack-protector` ```c {cmd=gcc args=[-Og -x c -fno-stack-protector -c $input_file -o 3_13.o]} @@ -735,5 +767,27 @@ long call_incr() { ``` ```sh {cmd hide} -while ![ -r 3_13.o ]; do sleep .1; done; objdump -d 3_13.o -Msuffix -``` \ No newline at end of file +while ! [ -r 3_13.o ]; do sleep .1; done; objdump -d 3_13.o -Msuffix +``` + +### Recursive Function + +```c {cmd=gcc args=[-O1 -x c -fno-stack-protector -c $input_file -o 3_14.o]} +long pcount_r(unsigned long x) { + if (x == 0) { + return 0; + } else { + return (x & 1) + pcount_r(x >> 1); + } +} +``` + +```sh {cmd hide} +while ! [ -r 3_14.o ]; do sleep .1; done; objdump -d 3_14.o -Msuffix +``` + +Recursion is not a special function. +* Stack frames mean that each function call has private storage. +* Register saving conventions prevent one function call from corrupting another's data. *unless the explictly corrupting like buffer overflow* +* Stack discipline follows call/return pattern LIFO + diff --git a/notes/4.md b/notes/4.md index 2992031..05105c2 100644 --- a/notes/4.md +++ b/notes/4.md @@ -1,6 +1,284 @@ -# Machine Level Programming +# Optimization -아키텍쳐(ISA) -* intel(x86): CISC -* ARM(aarch64, aarch32): RISC +There's more to performance than asymptotic complexity(time complexity). + +But all the instructions are not consume the same amount of time. Constant factors matter too! So we need to understand system to optimize performance. +* How programs are compiled and executed +* How modern processors and memory system operate +* How to measure performance and identify bottlenecks +* How to improve performance without destroying code modularity and generality + +Provide efficent mapping of program to machine code +* Register allocation +* Code selection and ordering (scheduling) +* Dead code elimination +* Elimininating minor inefficiencies + +**Don't improve asymptotic efficiency**. + +## Generally Useful Optimizations + +### Code Motion(Hoisting) + +Reduce frequecy where computation performed. If it will always produce the same result, then move it to a place where it is computed once and reused. +Especially moving code out of loop. + +```c {cmd=gcc args=[-Og -x c -c $input_file -o 4_1.o]} +void set_row(double *a, double *b, long i, long n) { + long j; + for (j = 0; j < n; j++) { + a[i * n + j] = b[j]; + } +} +``` + + + + + + + + +
DefaultOptimized
+ +```c {cmd=gcc args=[-O1 -x c -c $input_file -o 4_2.o]} +void set_row(double *a, double *b, long i, long n) { + long j; + for (j = 0; j < n; j++) { + a[i * n + j] = b[j]; + } +} +``` + + +```c +void set_row_opt(double *a, double *b, long i, long n) { + long j; + int ni = n * i; + for (j = 0; j < n; j++) { + a[ni + j] = b[j]; + } +} +``` +
+ +```sh {cmd hide} +while ! [ -r 4_1.o ]; do sleep .1; done; objdump -d 4_1.o +``` +`imul` is located in the loop. + + +```sh {cmd hide} +while ! [ -r 4_2.o ]; do sleep .1; done; objdump -d 4_2.o +``` +can see that `imul` is located out of the loop. +
+ +Above two codes have same number of instructions. But optimized version has **fewer executed instructions**. + +GCC will do this with `-O1` options + +### Reduction in Strength + +Replace costly operation with simpler one. + +for example: power of 2 multiply to shift operation. normally, multiply and divide are expensive exmaple. on Intel Nehalem, `imul` requires 3 CPU cylcles on the other hand, `add` requires 1 cycle. + + + + +
DefaultOptimized
+ +```c +void test_reduction(double *a, double *b, long i, long n) { + int i, j; + for (i = 0;i < n; i++) { + int ni = n * i; + for (j = 0; j < n; j++) { + a[ni + j] = b[j]; + } + } +} +``` + + +```c +void test_reduction_opt(double *a, double *b, long i, long n) { + int i, j; + int ni = 0; + for (i = 0;i < n; i++) { + for (j = 0; j < n; j++) { + a[ni + j] = b[j]; + } + ni += n; + } +} +``` +
+ +### Share Common Subexpressions + +Reuse portations of expressions + +GCC will do this with `-O1` + + + + +
DefaultOptimized
+ +```c {cmd=gcc args=[-O1 -x c -c $input_file -o 4_3.o]} +double test_scs(double* val, long i, long j, long n) { + double up, down, left, right; + + up = val[(i - 1) * n + j]; + down = val[(i + 1) * n + j]; + left = val[i * n + (j - 1)]; + right = val[i * n + (j + 1)]; + return up + down + left + right; +} +``` + + +```c +double test_scs_opt(double *a, double *b, long i, long n) { + double up, down, left, right; + + long inj = i * n + j; + + up = a[inj - n]; + down = a[inj + n]; + left = b[inj - 1]; + right = b[inj + 1]; + return up + down + left + right; +} +``` +
+ +```sh {cmd hide} +while ! [ -r 4_3.o ]; do sleep .1; done; objdump -d 4_3.o +``` + +Above dump shows only one `imul`, which shows that share common subexpressions are applied. + +### Remove Unnecessary Procedure + +Think with your intuition. + +## Optimization Blockers + +Compilers cannot always optimize your code. + +```c +void lower(char *s) { + size_t i; + for (i = 0; i < strlen(s); i++) { + if (s[i] >= 'A' && s[i] <= 'Z') { + s[i] -= ('A' - 'a'); + } + } +} +``` + +Above code's performance is bad. time quadruples when double string length. +Because `strlen` is executed on every loop. so `strlen` is $O(n)$, therefore overall performance of `lower` is $O(n^2)$ + +Therefore we optimized by Code Motion by moving the calculation length parts to out of the loop. + +```c +void lower(char *s) { + size_t i; + size_t len = strlen(s); + for (i = 0; i < len; i++) { + if (s[i] >= 'A' && s[i] <= 'Z') { + s[i] -= ('A' - 'a'); + } + } +} +``` + +### #1 Procedure Calls + +Procedure may have side effects. and Function may not return same value for given arguments. + +So compiler treats procedure call as a black box. Weak optimizations near them. Therefore strong optimizations like **Code Motion** are not applied. + +In order to apply strong optimizations, First, use of inline function with `-O1` option, or **do your self**. + +### Memory Aliasing + +```c {cmd=gcc args=[-O1 -x c -c $input_file -o 4_4.o]} +void sum_rows(double *a, double *b, long n) { + long i, j; + for (i = 0; i < n; i++) { + b[i] = 0; + for (j = 0; j < n; j++) { + b[i] += a[i * n + j]; + } + } +} +``` +```sh {cmd hide} +while ! [ -r 4_4.o ]; do sleep .1; done; objdump -d 4_4.o -Msuffix +``` + +Compiler leave `b[i]` on every iteration. Because compiler must consider possibility that the updates will affect program behavior. (`b` and `a` is shared, memory aliasing) + +Memory aliasing means two different memory references specify single location. +in C, it is easy to have happen. because address arithmetic and direct access to storage structures. + +```c {cmd=gcc args=[-O1 -x c -c $input_file -o 4_5.o]} +void sum_rows(double *a, double *b, long n) { + long i, j; + for (i = 0; i < n; i++) { + double val = 0; + for (j = 0; j < n; j++) { + val += a[i * n + j]; + } + b[i] = val; + } +} +``` +```sh {cmd hide} +while ! [ -r 4_5.o ]; do sleep .1; done; objdump -d 4_5.o -Msuffix +``` + +By introducing local local variables, we can easy to get optimized code. + +## Exploiting Instruction-Level Parallelism(ILP) + +Execute multiple instructions at the same time. it can reduce average instruction cycle, which needs general understanding of modern processor design: HW can execute many operations in parallel. + +* performance limited by data dependency + +simple transformations can yield dramatic performance improvement. + +### Superscalar Processors + +Issue and Execute Multiple Instructions in one cycle. + +pipelining -> data dependency. + + +for example Haswell CPU Functional Units +* 2 load +* 1 store +* 4 integer +* 2 FP mult +* 1 FP add +* 1 FP div +* 1 int mult + +### Programming with AVX2 + +YMM register: 256bit, total 16 registers. + +**SIMD Operations** + +for single precision +`vaddps %ymm0, %ymm1, %ymm1`: + +for double precision + +`vaddpd %ymm0, %ymm1, %ymm1`