Должен ли я запускать один параллельный сценарий C из Python или параллельный набор последовательных сценариев C? - PullRequest
1 голос
/ 16 июня 2020

Обзор

Я работаю над переписыванием и оптимизацией набора сценариев MATLAB для вычислительно-ресурсоемкого научного c вычислительного приложения в набор Python сценариев с ядрами, написанными на C (запустить с использованием ctypes). Обертка Python необходима для упрощения приложения и настройки конечного пользователя. Мое текущее оборудование - это 12-ядерный Ryzen 7 3700X с 64 ГБ оперативной памяти, но он также предназначен для работы на гораздо более крупных кластерах с более низкой тактовой частотой.

Ввод / вывод

Раздел кода, который касается этого вопроса, хорошо распараллеливается. На входе будет что-то вроде 100-200 наборов (последовательно упорядоченных в рабочей памяти) нескольких миллионов равномерно организованных плавающих объектов (вы можете представить их как 100-200 черно-белых изображений с довольно высоким разрешением, все с одинаковыми пропорциями и аналогичная структура). Каждый такой «набор» может обрабатываться независимо и непрерывно на протяжении большей части процесса. На них выполняется много вычислительных (и, возможно, требующих использования памяти) вычислений - некоторые из них подходят для реализации с использованием BLAS, а также более сложные передискретизация, интерполяция, фильтрация, обратная проекция и проекция и так далее. Реализация MATLAB, которую я использую в качестве основы, реализована с помощью Parfor l oop, вызывающего несколько подпрограмм и с использованием некоторых функций MEX, написанных на C. На выходе каждой итерации снова будет несколько миллионов чисел с плавающей запятой. Если я правильно помню (запуск пробной версии скриптов realisti c на данный момент очень беспорядок - еще одна вещь, которую я должен исправить - поэтому я не могу легко проверить), вычисления могут быть достаточно интенсивными, чтобы каждая итерация l oop может занять несколько минут.

Загадка

Мой наиболее вероятный курс действий будет заключаться в том, чтобы превратить весь этот участок кода в большое «ядро» написано в C. У меня уже есть его подфункции, написанные на смешанном C / Python, и у них уже слишком много Python накладных расходов по сравнению со временем, необходимым для фактических вычислений, поэтому я хочу заменить все это, а остальную часть всего этого легко распараллеливаемый код, с C. Таким образом, у меня есть два метода, которые я могу использовать для распараллеливания кода:

  1. У меня Python создание подпроцессов, каждый из которых запускает последовательный C код отдельно со своим разделом данных.
  2. У меня есть Python запуск одного процесса C, которому я передаю все данные, при этом процесс C использует OpenMP для создания подпроцессов для распараллеливания кода.

I Я знаком как с Python, так и с C многопроцессорностью, но я никогда не пробовал запускать многопроцессорные сценарии C через Python. Тогда мой вопрос: что из них предпочтительнее с точки зрения производительности , и есть ли какие-либо аспекты, которые я должен учитывать, которые я здесь не рассматривал?

Заранее спасибо!

...