나는 방금 저수준 언어에 대해 조금 배웠고 gcc가 -march 및 -mtune 매개변수를 지정하여 특정 CPU 제품군에 맞게 소프트웨어를 최적화할 수 있다는 것을 알았습니다.
그런데 이런 말을 하는 사람도 있었어요소스에서 프로그램을 빌드하는 것은 바이너리를 다운로드하는 것보다 훨씬 빠르지 않습니다.. 시스템의 CPU에 최적화될 수 있는 소프트웨어는 확실히 속도를 크게 향상시킬 것입니다. 특히 ffmpeg
AVX와 같이 마이크로아키텍처에 상당히 의존적인 기능을 사용하는 소프트웨어의 경우 더욱 그렇습니다.
내가 알고 싶은 것은 패키지 관리자의 바이너리가 어떻게든 여러 마이크로아키텍처에 최적화되어 있는지입니다. 패키지 관리자가 내 시스템의 마이크로아키텍처와 관련된 바이너리를 다운로드합니까?
답변1
분포는 미리 결정된 기준선에 따라 구축됩니다(참조:데비안의 아키텍처 기준선예를 들어). 따라서 Debian에서 amd64
패키지는 SSE2가 있는 범용 x86-64 CPU를 대상으로 하지만 SSE3 이상이 아닌 i386
MMX 또는 SSE가 없는 범용 i686 CPU를 대상으로 합니다. 일반적으로 컴파일러 기본값이 사용되므로 컴파일러 자체가 발전함에 따라 조정도 발전할 수 있습니다.
하지만CPU별 최적화가 상당한 이점을 제공하는 패키지를 구축하여 최신 CPU를 활용할 수 있습니다. 이는 컴파일러 최적화에 의존하는 대신 여러 구현을 제공하고 런타임에 구현 중에서 선택함으로써 수행됩니다. 패키지된 소프트웨어는 실행 중인 CPU를 감지하고 이를 활용하기 위해 사용하는 코드 경로를 조정합니다(예: 참조 ffmpeg
) libswscale/x86/swscale.c
. 일부 아키텍처에서는ld.so
자체적으로 도움이 됩니다. 가능한 경우 최적화된 라이브러리를 자동으로 로드합니다.예를 들어i386
SSE 지원 CPU에서 실행되는 아키텍처 시스템에서.
대부분의 패키지 관리자는 이 모든 것을 인식하지 못하고 특정 아키텍처에 대한 패키지를 다운로드하고 시스템을 실행하는 CPU에 관계없이 설치합니다.