AIX 벡터 프로그래밍

일부 PowerPC® 프로세서는 SIMD(단일 명령어 다중 데이터) 스타일의 벡터 확장을 구현합니다.

종종 AltiVec 또는 VMX라고도 하는 PowerPC 아키텍처의 벡터 확장은 벡터 및 행렬 수학 함수를 수행하기 위한 추가 명령어 집합을 제공합니다.

벡터 산술 연산 로직 단위는 SIMD 스타일 산술 연산 단위이며, 여기서 단일 명령어가 각 벡터의 모든 데이터 요소에서 동일한 조작을 수행합니다. 권장 기술 수준 5300-30의 AIX® 5.3 벡터 프로그래밍을 지원하는 최초의 AIX 릴리스입니다. IBM® PowerPC 970 프로세서는 벡터 확장을 구현하는 AIX 지원하는 최초의 프로세서입니다. 이러한 프로세서는 현재 BladeCenter 함께 제공되는 JS20 블레이드 서버에서 찾을 수 있습니다.

벡터 확장 개요

벡터 확장은 부호가 있거나 없는 8비트, 16비트 또는 32비트 정수나 32비트 IEEE 단일 정밀도 float를 포함하여 다양한 벡터가 포함될 수 있는 32 128비트 레지스터의 추가 세트로 구성됩니다. 포화도를 나타내는 고정 상태 비트와 부동 소수점 연산을 위한 Java™ 또는 비 Java 모드를 활성화하기 위한 제어 비트가 포함된 벡터 상태 및 제어 레지스터가 있습니다.

모든 새 프로세스에 대해 AIX에 의해 초기화된 디폴트 모드는 사용 가능한 Java 모드로, IEEE 적합 부동 소수점 조작을 제공합니다. 대체 비Java 모드는 부동 소수점 계산에 대해 모드의 정밀도를 낮추는 결과를 초래하며, 이는 일부 구현 및 특정 조작에서 상당히 더 빠를 수 있습니다. 예를 들어 Java 모드에서 실행되는 PowerPC 970 프로세서에서 일부 벡터 부동 소수점 명령어는 입력 피연산자 또는 결과가 비정상인 경우 예외가 발생하여 운영 체제에서 에뮬레이션하는 데 많은 비용이 소요될 수 있습니다. 따라서, 반올림이 허용 가능한 경우 비Java 모드를 명시적으로 사용 가능하게 하거나 비정상 값의 벡터 계산을 피하도록 주의하는 것이 좋습니다.

또한 벡터 확장은 레지스터 조작, 부동 소수점 산술 연산, 정수 산술 연산 및 논리적 연산과 벡터 비교 조작에서 벡터 레지스터 및 메모리 간의 로드 및 저장 액세스를 제공하는 명령어를 160개보다 많이 포함합니다. 부동 소수점 산술 연산 명령어는 IEEE 754-1985 단일 정밀도 형식을 사용하지만 IEEE 예외를 보고하지 않습니다. 디폴트 결과는 트랩되지 않은 예외에 대해 IEEE에서 지정된 대로 모든 예외 조건에 대해 생성됩니다. IEEE 디폴트 round-to-nearest 반올림 모드만 제공됩니다. 부동 소수점 나눗셈 또는 제곱근 명령어는 제공되지 않지만, 대신 상호 추정 명령어가 나눗셈에 대해 제공되고 상호 제곱근 추정 명령어가 제곱근에 대해 제공됩니다.

또한 사용 중인 벡터 레지스터의 비트마스크를 나타내기 위해 소프트웨어에서 관리되는 32비트 특수 용도 레지스터가 있습니다. 이를 통해 운영 체제는 문맥 전환 관리의 일부로 벡터 저장 및 복원 알고리즘을 최적화할 수 있습니다.

벡터 기능의 런타임 결정

프로그램은 _system_configuration 구조의 vmx_version 필드를 읽어서 시스템이 벡터 확장을 지원하는지 여부를 판별할 수 있습니다. 이 필드가 0이 아닌 경우 시스템 프로세서 및 운영 체제에 벡터 확장에 대한 지원이 포함됩니다. __power_vmx() 매크로가 이 테스트를 수행하기 위해 /usr/include/sys/systemcfg.h에 제공됩니다. 이는 존재하는 경우 벡터 확장을 조건부로 활용하는 소프트웨어에 유용하거나, 존재하지 않는 경우 기능상 동등한 스칼라 코드 경로를 사용하는 데 유용할 수 있습니다.

AIX ABI 확장

AIX ABI(Application Binary Interface)는 벡터 레지스터 상태 및 규칙 추가를 지원할 수 있도록 확장되었습니다. ABI 확장에 대한 전체 설명은 어셈블러 언어 참조를 참조하세요.

AIX는 AltiVec 프로그래밍 인터페이스 스펙을 지원합니다. C 및 C++ 벡터 데이터 유형의 테이블은 아래와 같습니다. 모든 벡터 데이터 유형은 크기가 16바이트이고 16바이트 경계에 정렬되어야 합니다. 벡터 유형이 포함된 집계는 해당 최대 멤버의 요구사항에 맞게 집계를 정렬하는 일반 규칙을 따라야 합니다. 벡터 유형이 포함된 집계가 패킹된 경우 벡터 유형의 16바이트 정렬을 보장할 수 없습니다. AltiVec 프로그래밍 인터페이스 스펙을 지원하는 AIX 컴파일러가 필요합니다.

표 1. 신규 C 및 C++ 벡터 데이터 유형
신규 C 및 C++ 유형 내용
벡터 부호 없는 문자 16 부호 없는 문자
벡터 부호 있는 문자 16 부호 있는 문자
벡터 부울식 문자 16 부호 없는 문자
벡터 부호 없는 short 8 부호 없는 short
벡터 부호 있는 short 8 부호 있는 short
벡터 부울식 short 8 부호 없는 short
벡터 부호 없는 정수 4 부호 없는 정수
벡터 부호 있는 정수 4 부호 있는 정수
벡터 부울식 정수 4 부호 없는 정수
벡터 float 4 float

다음 표는 벡터 레지스터 사용 규칙을 설명합니다.

표 2. 벡터 레지스터 규칙
레지스터 유형 등록 상태 사용
VRs VR0 소멸성 스크래치 레지스터
VR1 소멸성 스크래치 레지스터
VR2 소멸성

제 1 벡터 인수

함수 리턴 값의 첫 번째 벡터

VR3 소멸성 제 2 벡터 인수, 스크래치
VR4 소멸성 제 3 벡터 인수, 스크래치
VR5 소멸성 제 4 벡터 인수, 스크래치
VR6 소멸성 제 5 벡터 인수, 스크래치
VR7 소멸성 제 6 벡터 인수, 스크래치
VR8 소멸성 제 7 벡터 인수, 스크래치
VR9 소멸성 제 8 벡터 인수, 스크래치
VR10 소멸성 제 9 벡터 인수, 스크래치
VR11 소멸성 제 10 벡터 인수, 스크래치
VR12 소멸성 제 11 벡터 인수, 스크래치
VR13 소멸성 제 12 벡터 인수, 스크래치
VR14:19 소멸성 스크래치
VR20:31 예약됨(디폴트 모드)

비휘발성(확장된 ABI 모드)

디폴트 벡터 사용 모드가 사용되는 경우 이러한 레지스터가 예약되어 있어서 사용되지 않아야 합니다.

확장된 ABI 벡터 사용 모드에서 이러한 레지스터는 비휘발성이며 해당 값이 함수 호출 간에 보존됩니다.

특수 용도 VRSAVE 예약됨 AIX ABI에서는 VRSAVE가 사용되지 않습니다. ABI 호환 프로그램이 VRSAVE를 사용하거나 변경하지 않아야 합니다.
특수 용도 VSCR 소멸성 벡터 상태 및 제어 레지스터에는 포화 상태 비트 및 비Java 모드 제어 비트가 포함됩니다.

AltiVec 프로그래밍 인터페이스 스펙은 사용 중인 벡터 레지스터의 비트마스크로 사용될 VRSAVE 레지스터를 정의합니다. AIX 애플리케이션이 VRSAVE 레지스터를 수정하지 않도록 요구합니다.

함수에 있는 처음 12개의 벡터 매개변수는 VR2부터 VR13까지 배치됩니다. 불필요한 벡터 매개변수 레지스터에는 함수에 대한 입력 시 미정의 값이 포함됩니다. 비가변 길이 인수 리스트 벡터 매개변수는 범용 레지스터(GPR)에서 음영 처리되지 않습니다. 추가 벡터 매개변수는 13번째 이후로 매개변수 리스트의 해당 위치에 해당하는 매개변수 리젼 내에서 적합한 맵핑된 해당 위치에서 16바이트로 정렬되어 프로그램 스택에서 메모리를 통해 패스됩니다.

가변 길이 인수 리스트의 경우, va_list는 그 다음 매개변수의 메모리 위치에 대한 포인터로 계속 유지됩니다. va_arg()에서 벡터 유형에 액세스할 때 va_list가 먼저 16바이트 경계에 정렬되어야 합니다. 가변 길이 인수 리스트의 수신자 또는 소비자는 벡터 유형 매개변수를 검색하기 전에 이 정렬을 수행해야 합니다.

내부에 벡터 멤버가 있는 값에 의해 패스된 비팩킹 구조나 통합은 스택의 16바이트 경계에 정렬됩니다.

가변 길이 인수 리스트를 사용하는 함수는 해당 유형에 따라 순서가 지정되고 정렬된 인수 영역에 모든 매개변수가 맵핑되어 있습니다. 가변 길이 인수 리스트의 처음 8개 단어(32비트) 또는 2배 단어(64비트)는 GPR r3 - r10에서 음영 처리됩니다. 이는 벡터 매개변수를 포함합니다.

벡터 데이터 유형으로 선언된 리턴 값이 있는 함수는 VR2에 리턴 값을 배치합니다. 벡터 유형을 리턴하거나 벡터 매개변수가 있는 함수는 함수 프로토타입이 필요합니다. 이는 일반적인 경우에 컴파일러가 GPR에서 VR을 음영 처리하지 않도록 합니다.

레거시 ABI 호환성 및 상호 운용성

비휘발성 머신 상태를 저장하고 복원해야 하는 인터페이스(예: setjmp(), longjmp(), sigsetjmp(), siglongjmp(), _setjmp(), _longjmp(), getcontext(), setcontext(), makecontext() 및 swapcontext())의 성질로 인해 레거시 및 벡터 확장 ABI 모듈 간의 종속성을 고려할 때 위험이 있습니다. 설상가상으로 libc 기능의 setjmp 계열은 libc의 정적 멤버에 상주합니다. 따라서 모든 기존 AIX 2진에는 setjmp 계열과, 이 계열이 링크된 AIX 버전에 있었던 기타 계열의 정적 경계 사본이 있습니다. 더욱이 기존 AIX 2진의 jmpbufs 및 ucontext 데이터 구조 정의는 모든 추가 비소멸성 벡터 레지스터 상태를 하우징하기에 충분하지 않습니다.

레거시 모듈 및 새 모듈이 호출 또는 콜백을 인터리브하고 레거시 모듈이 longjmp() 또는 setcontext()를 수행하여 벡터 확장 모듈의 정상 연결 규약을 우회하는 경우 비휘발성 벡터 레지스터 상태를 손상시킬 위험이 있습니다.

이 이유로, AIX ABI가 비소멸성 벡터 레지스터를 정의하는 동안 AIX 컴파일러의 벡터(AltiVec)를 사용 중일 때 디폴트 컴파일 모드는 비소멸성 벡터 레지스터를 하나도 사용할 수 없습니다. 그 결과 디폴트 컴파일 환경은 레거시 2진과의 상호 운영성과 관련하여 위험성이 없으면서 벡터(AltiVec)의 사용을 안전하게 허용합니다.

상호 운영성 및 모듈 종속성이 완전히 알려진 애플리케이션의 경우, 비휘발성 벡터 레지스터의 사용을 허용하는 추가 컴파일 옵션이 사용 가능해질 수 있습니다. 이 모드는 모든 종속 레거시 모듈 및 동작이 setjmp(), sigsetjmp(), _setjmp() 또는 getcontext() 등의 함수에 대해 종속성이 없거나 모든 모듈 전이가 일반 서브루틴 연결 규약을 통해 수행되고 업스트림 레거시 모듈에 대한 콜백이 사용되지 않도록 하는 것으로 파악되고 완전히 알려진 경우에만 사용되어야 합니다.

기본 AltiVec 컴파일 환경은 AltiVec 기술 프로그래밍 인터페이스 매뉴얼에 따라 __VEC__를 미리 정의합니다.

비휘발성 벡터 레지스터를 사용하는 옵션이 활성화된 경우 컴파일 환경에서도 __EXTABI__를 미리 정의해야 합니다. 비벡터 사용 모듈을 컴파일할 때 __AIXEXTABI를 명시적으로 정의하여 확장 ABI를 인식하도록 할 수 있습니다. 그러면 해당 모듈이 비휘발성 벡터 레지스터를 사용하기 위해 사용으로 설정된 벡터 사용 모듈과 안전하게 상호 작용할 수 있습니다.

확장된 컨텍스트

벡터 확장에 필요한 추가 머신 상태와 사용자 키와 같은 다른 확장을 지원하기 위해 AIX 5.3 확장 컨텍스트 구조에 대한 지원을 도입했습니다. 머신-문맥 정보의 1차 애플리케이션 표시 사용은 신호 처리기에 제공된 sigcontext 구조의 해당 존재이며 신호 처리기에서 리턴 시 sigcontext에 있는 머신 문맥의 결과 활성화입니다. sigcontext 구조는 실제로 더 큰 ucontext 구조의 서브세트입니다. 2개의 구조가 최대 sizeof(구조 sigcontext)에 대해 동일합니다. AIX는 신호 처리기로 패스해야 할 신호 문맥을 빌드할 때 신호 처리기의 스택에 실제로 ucontext 구조를 빌드합니다. 신호 문맥의 머신-문맥 부분은 우연히 인터럽트된 문맥에 대해 소멸성이거나 비휘발성이거나 모든 활성 머신 상태를 포함해야 합니다. 기존의 신호 처리기로 2진 호환성에 영향을 미치지 않고 이를 수행하기 위해, ucontext 구조에 이전에 예약된 공간이 확장된 문맥 정보가 사용 가능한지 여부에 대한 표시로 현재 역할을 수행합니다.

ucontext, __extctx의 새로 정의된 필드는 sys/context.h 파일에 정의된 대로 확장된 문맥 구조 struct __extctx의 주소입니다. ucontext 구조 내의 새 필드 __extctx_magic__extctx_magic의 값이 __EXTCTX_MAGIC과 같을 때 확장된 문맥 정보가 유효한지 여부를 표시합니다. 벡터 확장을 사용하는 스레드의 추가 벡터 머신 상태는 신호 전달 및 리턴의 일부로 ucontext 구조에 대한 이 새 문맥 확장의 멤버로 저장되고 복원됩니다.

Ucontext 구조는 API(예: getcontext(), setcontext(), swapcontext(), makecontext())에서도 사용됩니다. 이러한 경우 저장해야 하는 컨텍스트는 자발적인 작업으로 인한 것으로, 연결 규칙을 호출하면 비휘발성 머신 상태만 저장하면 됩니다. ABI 섹션에서 설명한 바와 같이 AIX의 벡터 사용 가능화 디폴트 모드는 비소멸성 벡터 레지스터를 사용할 수 없으므로, 대다수 응용프로그램에 ucontext 구조의 확장자가 필요하지 않습니다. 애플리케이션이 비휘발성 벡터 레지스터의 사용을 명시적으로 사용 가능하게 하도록 선택하는 경우 컴파일러에 의해 __EXTABI__의 암시적 정의에서 포함되는 __extctx 필드에 대해 이미 공간이 있는 확장된 크기의 ucontext 구조를 선택합니다. 또한 확장된 ucontext는 __AIXEXTABI의 명시적 정의에서 선택될 수도 있습니다.

마찬가지로, setjmp() 또는 longjmp()와 함께 사용할 jmp_buf는 비휘발성 벡터 레지스터가 사용되지 않으므로 디폴트 모드 벡터 사용 애플리케이션에 대해 변경이 필요하지 않습니다. 비휘발성 벡터 레지스터를 명시적으로 사용 가능하게 하면 컴파일러에 의해 __EXTABI__의 암시적 정의로 인해 jmp_buf 할당이 더 커집니다. 또한 확장된 점프 버퍼도 __AIXEXTABI의 명시적 정의에서 활성화될 수 있습니다.

확장된 문맥 정보의 자세한 레이아웃은 sys/context.h 헤더 파일을 참조하십시오.

벡터 메모리 할당 및 정렬

벡터 데이터 유형은 16바이트 정렬이 필요한 데이터 유형을 도입합니다. AltiVec 프로그래밍 인터페이스 스펙에 따라 16바이트 정렬 할당을 제공하는 AIX에서 malloc 서브루틴 세트(vec_malloc, vec_free, vec_realloc, vec_calloc)를 제공합니다.

벡터 사용 컴파일에서는 _VEC_가 컴파일러에 의해 암시적으로 정의되어 레거시 malloc 및 calloc에 대한 호출이 해당 벡터 안전형 카운터 파트 vec_malloc 및 vec_calloc으로 각각 경로가 재지정됩니다. 또한 __AIXVEC를 명시적으로 정의하여 이러한 동일한 malloc 및 calloc 방향 재지정을 선택하기 위해 비벡터 코드를 명시적으로 컴파일할 수 있습니다. 또한 디폴트 malloc(), realloc() 및 calloc() 할당의 정렬이 실행시간 시 제어될 수 있습니다.

우선, 모든 프로그램 외부에서 새 환경 변수 MALLOCALIGN이 모든 malloc() 할당마다 필요한 디폴트 정렬로 설정될 수 있습니다. 예를 들어, 다음과 같습니다.
MALLOCALIGN=16;  export MALLOCALIGN

MALLOCALIGN 환경 변수는 해당하는 실행 모드의 포인터 크기와 같거나 2제곱 크게 설정될 수 있습니다(32비트 모드의 4바이트, 64비트 모드의 8바이트). MALLOCALIGN이 유효하지 않은 값으로 설정되면 값이 그 다음 2제곱까지 반올림되고 모든 후속 malloc() 할당이 해당 값에 정렬됩니다.

또한, 프로그램 내부에서 프로그램이 새 명령 옵션을 mallopt() 인터페이스에 사용하여 향후 할당을 위해 원하는 정렬을 지정할 수 있습니다. 예를 들어, 다음과 같습니다.
rc = mallopt(M_MALIGN, 16);

자세한 정보는 mallopt 및 MALLOCALIGN을 참조하십시오.

벡터 데이터 유형의 인쇄 및 스캔

AltiVec 프로그래밍 인터페이스 스펙에 따라 새 벡터 변환 형식 문자열에 대하여 scanf, fscanf, sscanf, wsscanf, printf, fprintf, sprintf, snprintf, wsprintf, vprintf, vfprintf, vsprintf 및 vwsprintf의 AIX 버전에 지원이 추가됩니다. 새 크기 포맷터는 다음과 같습니다.

  • vl 또는 lv는 하나의 인수를 이용하고 기존의 정수 변환을 수정하여 출력 변환에 대한 벡터 부호 있는 정수, 벡터 부호 없는 정수 또는 벡터 부울이나 입력 변환에 대한 벡터 부호 있는 int * 또는 벡터 부호 없는 int *를 생성합니다. 그런 다음 데이터는 각각에 대해 후속 변환 형식으로 일련의 4개의 4바이트 구성요소로 처리됩니다.
  • vh 또는 hv는 하나의 인수를 이용하고 기존의 short 정수 변환을 수정하여 출력 변환에 대한 벡터 부호 있는 short 또는 벡터 부호 없는 short나 입력 변환에 대한 벡터 부호 있는 short * 또는 벡터 부호 없는 short *를 생성합니다. 데이터는 각각에 적용된 후속 변환 형식으로 일련의 8개의 2바이트 구성요소로 처리됩니다.
  • v는 하나의 인수를 이용하고 1바이트 정수, 1바이트 문자 또는 4바이트 부동 소수점 변환을 수정합니다. 변환이 부동 소수점 변환인 경우 결과는 출력 변환에 대해 벡터 float이거나 입력 변환에 대해 벡터 float *입니다. 데이터는 각각에 적용된 후속 변환 형식으로 일련의 4개의 4바이트 부동 소수점 구성요소로 처리됩니다. 변환이 정수 또는 문자 변환인 경우 결과는 출력 변환에 대한 벡터 부호 있는 char, 벡터 부호 없는 char 또는 벡터 부울 char이거나 입력 변환에 대한 벡터 부호 있는 char * 또는 벡터 부호 없는 char *입니다. 데이터는 각각에 적용된 후속 변환 형식으로 일련의 16개의 1바이트 구성요소로 처리됩니다.

벡터-데이터 유형의 단수 양식에 적용될 수 있는 변환 형식은 벡터 양식과 함께 사용될 수 있습니다. %d, %x, %X, %u, %i 및 %o 정수 변환은 %lv, %vl, %hv, %vh 및 %v 벡터-길이 규정자와 함께 적용될 수 있습니다. %c 문자 변환은 %v 벡터 길이 규정자와 함께 적용될 수 있습니다. %a, %A, %e, %E, %f, %F, %g 및 %G float 변환은 %v 벡터 길이 규정자와 함께 적용될 수 있습니다.

입력 변환의 경우, 구분자 앞의 공백 문자를 제외하여 선택적 구분자 문자가 지정될 수 있습니다. 구분자가 지정되지 않은 경우 변환이 c가 아니면 구분자 앞에 공백 문자를 포함하는 공간이 디폴트 구분자이며, 그런 다음 디폴트 변환은 NULL입니다.

출력 변환의 경우, 벡터 크기 변환 바로 앞에 선택적 구분자 문자가 지정될 수 있습니다. 구분자가 지정되지 않은 경우 변환이 c가 아니면 디폴트 구분자가 공백이며, 그런 다음 디폴트 구분자는 NULL입니다.

스레드 애플리케이션

벡터 확장을 활용하는 멀티스레드 애플리케이션도 지원됩니다. 이러한 애플리케이션은 시스템 유효범위(1:1 스레딩 모델) 및 프로세스 유효범위(M:N 스레딩 모델) 둘 다에서 지원됩니다. 비휘발성 벡터 레지스터가 사용으로 설정되어 멀티스레드 애플리케이션이 컴파일되는 경우 해당 애플리케이션의 pthread는 확장된 ABI pthread로 플래그가 지정됩니다. 그 결과, 해당 스레드에 대해 pthread 라이브러리 내에서 문맥-저장 버퍼 할당이 더 커집니다. dbx AIX 디버거 역시 벡터 사용 가능 다중 스레드된 프로그램의 기계-레벨 디버깅에 대해 완전 지원을 제공합니다.

컴파일러

벡터 확장자를 지원하는 AIX 컴파일러는 AIX ABI 벡터 확장자와 일치해야 합니다. 앞에서 설명한 바와 같이, AIX의 디폴트 벡터 사용 가능 컴파일 모드에서는 비소멸성 벡터 레지스터 사용이 불가능한 상태입니다. 비휘발성 벡터 레지스터의 사용을 가능하게 하는 명시적 옵션은 신규 및 이전 모듈 상호 운영성에 관하여 문제 및 위험을 파악한 후 사용자 임의대로 제공되고 사용으로 설정될 수 있습니다.

비휘발성 벡터 레지스터 사용을 활성화하는 경우, C 또는 C++ 컴파일러는 __EXTABI__를 미리 정의해야 합니다. 또한 모든 형태의 벡터 컴파일에 사용하도록 설정한 경우 C 또는 C++ 컴파일러는 __VEC__를 미리 정의해야 합니다. 벡터가 활성화되지 않은 C 또는 C++ 모듈을 벡터가 활성화된 Fortran 모듈과 연결하기 위해 컴파일하는 경우, C 또는 C++ 모듈은 최소한 __AIXVEC (__VEC__와 유사한 명시적 정의)가 정의된 상태로 명시적으로 컴파일하는 것이 가장 좋으며, Fortran 모듈에서 비휘발성 벡터 레지스터가 활성화된 경우 __AIXEXTABI (__EXTABI와 유사한 명시적 정의)도 명시적으로 컴파일해야 합니다.

벡터 프로그래밍에 대해 C 및 C++ 언어에 명시적 확장을 제공하는 AltiVec 프로그래밍 인터페이스 스펙에 더하여, 일부 컴파일러는 벡터 확장을 지원하는 프로세서를 대상으로 할 때 일부 최적화 설정에서 벡터 확장의 활용을 허용하게 됩니다.

자세한 내용은 컴파일러 문서를 참조하십시오.

어셈블러

이제 /usr/ccs/bin/as 디렉터리의 AIX 어셈블러는 벡터 확장으로 정의된 추가 명령어 집합, 특히 PowerPC 970 프로세서에 의해 구현된 명령어 집합을 지원합니다. 소스 파일 내에서 새로운 -m970 어셈블리 모드나 .machine 970 pseudo op를 사용하여 새 벡터 명령어의 어셈블리를 사용 가능하게 할 수 있습니다. 자세한 내용은 어셈블러 언어 참조를 참조하세요.

디버거

/usr/ccs/bin/dbx에 있는 dbx AIX 디버거는 벡터 사용 가능 프로그램의 기계-레벨 디버깅을 지원합니다. 이 지원은 새 벡터 명령어를 역어셈블하고 벡터 레지스터를 표시하여 설정하는 기능을 포함합니다. PowerPC 970 시스템에서 dbx를 실행하지 않을 때 벡터 명령어를 포함한 PowerPC 970 관련 명령어를 디스어셈블할 수 있도록 970의 새로운 $instructionset 값이 정의되었습니다. PowerPC 970에서 dbx를 실행하는 경우 기본 $instructionset은 970이 됩니다.

벡터 레지스터를 보려면 벡터 레지스터가 기본적으로 표시되지 않으므로 부속 명령 설정 해제 $novregs가 사용되어야 합니다. 또한, 프로세서가 벡터 확장을 지원하지 않거나 시험 중인 프로세스 또는 스레드가 벡터 확장을 사용 중이 아닌 경우, 벡터 레지스터 상태가 표시되지 않습니다. 그렇지 않으면, 레지스터 부속 명령이 모든 벡터 레지스터 및 해당 내용을 원시 16진으로 인쇄합니다.

또한 기본 유형에 따라 형식화된 벡터 레지스터를 개별적으로 표시할 수 있습니다. 예를 들어, print $vr0은 레지스터 VR0의 내용을 4개의 정수 배열로 표시합니다. print $vr0c는 레지스터 VR0의 내용을 16개의 문자 배열로 표시합니다. print $vr0s는 레지스터 VR0의 내용을 8개의 short 배열로 표시하며, print $vr0f는 레지스터 VR0의 내용을 4개의 4 float 배열로 표시합니다.

전체 벡터 레지스터를 지정할 수 있습니다, 예를 들어, $vr0 = $vr1을 지정하거나 배열 요소를 지정하는 경우와 마찬가지로 벡터 레지스터의 개별 벡터 요소를 지정하십시오. 예를 들어, assign $vr0[3] = 0x11223344는 VR0의 4번째 정수 멤버만 설정하고, assign $vr0f[0] = 1.123은 값 1.123으로 설정되는 VR0의 최초 부동 멤버만 설정합니다.

함수나 프로그램을 실행하는 동안 벡터 레지스터를 추적할 수 있습니다. 예를 들어, main에서 ' $vr0 '을 추적하면 main()에서 수정될 때마다 ' VR0 '의 내용이 표시됩니다. 마찬가지로 형식 레지스터 중 하나($vr0f, ' $vr0c' , ' $vr0s)를 tracei에 지정하면 콘텐츠의 각 표시가 그에 따라 형식이 지정됩니다.

컴파일러가 해당 기본 유형의 배열로 벡터 데이터 유형을 나타내는 한, dbx도 배열로 형식화된 벡터 데이터 유형을 표시할 수 있어야 합니다.

자세한 정보는 dbx 명령 문서를 참조하십시오.

또한 스레드의 벡터 레지스터 상태를 읽고 쓰는 데 PTT_READ_VEC 및 PTT_WRITE_VEC 신규 ptrace 조작의 양식에서 써드파티 디버거가 사용으로 설정됩니다. 세부사항은 ptrace 문서를 참조하십시오.

또한 /proc 파일 시스템이 /proc 기반 디버거를 지원하도록 확장되었습니다. 벡터 사용 프로세스 및 스레드의 상태 및 lwpstatus 파일은 각각 벡터 레지스터 상태를 포함하도록 확장되었습니다. 새 제어 메시지 PCSVREG가 벡터 레지스터 상태를 설정하는 데 프로세스 또는 스레드 제어 파일의 쓰기에서 지원됩니다. 자세한 내용은 /proc 파일 참조를 참조하십시오.

코어 파일

AIX도 또한 벡터 사용 가능 프로세스 또는 스레드용 코어 파일의 부분으로 벡터 시스템 상태 포함을 지원합니다. 프로세스 또는 스레드가 벡터 확장을 사용 중인 경우에만 벡터 머신 상태가 해당 스레드의 코어 이미지에 포함됩니다. AIX 4.3 이전의 핵심 파일 형식을 선택하면 벡터 상태는 포함되지 않습니다. 벡터 상태는 현재 코어 파일 형식에서만 지원됩니다. dbx 명령을 사용하여 벡터 사용 코어 파일의 벡터 머신 상태를 읽고 표시할 수 있습니다.