2015-02-03 3 views
1

ippi_Mul을 4 번 호출 할 때 IPP 7.1에 연결된 정적 라이브러리가 있습니다. 프로젝트는 Visual Studio로 작성됩니다. 이것은 이전에 동적 인 링크 였지만, IPP 7.1에서 동적 라이브러리는 내부적으로 멀티 스레드로되어 있으며, 이는 허용되지 않습니다. 따라서이를 단일 스레드 IPP에 대한 정적 링크로 변경했습니다. lib의 크기는 몇 MB에서 약 150MB로 증가했습니다.IPP에 정적으로 연결하면 lib 크기가 100MB를 초과합니다.

이러한 링크는 정상입니까? 내가 말했듯이 IPP에서 하나의 함수 만 호출합니다.

최신 IPP 8.2 multi-threading is deprecated에서 업데이트하면 문제가 해결됩니다. 그러나 나는 아직도 이것에 흥미가있다. 라이브러리에서 하나의 함수 만 사용하는 경우 정적 링크가 더 정확한 옵션이 될 수 있습니까? 그리고 예상되는 lib 크기의 인플레이션인가?

답변

2

먼저 프로젝트 모델을 명확히해야합니다. "정적 라이브러리"는 대개 외부 라이브러리에 연결되지 않습니다. Static 라이브러리는 Windows의 .lib 파일에 대해서만 말하면 객체 모듈의 아카이브입니다.

응용 프로그램 실행 파일 (.exe 파일) 또는 동적 라이브러리 (.dll)를 생성 할 때만 링커를 사용합니다.

귀하의 솔루션에는 정적 라이브러리와 응용 프로그램의 기본 프로젝트라는 두 개의 프로젝트가 있다고 가정 할 수 있습니다. 동적 IPP 라이브러리에 연결하면 응용 프로그램에 IPP 기능 코드 (동적 라이브러리의 외부 함수 호출 만)가 없으므로 응용 프로그램 풋 프린트를 확실히 최소화 할 수 있습니다. 함수는 동적 라이브러리 파일에 저장되며 수백 MB가 있습니다.

정적 IPP 라이브러리로 응용 프로그램을 빌드하고 동시에 응용 프로그램 실행 파일 크기를 줄이려면 응용 프로그램에 포함 된 CPU 최적화를 동시에 제한해야합니다.

링커에 명령 줄에서 정적 IPP 라이브러리 만 사용하면 응용 프로그램 개체 파일이 다른 CPU 아키텍처 (SSE에서 AVX2)에 맞게 최적화 된 모든 함수 변형과 연결됩니다.

예를 들어 "ippSomeFunction"함수를 소스 코드에 포함 시키면 링커에서 "ippSomeFunction_SSE"+ "ippSomeFunction_SSE2"+ ... + "ippSomeFunction_AVX2"를 응용 프로그램 실행 파일에 추가합니다. 이렇게하면 응용 프로그램 크기가 늘어나지 만 현재 CPU에 대한 최적화가 가장 많은 Intel CPU에서 응용 프로그램을 실행할 수 있습니다. 디스패처는 CPU에 가장 적합한 함수 변형을 켭니다.

대상 CPU 아키텍처를 알고있는 경우 링커에서 필요한 기능 만 최적화하도록 추가 할 수 있습니다. IPP 설치 디렉토리에 "readme.htm"문서를 읽으십시오. /ipp/tools/ia32 (또는 intel64)/staticlib ".

이 경우 소스 코드에서 수행해야 할 유일한 변경 사항은 "#include ipp_ cpuletter .h"파일을 다른 IPP 관련 .h 파일 (예 :

#include "ipp_p8.h" 
// From now on only IPP functions for SSE4.2 CPU will be used 
#include "ippi.h" 
// The rest of code 
관련 문제