diff --git a/README.md b/README.md index b22b127fedff42d22fecf32262ed190e0b38351d..06a4dc68eb1eeb21c3e3811450dab7267ccf8d48 100644 --- a/README.md +++ b/README.md @@ -1518,8 +1518,126 @@ int main() ## **Lecture 10** -### - +### Linux Command +1. ulimit + * 프로세스의 자원 한도를 설정하는 명령 + * Soft : 새로운 프로그램을 생성하면 기본으로 적용되는 한도 + * hard : 소프트한도에서 최대로 늘릴 수 있는 한도 + * 옵션 + * -a : 모든 제한 사항을 보여줌 + * -c : 최대 코어 파일 사이즈 설정 + * -d : 프로세스 데이터 세그먼트의 최대 크기 + * -f : shell에 의해 만들어질 수 있는 파일의 최대 크기 + * -s : 최대 스택 크기 + * -p : 파이프 크기 + * -n : 오픈 파일의 최대수 + * -u : 오픈파일의 최대수 + * -v : 최대 가상메모리의 양 + * -S : soft 한도 + * -H : hard 한도 + +### 숫자의 표현 + + +### 숫자의 표현 - 2's complement + + +### 숫자의 표현 float (IEEE 754) +* float + * sign 1 bit, exp 8 bits (bias = 127), mantissa or fraction 23 bits + + * 의미하는 값은 (sign, exponent, fraction을 정수라고 하면) + * (sign * -2 + 1) * (1.0 + fraction * 2^(-23)) * 2^(exp-127) + +* Others + * half - sign 1, exp 5, fraction 11 + * double - sign 1, exp 11, fraction 53 + * quadruple - sign 1, exp 15, fraction 113 + +### 숫자의 표현 - fixed FX_S03_04 (Q = 4) + +* floating point에 비해서 정밀도가 떨어짐 + +### 사칙연산 +* 덧셈 / 뺄셈 + * v = v_a + v_b = iv_a*2^(-q) + iv_b*2^(-q) = (iv_a + iv_b)*2^(-q) + * iv = iv_a + iv_b + +* 곱셈 + * v = v_a * v_b = iv_a*2^(-q) * iv_b*2^(-q) = (iv_a * iv_b)*2^(-2q) + * iv = iv_a * iv_b * 2^(-q) = v * 2^(q) + +* 나눗셈 + * v = v_a / v_b = iv_a*2^(-q) / iv_b*2^(-q) = (iv_a / iv_b) + * iv = iv_a / iv_b * 2^(-q) + * iv = iv_a * 2^(-q) / iv_b + +### Project S17.14 +* s : 부호 비트 -> signed +* 17 : 소수점 위 비트 수 +* 14 : 소수점 아래 비트수 +* 실제 구현은 int 혹은 long long을 사용하여 구현 +* 실제 값은 val / 2^14 + +* 예 : +``` +typedef int fx_s17_14; +typedef fx_s17_14 fixed; +``` + +* ``` #define FX_S17_14 ((1<<16)|(17<<8)|(14)) //69902 ``` + +### How to compile for 32bits in 64bits +* 64 bits compile + * ``` gcc -pg test.c -m64 ``` +* 32 bits compile + * ``` gcc -pg test.c -m32 ``` + +### What makes different performance +* Golden Rule + * Speed - CPU > Memory > Storage > IO > Human + * Register > Cache(1st, 2nd) > Memory > ... + * Locality + * Pipeline + * 구성요소 + 1. 빌드(Build) - 애플리케이션을 컴파일하는 단계 + 2. 테스트(Test) - 코드를 테스트하는 단계 + 3. 릴리스(Release) - 애플리케이션을 리포지토리에 제공하는 단계 + 4. 배포(Deploy) - 코드를 프로덕션에 배포하는 단계 + 5. 검증 및 컴플라이언스(Validation & compliance) + * 빌드 검증 단계는 해당 조직의 필요에 따라 결정 + * Clair와 같은 이미지 보안 스캔 툴을 사용하여 알려진 취약점(CVE)과 비교하는 방법으로 이미지의 품질을 보장 + * pipelining + * 한 functional unit을 사용하는 동안 다른 unit은 일하지 않음 + * unit이 명령어를 처리하는 동안 다음 명령어를 받아와서 처리하는 방식 + * 명령어 하나를 처리하는데 걸리는 시간은 그대로지만 throughput(유닛이 일정한 시간에 처리하는 일의 양)을 늘려 더 빨라보이게 만듦 + 실제로 빨라짐 + * Error + +* FLOP(Floating Point Operation) + * 컴퓨터의 성능을 수치로 나타낼 때 주로 사용되는 단위 + * 초당 부동소수점 연산이라는 의미로 컴퓨터가 1초동안 수행할 수 있는 부동소수점 연산의 횟수가 기준 + * 연산식은 FLOPS = cores x clock x (FLOPS/cycle) + +### ARM Compile (optimization) + +* 숫자가 높아질수록 세부적인 최적화 +* 최적화 후 코드가 변경되기 때문에 디버깅 불가 + +### gprof - GNU Profiling +* gprof - display call graph profile data +* Compile with -pg option + * ``` cc -pg -Wall test.c -o test``` +* Execute program and generate gmon.out file + * ```test``` +* Execute gprof + * ```gprof test gmon.out``` +* 사진추가 + * 첫번째 열을 보면 총 걸린 시간의 % 확인 가능 + * self를 통해 함수 안에서 발생한 연산 시간 확인 가능 + * gprof할 때 충분한 call이 필요하고 함수 호출은 굉장히 비쌈 + * 10~20%의 오차가 항상 발생 + * 사진추가 + * diff를 통해 비교해 본 결과 64bit가 32bit 보다 빠르다는 것을 확인 가능(사진은 32bits) ## **Lecture 11**