Параллелизм на двухъядерной процессорной системе - PullRequest
1 голос
/ 22 декабря 2010

Я написал программу на Java, которая рисует изображение Мандельброта . Чтобы было интересно, я разделил цикл for, который вычисляет цвет каждого пикселя, на две половины; каждая половина будет выполнена как поток, таким образом распараллеливая задачу. В двухъядерной системе с одним процессором производительность при использовании двухпоточного подхода по сравнению с одним основным потоком почти в два раза выше. Мой вопрос касается двухъядерной процессорной системы. Будет ли распараллеливаемая задача распределяться между разными процессорами вместо того, чтобы просто использовать два ядра на одном процессоре? Я полагаю, что первый сценарий будет медленнее, чем второй, просто потому, что задержка обмена данными между двумя процессорами по проводам материнской платы.

Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Какой процессор (или ядро), на котором запущен поток, зависит от операционной системы. Я не думаю, что ОС обычно проводит какое-либо существенное различие между многоядерными или многоядерными системами, поэтому программы в одной процессорной системе с 4 ядрами планируются так же, как и системы с 2 двухъядерными процессорами.

Как правило, мой опыт показывает, что потоки будут более или менее равномерно распределены по всем доступным процессорам. Таким образом, если бы вы смотрели график CPU вашей программы, работающей в системе с 4 ядрами, вы бы увидели примерно 25% загрузки на каждом ядре. Вы можете установить привязку потоков к определенному ЦП / ядру в большинстве операционных систем, но я не уверен, что эта функциональность доступна в Java.

1 голос
/ 22 декабря 2010

Если я правильно понимаю ваше описание, у вас есть только 2 темы. Невозможно использовать 4 ядра одновременно с 2 потоками. В идеале вам нужно как минимум столько потоков, сколько имеется ядер в системе. При неравномерном распределении затрат в наборе Мандельброта (вычисления для точек в наборе обходятся дороже, чем за пределами набора), оптимальное количество потоков может быть выше (я бы попробовал 4 × количество ядер).

Я разделил цикл for, который вычисляет цвет каждого пикселя на 2 половины

Я не уверен, что вы имеете в виду здесь, но вам, вероятно, следует разделить самый внешний цикл (который проходит через координаты Y) между потоками. Это уменьшит вероятность того, что два или более ЦП будут бороться за одну и ту же строку кэша (при условии, что изображение отображается в порядке основной строки).


Примечание: Runtime.getRuntime().availableProcessors скажет вам, сколько ядер у системы.

...