DLL에서 CPU 특정 기능을 사용하기위한 표준 기술은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/131128

  •  02-07-2019
  •  | 
  •  

문제

짧은 버전 : DLL 내에서 CPU 특정 지침을 활용하는 것이 가능한지 궁금합니다.

약간 긴 버전 : (32 비트) DLL을 다운로드 할 때 Microsoft는 하나의 크기가 모든 프로세서에 적합한 것으로 보입니다.

이것은 그들이 가장 낮은 공통 분모 (즉, OS가 지원하는 최소 플랫폼)를 위해 엄격하게 제작되었음을 의미합니까? 아니면 DLL 내에서 단일 인터페이스를 내보내는 데 사용되지만 최적의 성능을 얻기 위해 CPU 특정 코드를 사용하는 데 사용되는 기술이 있습니까? 그렇다면 어떻게 이루어 집니까?

도움이 되었습니까?

해결책

나는 아무것도 모른다 기준 기술이지만 그런 일을해야한다면 DLLMAIN () 함수에 코드를 작성하여 CPU 유형을 감지하고 기능 포인터가있는 점프 테이블을 각 함수의 CPU 최적화 버전으로 채 웁니다.

CPU 유형을 알 수없는 경우 가장 낮은 공통 분모 기능이 필요합니다.

레지스트리에서 현재 CPU 정보를 확인할 수 있습니다.

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor

다른 팁

DLL은 모든 컴퓨터 Win32 실행에 대해 작동 할 것으로 예상되므로 일반적으로 I386 명령어가 있습니다. 특정 명령 세트에 대한 기능/코드를 노출시키는 공식적인 방법은 없습니다. 손으로 그리고 투명하게해야합니다.

기본적으로 사용되는 기술은 다음과 같습니다 .- 런타임의 MMX, SSE와 같은 CPU 기능을 결정하십시오. 존재하는 경우, 그렇지 않은 경우 폴백 코드를 준비하십시오.

컴파일러가 i386 이외의 다른 것에 대해 최적화 할 수 없으므로 인라인 어셈블러에 특정 명령 세트를 사용하여 코드를 작성해야합니다. 이를위한 고 언어 툴킷이 있는지 모르겠습니다. CPU 기능을 결정하는 것은 간단하지만 어셈블러에서도 수행해야 할 수도 있습니다.

SSE/SSE2 최적화를 얻는 쉬운 방법은 /arch MSVC에 대한 논쟁. 나는 폴백에 대해 걱정하지 않을 것입니다. 틈새 응용 프로그램이 없다면 아래의 어떤 것도 지원할 이유가 없습니다.

http://msdn.microsoft.com/en-us/library/7t5yh4fd.aspx

나는 GCC/G ++가 동등한 플래그를 가지고 있다고 생각합니다.

인텔의 ICC는 다른 아키텍처를 위해 코드를 두 번 컴파일 할 수 있습니다. 그렇게하면 케이크를 먹고 먹을 수 있습니다. (좋아요, 두 개의 케이크를 얻습니다 - DLL이 더 커집니다). 그리고 MSVC2005조차도 매우 구체적인 경우에이를 수행 할 수 있습니다 (예 : Memcpy ()는 SSE4를 사용할 수 있습니다)

다른 버전간에 전환하는 방법에는 여러 가지가 있습니다. 로딩 프로세스에는 기능이 필요하기 때문에 DLL이로드됩니다. 함수 이름은 주소로 변환됩니다. 한 가지 해결책은이 조회가 기능 이름뿐만 아니라 프로세서 기능에 의존하는 것입니다. 다른 방법은 기능을 다루기위한 이름이 임시 단계에서 포인터 테이블을 사용한다는 사실을 사용합니다. 전체 테이블을 전환 할 수 있습니다. 또는 중요한 기능 내부에 분기가있을 수도 있습니다. 따라서 foo ()는 더 빠르면 foo__sse4를 호출합니다.

Microsoft에서 다운로드 한 DLLS는 모든 수많은 기계에서 작동 해야하는 간단한 이유 때문에 일반 X86 아키텍처를 대상으로합니다.

Visual Studio 6.0 Time Frame (변경되었는지 모르겠습니다)까지 Microsoft는 속도가 아닌 크기에 대해 DLL을 최적화하는 데 사용했습니다. 이는 DLL의 전체 크기 감소가 컴파일러가 생성 할 수있는 다른 최적화보다 더 높은 성능 향상을 주었기 때문입니다. 이는 마이크로 최적화의 속도 업이 CPU가 메모리를 기다리지 않는 속도 업에 비해 결정적으로 낮아지기 때문입니다. 속도의 진정한 개선은 I/O를 줄이거 나 기본 알고리즘을 개선함으로써 발생합니다.

프로그램의 핵심에서 실행되는 몇 가지 중요한 루프만이 소수의 횟수로 인해 마이크로 최적화의 혜택을 누릴 수 있습니다. 코드의 약 5-10% 만이이 범주에 속할 수 있습니다. 이러한 임계 루프는 이미 Microsoft 소프트웨어 엔지니어에 의해 어셈블러에서 이미 어느 수준까지 최적화 될 것이며 컴파일러가 찾을 수 없다는 것을 확신 할 수 있습니다. (나는 그것이 너무 많이 기대하고 있다는 것을 알고 있지만 그들이 이것을하기를 바랍니다)

보시다시피,이 코드의 대부분이 거의 사용되지 않을 때 다른 아키텍처에 대해 조정 된 추가 버전의 코드가 포함 된 추가 버전의 코드가 포함 된 증가 된 DLL 코드의 단점 만 있습니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top