Таким образом, вы работаете примерно на половину быстрее, чем вы надеялись, при масштабировании до 29 параллельных копий кода?
Пропускная способность памяти может быть проблемой, при этом 29 копий одного и того же алгоритма считывают и записывают собственную память одновременно. Вот почему в таком случае потенциально лучше (но гораздо сложнее) искать параллелизм в рамках одной итерации.
Давайте используем кодирование видео как конкретный пример того, что может быть «одна итерация». Например, кодирование 29 видео параллельно аналогично тому, что предлагает OP. Имея x264, используйте 32 ядра для кодирования одного видео, а затем повторяя, что для следующих 28 vids использует намного меньше полной ОЗУ и лучше кэширует.
На практике, возможно, 2 или 3 видео в параллель, каждый из которых использует от 10 до 16 потоков, был бы хорош, так как существует ограничение на то, сколько параллелизма может найти x264.
Это зависит от алгоритма, и насколько он масштабируется с несколькими потоками. Если это совсем не так, или у вас нет времени, чтобы закодировать его, тогда грубая сила полностью. Фактор более 10 ускорений - это ничто, чтобы чихать в основном без усилий. (например, запуск однопоточной программы на разных наборах данных с помощью make -j29
или GNU parallel
или в вашем случае с использованием нескольких потоков в одной программе. :)
Пока ваш код работает, вы можете проверить использование ЦП, чтобы сделать убедитесь, что вы держите 29 ядер процессора занятыми, как вы пытаетесь. Вы также можете использовать инструмент профилирования (например, Linux perf
) для исследования эффектов кеша. Если параллельный запуск имеет намного больше, чем в 29 раз меньше промахов кэша данных однопоточного запуска, это начнет объяснять вещи.
Сколько ядер у вас на вашем вычислительном узле? Сколько процессоров вы запрашиваете при запуске?Каково время выполнения последовательной части вашего кода? – innoSPG
Runtime последовательной части пренебрежимо мало, это просто простая обработка POST. – Boki
На каждый узел HPC имеется 32 ядра. Я проверил цикл с 29 итерациями на 29 ядрах, поэтому одна итерация на ядро. – Boki