2017-12-21 28 views
1

이 질문의 범위를 좁히기 위해 C/C++ 프로젝트 만 고려해 보겠습니다.새로운 명령어 세트 확장을 위해 최적화 된 코드의 하위 호환성

x86 아키텍처를위한 새로운 SIMD 명령어 세트 확장이 있습니다. 개발자가 혜택을 받으려면 개발자가 적절한 최적화 플래그를 사용하여 코드를 다시 컴파일해야하며 그에 따라 적절하게 수정해야합니다.

새로운 명령어 세트 확장이 비교적 자주 나오기 때문에 사용 가능한 명령어 세트 확장의 이점을 활용하면서 어떻게 역 호환성을 유지할 수 있는지는 명확하지 않습니다.

결과 응용 프로그램이 새로운 기관 세트 확장을 지원하지 않는 구형 CPU 모델과 호환되는 상태로 유지됩니까? 그렇다면 그러한 지원이 어떻게 구현되었는지 자세히 설명해 주시겠습니까?

+0

질문에서 왜 이런 식으로 하위 호환성을 고려하고 있습니까? 왜 소스 코드에 크로스 컴파일 할 수있는 이식 가능한 코드를 작성하는 것을 고려하지 않고 아키텍처의 하위 호환성과 관련이 있습니까? –

+1

* "새로운 명령 세트 확장이 상대적으로 자주 나오므로 ..."- 과장된 느낌입니다. 사실이라 할지라도 일반적으로 새로운 아키텍처를 지원하는 컴파일러의 다음 릴리스가 나올 때까지 기다립니다. 그리고이 새로운 컴파일러 (예 : Visual Studio, gcc)는 일반적으로 개발자가 특정 아키텍처를 지원하지 않고 특정 플래그를 전달하지 않고 이러한 코드를 생성하지 않습니다. – selbie

+0

좋은 예 : https://blogs.msdn.microsoft.com/vcblog/2014/02/28/avx2-support-in-visual-studio-c-compiler/ – selbie

답변

2

역사적으로 대부분 x86 명령어 세트는 이전 세트의 (사실상) 엄격한 수퍼 세트였습니다. 그러나 AVX-512 확장은 서로 호환되지 않는 몇 가지 변형이 있으므로 특별한주의가 필요합니다.

다행히도 컴파일러는 더욱 스마트하게됩니다. GCC는 __attribute__((simd))__attribute__((target_clones(...)))을 사용하여 주어진 함수의 개의 복수 구현을 자동으로 만들고 실제 CPU가 지원하는 것을 기반으로로드 할 때 가장 적합한 것을 선택하십시오. (구형 GCC 버전의 경우 수동으로 IFUNC를 사용해야하고 고대 일 안에 ld.so는 cmov과 같은 항목에 따라 라이브러리를 완전히 별도의 디렉토리에서로드합니다.

+1

공식 AVX-512가 아닌 1 세대 Xeon Phi (Knight 's Corner, KNC)의 512 비트 SIMD를 고려하지 않는 한 AVX-512에는 "상호 호환되지 않는"변종이 없습니다. 그것 자체의 일이고, 다른 CPU는 그것을 지원하지 않습니다. (AVX-512와 아주 가까운 거리에 있지만, 그렇지 않습니다.) AVX512에는 AVX-512F (foundation) 이상의 여러 * 호환 * 확장이 있습니다. [Wikipedia의 CPU with AVX-512] (https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX-512)를 참조하십시오. Xeon Phi는 하나의 확장 세트를 제공하며 주류 CPU는 다른 세트를 제공합니다. –

+0

일반적인 하위 집합은 AVX512F + AVX512CD뿐입니다. 모두 호환됩니다. 그것은 현재의 CPU가 그들 모두를 제공하지 않는다는 것입니다. 그러나 제온 파이에서 뭔가를 실행하려면 KNL에서 일반적으로 최적화 된 코드를 실행하는 대신, -march = knl을 사용하여 해당 타겟에 맞게 컴파일해야합니다. 역동적으로 파견하는 KNL을 완벽하게 처리하는 것에 대해 너무 걱정할 필요가없는 많은 것들, 단지 # ifdef's. –

+1

하지만 다른 모든 것들은 동적 인 링커 트릭,'ifunc' 또는 자신의'if (cpuid)'나 함수 포인터 설정을 작성하는 순수한 수동 디스패치를 ​​x264 비디오 인코더처럼 쓰게됩니다. 여러 세대의 CPU에서 원활하게 실행될 수있는 올바른 대답입니다. –

3

새 CPU 명령어는 새로운 하드웨어를 실행해야합니다. 해당 지침을 지원하지 않는 구형 CPU에서 실행하려고하면 프로그램이 잘못된 Opcode 오류로 중단됩니다. 경우에 따라 OSes가이 조건을 처리하지만 보통 그렇지 않습니다.

새 지침으로 실행하려면 하드웨어에서 지원되도록 요구하거나 (이점이 충분히 큰 경우) 런타임에 필요한 새 지침이 지원되는지 확인해야합니다. 그럴 경우 사용하는 코드 섹션을 실행합니다. 그렇지 않은 경우에는 사용하지 않는 다른 코드 섹션을 실행합니다.

일반적으로 "이전 버전과의 호환성"은 오래된 물건, 새로운 물건으로 실행되는 오래된 물건으로 실행되는 물건을 실행하는 새로운 버전을 말합니다.