Статическая привязка к IPP увеличивает размер библиотеки до более чем 100 МБ?

У меня есть статическая библиотека, связанная с IPP 7.1 для 4 обращений к ippi_Mul. Проект собран в Visual Studio. Раньше это была динамическая ссылка, но оказалось, что в IPP 7.1 динамические библиотеки внутренне многопоточные, что для меня запрещено, поэтому я изменил ее на статическую ссылку на однопоточный IPP. Затем размер библиотеки увеличился с нескольких МБ до примерно 150 МБ.

Это нормально для такой ссылки? Как я уже сказал, я вызываю только одну функцию из IPP.

В последнем IPP 8.2 многопоточность устарела, поэтому обновление решит проблему. для меня. Однако я все еще заинтригован этим. Если я использую только одну функцию из библиотеки, не будет ли статическое связывание более правильным вариантом? И стоит ли ожидать такого раздувания размера lib?


person buzjwa    schedule 03.02.2015    source источник


Ответы (1)


Во-первых, необходимо уточнить модель вашего проекта. «Статическая библиотека» обычно не связана ни с одной из внешних библиотек. Статическая библиотека — это просто архив объектных модулей, если мы, конечно, говорим о .lib-файлах Windows.

Вы используете компоновщик только при создании исполняемого файла приложения (файл .exe) или динамической библиотеки (.dll).

Я могу предположить, что ваше решение имеет два проекта - один для статической библиотеки и проект по умолчанию для приложения. В этом случае привязка к динамической библиотеке IPP определенно минимизирует объем приложения, поскольку приложение не содержит кода функции IPP (только вызовы внешней функции из динамической библиотеки). Функции хранятся в файлах динамических библиотек, это сотни мегабайт.

Если вы хотите создать приложение со статическими библиотеками IPP и в то же время уменьшить размер исполняемого файла приложения, вам необходимо одновременно ограничить оптимизацию ЦП, включенную в ваше приложение.

Когда вы ничего особенного не делаете, просто используете статические библиотеки IPP в командной строке для компоновщика, объектный файл приложения линкуется со всеми вариантами функций, оптимизированными для разных архитектур ЦП (от SSE до AVX2).

Например, если вы включили функцию "ippSomeFunction" в свой исходный код, компоновщик добавит "ippSomeFunction_SSE" + "ippSomeFunction_SSE2" + ... + "ippSomeFunction_AVX2" в исполняемый файл приложения. Это увеличит размер приложения, но позволит выполнять ваше приложение на любом из процессоров Intel с максимальной оптимизацией для текущего процессора. Диспетчер включит наиболее подходящие для процессора варианты функций.

Если вы знаете целевую архитектуру ЦП, вы можете сделать компоновщик, чтобы добавить только необходимую оптимизацию функций. Прочтите документ "readme.htm" в каталоге установки IPP "/ipp/tools/ia32 (или, intel64) /staticlib".

В этом случае единственное изменение, которое вам нужно сделать для исходного кода, — это добавить файл «#include ipp_cpuletter.h» перед включением других файлов .h, связанных с IPP, например.

#include "ipp_p8.h"
// From now on only IPP functions for SSE4.2 CPU will be used
#include "ippi.h"
// The rest of code
person Sergey Khlystov    schedule 04.02.2015