Что означает статическое, динамическое и одиночное динамическое связывание?

9

Я использую Intel MKL для BLAS и использую Intel MKL Link Line Advisor для помощи с параметрами командной строки.

Советник предоставляет опции для Статической, Динамической и Единой Динамической Библиотеки. Что означают эти термины?

На SO было много сообщений об этом, но все они были сосредоточены на разработке программного обеспечения, а не научных / математических кодов. ( Этот был особенно полезен)

  • Как эти термины относятся к параллельным вычислениям?
  • Один "лучше", чем другой? (Я знаю, что лучше бы определить более точно, но я не знаю, как на данный момент)
  • Что используется чаще и почему?
  • Что нужно учитывать программисту при компоновке?
расследование
источник
В качестве примечания, если вы еще не видели этого, более новые компиляторы Intel (я думаю, что версия 11 и новее) предоставляют -mklфлаг, который должен устранить необходимость использовать советник по линии связи в большинстве случаев.
Aesin
@ Aesin, мне было интересно. Это самый оптимальный способ связывания?
Следствие
К сожалению, я не знаю - я не проводил никаких тестов, и в руководстве нет подробностей о том, что он делает или как он сочетается с другими вариантами. Он статически связывает MKL, если вы указываете, -staticи динамически связывает его, если вы этого не делаете. В любом случае, это намного лучше с точки зрения простоты использования.
Aesin

Ответы:

14

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

Трудно сделать общие заявления о том, лучше ли статические или динамические библиотеки в высокопроизводительных вычислениях. Конечно, для большинства суперкомпьютерных приложений проще и предпочтительнее статически связывать. Почему это? В суперкомпьютерах текущего поколения обычно выполняется только одно задание на узел, что существенно снижает любые выгоды от уменьшения потребления памяти благодаря общим библиотекам. Кроме того, научные вычислительные коды, как правило, не являются слишком сложными с точки зрения языковых функций или дизайна программы, и они редко используют языковые функции, которые требуют динамической загрузки (например, модули плагинов). Динамические библиотеки имеют дополнительную трудность, поскольку они гораздо менее переносимы между операционными системами, чем статические библиотеки.

Как следствие всего этого, большинство систем HPC используют статическую компиляцию, когда она доступна. Статические библиотеки рассматриваются как более быстрые, простые в установке и обслуживании и, как правило, более надежные. Коды HPC, основанные на Python, являются одним из исключений, но они все еще подвержены проблемам с производительностью, связанным с динамической загрузкой (несколько пользователей scicomp фактически работают над этой проблемой прямо сейчас!).

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

Единая динамическая библиотека - это термин, специфичный для Intel. Это относится к упаковке их динамических библиотек в единую метабиблиотеку для упрощения процесса компоновки. Если вы будете использовать динамическое связывание с библиотеками Intel, эта форма, вероятно, предпочтительнее, если вы не делаете что-то сложное.

Арон Ахмадия
источник
Отличный ответ! Еще одна вещь: я понимаю, что динамическое связывание будет ненужным, и выбор будет между статической и одиночной динамикой. Вы говорите, что я должен выбрать последнее, если я не делаю что-то сложное (чем я не являюсь). Итак, я должен ссылаться с помощью Single Dynamic? [FWiW, я работаю над методами подпространства Крылова]
Inquest
Сожалею! Я имел в виду, что вы должны использовать статические по умолчанию, но предпочитаете одну динамическую над динамической.
Арон Ахмадиа
Я провел некоторый бенчмаркинг и обнаружил: Dynamic : 0:42.92 Static : 0:42.93 Single Dynamic : 0:42.97усреднил более 1000 значений.
Следствие
1
Стоит отметить, что в некоторых системах HPC вы должны статически связываться - в системах BlueGene / L это имеет место, например, потому что сокращенная ОС на вычислительных узлах не поддерживает динамическое связывание.
Aesin
1
Меня немного смущает ваше заявление: «В суперкомпьютерах нынешнего поколения обычно выполняется только одно задание на узел, что существенно снижает любые выгоды от снижения потребления памяти благодаря общим библиотекам». Вы хотели сказать, что на каждый узел существует только один процесс? Я не уверен, как одна работа на узел влияет на ситуацию. При статическом связывании каждый процесс будет хранить полную копию исполняемого файла, что может быть значительным при увеличении числа ядер на процессор. Для динамического связывания потребуется только одна копия динамической библиотеки на общее пространство памяти.
Andybauer