Я немного опоздал, но вот ответы:
1) увеличение на 150% -> как минимум 2 ядра требуется, как указано dbasnett
;
2) Увеличение на 200% -> Требуется минимум 4 ядра на основе закона Амахльда:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B90%7D%7B%2890%20-%20P%29%20%2B%20%5Cfrac%7BP%7D%7BN%7D%7D)
Здесь для выполнения расчета требуется всего 90 минут. P - фактически улучшенная часть алгоритма (распараллеливаемая часть), которая равна 2/3 из 90, N - это количество ядер, поэтому, когда есть только ядро:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B90%7D%7B(90%20-%20P)%20%2B%20%5Cfrac%7BP%7D%7BN%7D%7D%20%3D%20%5Cfrac%7B90%7D%7B(90%20-%2060)%20%2B%20%5Cfrac%7B60%7D%7B1%7D%7D%20=%5Cfrac%7B90%7D%7B(90%20-%2060)%20%2B%20%5Cfrac%7B60%7D%7B1%7D%7D%20%3D%20%5Cfrac%7B90%7D%7B30%20%2B%2060%7D=1)
Вы получаете 1, что означает 100%, то есть алгоритм работает стандартным образом (без многоядерного ускорения и, следовательно, без ускорения распараллеливания).
Теперь мы должны найти N ядер, для которых предыдущее уравнение равно 2, где 2 означает, что алгоритм работает в половину времени (45 минут вместо 90, когда нет распараллеливания) и, следовательно, с ускорением на 200%:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B90%7D%7B30%20%2B%20%5Cfrac%7B60%7D%7BN%7D%7D=2)
С:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%7B30%20%2B%20%5Cfrac%7B60%7D%7BN%7D%7D=45)
Мы видим, что:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%7B30%20%2B%20%5Cfrac%7B60%7D%7BN%7D%7D=45)
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B60%7D%7BN%7D%20%3D%2045%20-%2030)
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B60%7D%7BN%7D%20%3D%2015)
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=N=4)
Таким образом, с 4 ядрами, вычисляющими параллельно 2/3 алгоритма, вы получаете ускорение на 200%. То же самое касается 150%, вы получите 2, как вам уже сказал dbasnett
1045 *
Довольно просто.
Обратите внимание, что сложный алгоритм может подразумевать дальнейшее деление его распараллеливаемых частей (и теоретически вы можете иметь разное количество блоков обработки для распараллеливаемой части одновременно):
Вы можете дополнительно взглянуть на Википедию (есть также пример):
http://en.wikipedia.org/wiki/Amdahl%27s_law#Description
Во всяком случае, принцип тот же:
Пусть T - время, которое алгоритм должен выполнить для завершения, A - его последовательная часть, B - его распараллеливаемая часть, а N - количество параллельных процессоров, Вы можете разделить B на дальнейшие небольшие секции и выполнить вычисления для каждой части:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7BT%7D%7BA%20%2B%20%5Cfrac%7BB%7D%7BN%7D%7D%20%3D%20%5Cfrac%7BT%7D%7BA%20%2B%20%5Cfrac%7BC%20%2B%20D%20%2B%20E%20%2B%20F%20%2B%20G%20%2B%20H%20%2B%20...%20%7D%7BN%7D%7D)
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7BB%7D%7BN%7D%20%3D%20%5Cfrac%7BC%20%2B%20D%20%2B%20E%20%2B%20F%20%2B%20G%20%2B%20H%20%2B%20...%20%7D%7BN%7D)
Вы можете для C, D, G, например. принять M процессоров вместо N (ускорение, конечно, будет отличаться, если M! = N).
И, наконец, вы достигнете точки, когда больше процессоров больше не имеет значения, поскольку:
![foo+bar](https://chart.googleapis.com/chart?cht=tx&chl=%5Clim_%7BN%20%5Crightarrow%20%5Cinfty%7D%20%5Cfrac%7BT%7D%7BA%20%2B%20%5Cfrac%7BB%7D%7BN%7D%7D%20%3D%20%5Cfrac%7BT%7D%7BA%7D)
А ускорение вашего алгоритма будет максимально увеличивать общее время выполнения (T), деленное на время выполнения только последовательной части (A).
Поэтому параллельное вычисление очень удобно, только если у вас мало времени выполнения для последовательной части вашего алгоритма.