알티벡

AltiVec

AltiVec은 Apple, IBMFreescale Semiconductor(이전의 Motorola의 Semiconductor Products Sector)가 설계 및 소유한 단일 정밀 부동 소수점 및 정수 SIMD 명령 세트입니다.Motorola의 G4, IBMG5POWER6 프로세서 및 P.A.를 포함한 PowerPC 프로세서 아키텍처 버전에 구현됩니다. SemiPWRficient PA6T.AltiVec은 Freescale만이 소유한 상표이므로 Apple에서는 Velocity Engine, IBM 및 P.A에서는 VMX(Vector Multimedia Extension)라고도 합니다.세미.

AltiVec은 명령어 세트를 나타내지만 IBM과 Motorola가 생산하는 CPU의 구현은 논리 설계 측면에서 별개입니다.현재까지 IBM 코어에는 Motorola에서 라이센스를 받은 AltiVec 로직 설계가 포함되어 있지 않습니다.

AltiVec은 Power ISA v.2.03[1] 사양의 표준 부품입니다.PowerPC 명령 형식과 구문을 사용하고 이러한 목적으로 명시적으로 할당된 opcode 공간을 사용했지만 이 사양까지 공식적으로 PowerPC 아키텍처에 포함되지 않았습니다.

x86-64 SSE와의 비교

VMX/AltiVec 및 SSE는 모두 16개의 8비트 서명된 문자 또는 부호 없는 문자, 8개의 16비트 서명된 문자 또는 부호 없는 짧은 문자, 4개의 32비트 int 또는 4개의 32비트 부동 소수점 변수를 나타낼 수 있는 128비트 벡터 레지스터를 제공합니다.둘 다 데이터 스트림에서 작업할 때 캐시 오염을 최소화하기 위한 캐시 제어 명령을 제공합니다.

그들은 또한 중요한 차이를 보인다.SSE2와 달리 VMX/AltiVec은 특수한 RGB "픽셀" 데이터 유형을 지원하지만 64비트 배정도 부동에서는 작동하지 않으며 스칼라와 벡터 레지스터 간에 직접 데이터를 이동할 수 없습니다.Power의 "로드/스토어" 모델에 준거PC의 RISC 설계, 벡터 레지스터는 스칼라 레지스터와 마찬가지로 메모리에서만 로드 및 저장할 수 있습니다.그러나 VMX/AltiVec은 벡터의 모든 요소에서 작동하는 훨씬 완벽한 "수평" 작업 집합을 제공합니다. 데이터 유형과 작업의 허용 가능한 조합은 훨씬 더 완벽합니다.SSE 및 SSE2의 경우 8개(x86-64에서는 16개로 확장됨)에 비해 32개의 128비트 벡터 레지스터가 제공되며, 대부분의 VMX/AltiVec 명령에는 3개의 레지스터 오퍼랜드가 필요합니다.이는 IA-32에서는 2개의 레지스터/레지스터 또는 레지스터/메모리 오퍼랜드에 불과합니다.

또한 VMX/AltiVec은 유연한 벡터 순열 명령을 지원한다는 점에서 독특합니다. 즉, 결과 벡터 값의 각 바이트는 다른 2개의 벡터 중 하나의 바이트에서 얻을 수 있으며, 다른 벡터에 의해 매개 변수가 지정됩니다.이를 통해 한 번의 명령으로 정교한 조작이 가능합니다.

GCC(GNU 컴파일러 컬렉션), IBM VisualAge 컴파일러 및 기타 컴파일러의 최신 버전은[when?] C 및 C++ 프로그램에서 직접 VMX/AltiVec 명령에 액세스할 수 있는 기능을 제공합니다.버전 4부터는 프로그래머가 직접 내장 기능을 사용할 필요 없이 VMX/Altivec 가속 바이너리를 지능적으로 생성하려는 자동 벡터화 기능도 포함되어 있습니다."vector" type 키워드가 도입되어 네이티브 벡터 타입(예: " ")을 선언할 수 있게 되었습니다.vector unsigned char foo;"는 16개의 8비트 부호 없는 문자를 포함하는 "foo"라는 이름의 128비트 벡터 변수를 선언합니다.정규 C 표현 언어를 사용하여 벡터 변수를 조작할 수 있도록 산술 연산자와 이진 연산자의 완전한 보수가 벡터 유형에 정의됩니다.또한 "와 같은 과부하된 고유 함수도 있습니다.vec_add벡터 내의 요소 유형에 따라 적절한 opcode를 방출하고 매우 강력한 유형 검사가 수행됩니다.이와는 대조적으로 IA-32 SIMD 레지스터용 인텔 정의 데이터 타입은 벡터 레지스터의 크기(128비트 또는 64비트)만을 선언합니다.또한 128비트 레지스터의 경우 정수 또는 부동소수점 값을 포함하는지 여부를 선언합니다.프로그래머는 사용 중인 데이터 타입에 적합한 본질을 선택해야 합니다.예를 들어, "_mm_add_epi16(x,y)8개의 16비트 정수를 포함하는 2개의 벡터를 추가합니다.

개발 이력

Power Vector Media Extension(VMX)은 1996년부터 1998년 사이에 Apple, IBM 및 Motorola의 공동 프로젝트에 의해 개발되었습니다.Apple은 2005년 6월 6일 인텔제 x86 기반 CPU로 전환할 때까지 Power Vector Media Extension(VMX)의 주요 고객이었습니다.Quartz 그래픽 컴포지터를 포함한 QuickTime, iTunes 및 Apple Mac OS X의 주요 부품과 같은 멀티미디어 애플리케이션을 가속화하는 데 사용되었습니다.Adobe와 같은 다른 회사들은 Adobe Photoshop과 같은 이미지 처리 프로그램을 최적화하기 위해 AltiVec을 사용했다.모토로라는 G4 제품군을 시작으로 AltiVec 대응 프로세서를 최초로 공급했다.AltiVec은 고성능 디지털 신호 처리를 위해 일부 임베디드 시스템에도 사용되었습니다.

IBM은 VMX가 그다지 유용하지 않은 서버 애플리케이션을 위해 고안된 이전의 POWER 마이크로프로세서에서 일관되게 제외했습니다.2007년에 도입된 POWER6 마이크로프로세서는 AltiVec을 구현하고 있습니다.IBM의 마지막 데스크톱 마이크로프로세서인 PowerPC 970(애플의 「G5」를 더빙)도, 파워와 같은 하드웨어를 탑재한 AltiVec를 실장했습니다.PC 7400.

AltiVec은 Freescale(이전의 Motorola)이 표준 카테고리의 상표로 등록한 브랜드명입니다.Power ISA v.2.03[1] 사양의 벡터 부분.이 카테고리는 VMX(IBM에서 사용) 및 "Velocity Engine"(Apple에서 이전에 사용하던 브랜드 이름)이라고도 합니다.

PlayStation 3에서 사용되는 Cell Broadband Engine은 PPU에서 Power Vector Media Extension(VMX)도 지원하며 SPU ISA는 확장되었지만 아키텍처는 비슷합니다.

Freescale은 확장판 AltiVec을 e6500 기반의 Qor에 도입할 예정입니다.IQ 프로세서

VMX128

IBM이 제논(Xbox 360)에서 사용할 수 있도록 VMX를 확장했으며 이를 VMX128이라고 했습니다.향상된 기능은 게임을 대상으로 하는 새로운 루틴(3D 그래픽 및 게임 [2]물리 가속화)과 총 128개의 레지스터로 구성됩니다.더 큰 레지스터 파일과 추가 애플리케이션별 [3]작업을 위한 공간을 확보하기 위해 여러 정수 작업이 제거되었기 때문에 VMX128은 VMX/Altivec와 완전히 호환되지 않습니다.[4]

VSX(벡터 스칼라 확장)

Power ISA v2.06에서는 VSX 벡터 스칼라 명령이[5] 도입되어 Power ISA의 SIMD 처리를 확장하여 최대 64개의 레지스터를 지원하며 일반 부동 소수점, 10진 부동 소수점 및 벡터 실행을 지원합니다.POWER7은 Power ISA v2.06을 구현한 최초의 Power ISA 프로세서입니다.

IBM은 Power ISA 2.07의 VSX 확장의 일부로 정수 연산을 위해 Vector Media Extension 범주에 새로운 명령을 도입했습니다.

Power ISA v3.0의 VSX 확장의 일부로 VMX 인코딩에 이어 IBM에 의해 새로운 정수 벡터 명령이 도입되었습니다.POWER9 [6]프로세서와 함께 도입됩니다.

문제들

C++에서는 표준 템플릿 라이브러리를 사용하여 AltiVec 지원에 액세스하는 표준 방법은 서로 배타적입니다.vector<>class 템플릿은 컴파일러가 컨텍스트에 민감한 키워드 버전의 벡터를 구현하지 않을 때 예약된 워드로 처리되기 때문입니다.단, 컴파일러 고유의 회피책을 사용하여 이들을 조합할 수 있습니다.예를 들어 GCC에서는 다음과 같은 경우가 있습니다.#undef vector제거하다vector키워드를 지정하고 나서, GCC 고유의__vector키워드를 지정합니다.

Power ISA 2.06보다 이전 VSX의 AltiVec은 타입의 자연스러운 정렬을 사용하면 메모리 로드가 부족합니다.예를 들어, 다음 코드는 유효 주소가 16바이트 정렬되지 않은 경우 Power6 이하를 특별히 취급해야 합니다.VSX를 사용할 수 없을 때 특수 처리를 통해 로드 작업에 3가지 명령이 추가됩니다.

#실패하다 <altivec>h> 유형화된 __개요 서명되어 있지 않다  uint8x16_p; 유형화된 __개요 서명되어 있지 않다  인트 uint32x4_p; ... 인트 주된(인트 argc, * argv) {     /* 값의 자연스러운 정렬은 4이며, 필요에 따라 16이 아닙니다.*/     서명되어 있지 않다 인트 [4] = { 1, 2, 3, 4 };     uint32x4_p VEC;  # 정의되어 있는 경우(_VSX__) 정의되어 있는 경우(_ARCH_PWR8)     VEC = vec_filename(vec_module)(0, ); #실패하다     컨스턴트 uint8x16_p 파마 = vec_lvsl(0, );     컨스턴트 uint8x16_p 낮다  = vec_ld(0, );     컨스턴트 uint8x16_p 높은 = vec_ld(15, );     VEC = (uint32x4_p)vec_filename(vec_module)(낮다, 높은, 파마); #엔디프  } 

VMX를 사용하는 Power ISA 2.06 이전 버전의 AltiVec에는 64비트 정수 지원이 없습니다.64비트 데이터를 조작하고 싶은 개발자는 32비트 컴포넌트에서 루틴을 개발합니다.예를 들어 64비트의 예를 다음에 나타냅니다.add그리고.subtract32비트 단어 4개가 포함된 벡터를 빅 엔디언 머신에서 사용합니다.는 교재 수학에서와 같이 반송 및 차용 비트를 1열과 3열에서 0열과 2열로 이동합니다.리틀 엔디언 기계라면 다른 마스크가 필요할 거야

#실패하다 <altivec>h> 유형화된 __개요 서명되어 있지 않다  uint8x16_p; 유형화된 __개요 서명되어 있지 않다  인트 uint32x4_p; ...  /* 벡터가 두 개의 64비트 이중 워드를 보유하고 있는 것처럼 a+b를 수행합니다. */ uint32x4_p 추가 64(컨스턴트 uint32x4_p a, 컨스턴트 uint32x4_p b) {     컨스턴트 uint8x16_p 마스크 = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};     컨스턴트 uint32x4_p  = {0, 0, 0, 0};      uint32x4_p 사이 = vec_addc(vec1, vec2);     사이 = vec_filename(vec_module)(사이, , 마스크);     돌아가다 vec_add(vec_add(vec1, vec2), 사이); }  /* 벡터가 두 개의 64비트 이중 워드를 보유하고 있는 것처럼 a-b를 수행합니다. */ uint32x4_p 서브64(컨스턴트 uint32x4_p a, 컨스턴트 uint32x4_p b) {     컨스턴트 uint8x16_p 마스크 = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};     컨스턴트 uint32x4_p amask = {1, 1, 1, 1};     컨스턴트 uint32x4_p  = {0, 0, 0, 0};      uint32x4_p bw = vec_subc(vec1, vec2);     bw = vec_andc(amask, bw);     bw = vec_filename(vec_module)(bw, , 마스크);     돌아가다 vec_sub(vec_sub(vec1, vec2), bw); } 

Power8에 탑재된 Power ISA 2.07은 64비트의 더블워드를 실현했습니다.Power8을 사용하는 개발자는 다음 작업만 수행하면 됩니다.

#실패하다 <altivec>h> 유형화된 __개요 서명되어 있지 않다   uint64x2_p; ...  /* 네이티브 벡터 64비트 이중 워드를 사용하여 a+b 수행 */ uint64x2_p 추가 64(컨스턴트 uint64x2_p a, 컨스턴트 uint64x2_p b) {     돌아가다 vec_add(a, b); }  /* 네이티브 벡터 64비트 이중 워드를 사용하여 a-b 수행 */ uint64x2_p 서브64(컨스턴트 uint64x2_p a, 컨스턴트 uint64x2_p b) {     돌아가다 vec_sub(a, b); } 

실장

다음 프로세서에는 AltiVec, VMX 또는 VMX128이 포함되어 있습니다.

모토로라/프리스케일

IBM

P.A. Semi

소프트웨어 응용 프로그램

다음 소프트웨어 애플리케이션은 AltiVec 또는 VMX 하드웨어 가속을 활용하는 것으로 알려져 있습니다.

  • Helios에는 [7]VMX를 지원하는 기본 POWER9/POWER10 포트가 있습니다.

레퍼런스

  1. ^ a b "Power ISA v.2.03" (PDF). Power.org.[영구 데드링크]
  2. ^ "The Microsoft Xbox 360 CPU story". IBM. October 2015. Archived from the original on 2008-01-20.{{cite web}}: CS1 maint: bot: 원래 URL 상태를 알 수 없습니다(링크).
  3. ^ 비디오 게임슈퍼컴퓨터에서 데이터 병렬 SIMD 아키텍처 사용 IBM Research
  4. ^ 비연속 레지스터 파일 지정자를 사용한 명령 집합 아키텍처 구현 Wayback Machine 미국 특허 7,421,566에 보관된 2022-01-25
  5. ^ "Workload acceleration with the IBM POWER vector-scalar architecture". IBM. 2016-03-01. Archived from the original on 2022-01-25. Retrieved 2017-05-02.
  6. ^ "Peter Bergner - [PATCH, COMMITTED] Add full Power ISA 3.0 / POWER9 binutils support". Archived from the original on 2016-03-07. Retrieved 2016-12-24.
  7. ^ "FAQ, Helios". Helios. Retrieved 2021-07-09.

외부 링크