책/CSAPP

CSAPP 3.11

에린_1 2024. 1. 27. 23:28
728x90

CSAPP

3.11 부동소수점 코드

  • 프로세서의 부동소수점 아키텍처의 여러가지 개념
    1. 부동소수점 값들이 저장되고 접근되는 방법, 이것은 대개 레지스터들의 일부 형태로 이뤄진다.
    2. 부동소수점 데이터로 연산하는 인스트럭션
    3. 함수들의 인자와 리턴값으로 부동소수점 값들을 전달하기 위해 이용되는 관례들
    4. 함수를 호출하는 동안 레지스터를 보존하는 관례들 - 일부 레지스터는 호출자 보관으로 저장한다. 나머지는 피호출자 지정으로 지정된다.
  • SIMD 단일 인스트럭션 다중 데이터 방식
  • 동일 연산이 다수의 서로 다른 데이터 값들에 대해 병렬로 수행된다.
  • x86-64 부동소수점은 프로시저 인자의 전달과 리턴 값의 전달 관습을 포함해서 SSE나 AVX에 기초하고 있다.
  • AVX 부동소수점 아키텍처는 %ymm0 - %ymm15로 이름 붙인 16개의 YMM레지스터들에 저장된다. 각 YMM레지스터는 256비트(32바이트)길이를 갖는다. 스칼라 데이터로 연산할 때, 이 레지스터들은 부동소수점 데이터만을 보관하며, 하위 32비트(float), 64비트(double) 만이 사용된다.

3.11.1 부동소수점 이동 및 변환 연산

  • 메모리를 참조하는 인스트럭션들은 스칼라 인스트럭션들은 스칼라 인스트럭션들이며, 이것은 이들이 묶인 데이터 값들이 아닌 개별 값들에 대해 연산한다는 것을 의미한다. 데이터는 메모리나 XMM 레지스터들에 저장된다.
  • 코드 최적화 지침이 32비트 메모리 데이터는 4바이트 정렬을 만족해야 하고, 64비트 데이터는 8바이트 정렬을 만족해야 할 것을 추천하고 있지만, 이 인스트럭션들은 데이터의 정렬과 관계없이 정확히 동작한다. 메모리 참조는 모든 다양한 변위들의 조합, 베이스 레지스터, 인덱스 레지스터, 배율 값을 포함해서 정수 MOV인스트럭션들과 완벽히 동일한 방식으로 표기한다.
  • GCC에서 데이터를 메모리에서 XMM레지스터로, 또는 XMM레지스터에서 메모리로 이동하기 위해서만 스칼라 이동연산을 이용한다. 두개의 XMM 레지스터간의 데이터 이동을 위해서는 한개의 XMM레지스터의 내용 전체를 다른 레지스터로 복사하기 위해 두 개의 인스트럭션 중 하나를 이용한다.
    • 단일 정밀도 vmovaps
    • 이중 정밀도 vmovapd
  • 이들의 경우 프로그램이 레지스터 전체를 복사하는지, 하위 값들만 복사하는지 여부는 프로그램의 기능이나 실행속도에는 아무 영향을 주지 않으며, 따라서 스칼라 데이터에 국한된 인스트럭션 대신 이 인스트럭션을 사용하더라도 아무런 실질적인 차이가 없다. 이들 인스트럭션의 문자 ‘a’는 ‘aligned’를 의미한다. 메모리에 읽고 쓰기 위해 사용될 때, 만일 주소가 16바이트 정렬요건을 만족하지 못한다면 이들은 예외를 발생시킨다. 두개의 레지스터 간에 이동에 대해서는 부정확한 정렬의 가능성은 없다.

  • 인스트럭션들은 XXM 레지스터나 메모리에서 읽은 부동소수점 값을 범용레지스터로 변환한다. 부동소수점 값들을 정수로 변환할 때, 이들은 0의 방향으로 값을 근사하는 절삭을 수행하며, 이것은 c와 대부분 다른 프로그래밍 언어에서 요구된 것이다.

  • 인스트럭션들은 정수에서 부동소수점으로 변환한다. 이들은 특이한 3-오퍼랜드 형식을 사용하며, 두개의 소스와 한개의 목적지를 가진다. 첫 번째 오퍼랜드는 메모리나 범용 레지스터에서 읽어온다. 우리는 의도적으로 두 번째 오퍼랜드를 무시할 수 있는데, 이들의 값이 결과의 상위 바이트에만 영향을 주기 때문이다. 목적지는 XMM레지스터여야 한다. 보통 두번째 소스와 목적지 오퍼랜드들은 다음의 인스트럭션에서처럼 동일하다.
  • vcvtps2pd 인스트럭션은 소스 XM레지스터의 두 개의 하위 단일정밀도 값들은 목적지 XXM레지스터에 두 개의 이중정밀도 값들로 확장한다. 즉 최종효과는 %xmm0의 하위 4바이트에 있는 최초의 단일정밀도 값을 이중정밀도로 변환하고, 이 결과를 두 개 복사해서 %xmm0에 저장하기 위한 것이다.
  • 왜 GCC가 이런 코드를 생성하는지는 불분명하다. XMM레지스터에 동일한 값을 중복해야 하는 이득이나 필요성은 없다.

3.11.2 프로시저에게 부동소수점코드

x86-64에서 XXM레지스터들이 함수로 부동소수점 인자를 전송하고 부동소수점 값들을 리턴할 때 사용된다.

  • 최대 여덟개의 부동소수점 인자들이 %xmm0 - %xmm7 XXM 레지스터들로 전달될 수 있다.
  • 한 개의 부동소수점 값을 리턴하는 함수는 레지스터 %xmm0을 이용한다.
  • 모든 XMM레지스터들은 호출자 저장방식이다. 피호출자는 이들 레지스터를 저장하지 않은채로 변경할 수 있다.
  • 어떤 함수가 포인터, 정수, 부동소수점 인자들의 조합을 가지고 있을 때, 포인터와 정수들은 범용 레지스터로 전달되지만, 부동소수점 값들은 XMM레지스터들로 전달된다.
  • 이것은 인자들의 레지스터 매핑이 이들의 타입과 순서에 의존한다는 것을 의미한다.

3.11.3 부동 소수점 산술 연산

  • 하나 또는 두 개의 소스 오퍼랜드와 한 개의 목적지를 갖는다.
  • 첫 번째 소스 오퍼랜드는 XMM레지스터나 메모리 위치일 수 있다. 두 번째 소스 오퍼랜드와 목적지 오퍼랜드는 XMM레지스터만 가능하다. 각 연산은 단일정밀도와 이중정밀도에 대한 인스트럭션을 갖는다. 결과값은 목적지 레지스터에 저장된다.

3.11.4 부동소수점 상수의 정의 및 이용

  • 정수 산술 연산들과는 달리 AVX부동소수점 연산은 즉시값을 오퍼랜드로 가질 수 없다. 그 대신, 컴파일러는 상수값들을 위해 저장공간을 할당하고 초기화 해야한다. 그러고나서 코드는 메모리에서 값을 읽어드린다.

3.11.5 부동소수점 코드에서 비트연산

  • 연산들은 모두 통합된 데이터에 적용되며, 이들이 두 소스 레지스터의 모든 데이터에 비트연산을 적용하여 목적지 XMM 레지스터 전체를 갱신한다.

3.11.6 부동소수점 비교연산

  • 부동소수점 비교 인스트럭션은 세 개의 조건코드를 설정한다. ZF,CF,PF
  • PF 패리티 플래그는 정수연산에 대해서 가장 최근 산술,논리연산이 최소 중요바이트를 짝수 패리티를 갖는 값을 생성했을 때 설정된다.(바이트 내 짝수 개의 1이 존재)

3.11.7 부동소수점 코드에 대한 관찰

  • AVX는 합체된 데이터들에 대해 병렬 연산을 수행해서 보다 더 빨리 실행되는 계산들을 만들 수 있는 가능성을 가지고 있다.

9. 가상메모리

  • 한 시스템의 프로세스들은 CPU와 메인메모리를 다른 프로세스들과 공유한다.
  • 메모리를 보다 효율적이고 더 적은 에러를 갖도록 관리하기 위해서 현대의 시스템은 가상메모리 VM라고 알려진 메인메모리의 추상화를 제공한다. 가상메모리는 각 프로세스에 하나의 크고 통합된 사적 주소공간을 제공한다. 이것은 하드웨어 예외, 하드웨어 주소번역, 메인메모리, 디스크 파일, 커널 소프트웨어들 사이의 상호작용이다. 가상메모리는 한 개의 깔끔한 매커니즘을 사용해 세 주요 기능을 제공한다.
    1. 메인 메모리를 디스크에 저장된 주소공간에 대한 캐시로 취급해서 메인메모리내 활성화 영역만 유지하고, 데이터를 디스크와 메모리간에 필요에 따라 전송하는 방법으로 메인 메모리를 효율적으로 사용한다.
    2. 각 프로세스에 통일된 주소공간을 제공함으로써 메모리 관리를 단순화 한다.
    3. 각 프로세스의 주소공간을 다른 프로세스에 의한 손상으로 부터 보호한다.
  • 가상 메모리를 프로그래머가 이해해야 하는 이유
    • 가상메모리가 중심이다. 가상메모리는 모든 컴퓨터 수준에 스며들어 있으며, 하드웨어 예외, 어셈블러, 링커, 로더, 공유 객체 파일, 프로세스를 설계하는데 중요한 역할을 한다. 가상메모리를 이해하면 어떻게 시스템이 일반적으로 동작하는지 이해하는데 도움이 된다.
    • 가상메모리는 강력하다. 가상메모리는 응용에 메모리 블록을 생성하고 없애고, 메모리 블륵을 디스크 파일로 매핑하고, 메모리를 다른 프로세스들과 공유할 수 있는 강력한 기능을 준다. 가상메모리를 이해하면 가상 메모리의 강력한 성능을 여러분의 응용 프로그램에 적용하는데 도움이 될 것이다.
    • 가상메모리는 위험하다. 응용프로그램은 이들이 변수를 참조하고, 포인터를 역참조하고, malloc 같은 동적 할당 패키지로 호출할 때마다 가상메모리와 상호작용 한다. 만일 가상메모리가 잘못 사용되면, 응용 프로그램은 당혹스럽고 퍼져나가는 메모리 관련 버그로 부터 괴로움을 당할 수 있다. 가상메모리와 이를 관리하는 malloc같은 할당 패키지를 이해하면 이러한 에러를 피하는데 도움이 된다.
728x90

' > CSAPP' 카테고리의 다른 글

CSAPP 9.6 - 9.7  (1) 2024.01.29
CSAPP 9-9.5  (1) 2024.01.28
CSAPP 3.10.3 - 3.10.5  (1) 2024.01.26
CSAPP 3.10.2  (0) 2024.01.26
CSAPP 3.9 - 3.10  (1) 2024.01.25