Кривая ускорения графика в зависимости от количества потоков OpenMP - масштабируемость?
Я работаю над кодом C++, который использует потоки OpenMP. Я построил кривую ускорения в зависимости от количества потоков OpenMP и теоретической кривой (если код мог быть полностью распараллелен).
вот этот сюжет:
Исходя из этой картины, можем ли мы сказать, что этот код не масштабируемый (с точки зрения распараллеливания)? то есть код не в два раза быстрее с двумя потоками OpenMP, четыре быстрее с четырьмя потоками и т.д...?
Спасибо
1 ответ
Для кода, который едва достигает 2,5-кратного ускорения в 16 потоках, можно сказать, что он не масштабируется. Однако "не масштабируется" часто считается более сильным утверждением. Разница, насколько я понимаю, состоит в том, что "не масштабируется" обычно относится к конкретной реализации и не подразумевает неотъемлемую неспособность к масштабированию; другими словами, может быть, вы можете сделать его масштабным, если устранены узкие места. С другой стороны, "не масштабируется" обычно означает "вы не можете сделать его масштабируемым, по крайней мере, без изменения основного алгоритма". Принимая такое значение, нельзя сказать "проблема / код / алгоритм не масштабируем", только глядя на график.
Кроме того, не всегда разумно ожидать идеального масштабирования (2x с 2 потоками, 4x с 4 потоками и т. Д.). Кривая, которая "достаточно близка" к идеальному масштабированию, все же может рассматриваться как показывающая хорошую масштабируемость; и то, что означает "достаточно близко", может зависеть от ряда факторов. Может быть полезно говорить / думать о параллельной эффективности, а не о ускорении, когда речь идет о масштабируемости. Например, если параллельная эффективность равна 0,8 (или 80%) и не падает при увеличении количества потоков, это можно считать хорошей масштабируемостью. Кроме того, возможно, что некоторая программа хорошо масштабируется до определенного количества потоков, но остается плоской или даже падает, если добавляется больше ресурсов.