проблема параллелизации Java - распараллеливание так же медленно, как сериализация - PullRequest
0 голосов
/ 05 июля 2011

Я занимаюсь разработкой индивидуальной базовой модели. Все, что вам нужно знать, это то, что люди рождаются, размножаются и умирают. У меня есть графический интерфейс, в котором я вижу, как происходят эти процессы.

У меня есть Mac Pro, с 8 ядрами и 16 ГБ оперативной памяти.

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

Когда основной метод запущен, он вызывает конструктор основного класса - который создает другие объекты, и начинается симуляция. Следовательно, чтобы распараллелить, я создал фиксированный пул потоков, который по отдельности вызывал бы конструктор основного класса и несколько (ну, 8, количество ядер) симуляций.

НО - он работает так же медленно, как если бы я запускал симуляции в сериале. Анимация в графическом интерфейсе для каждого моделирования обновляется по порядку, а не одновременно.

На самом деле, если я запустил программу 8 раз одновременно из командной строки (и поместил в фоновом режиме с '&'), это намного быстрее и ведет себя гораздо больше, чем я надеялся. Что раздражает!

В начале моделирования выполняются некоторые операции ввода-вывода для считывания данных о людях, но только в начале.

Интересно, что первые объекты, создаваемые "параллельными" процессами, были созданы по тем же адресам памяти - но я не думаю, что это проблема.

Если у кого-то есть понимание этой нехватки производительности из инструментов параллелизма java, почему программа, по-видимому, работает в последовательном режиме и почему простой запуск основного метода из командной строки 8 раз лучше, чем попытка распараллелить, что было бы самый полезный.

Потому что, честно говоря, я теряю веру в возможности параллелизации Java.

Приветствия

Джеймс

        noOfProcessors = (byte)Runtime.getRuntime().availableProcessors();
        ExecutorService eservice = Executors.newFixedThreadPool( noOfProcessors );

        List<Future> futuresList = new ArrayList<Future>();

        for( int i = 0; i < noOfProcessors; i++ ){
            futuresList.add( eservice.submit( new simulation() ) );

        }//end for

        for( Future future : futuresList ){

            try{

                future.get();

            }catch( InterruptedException ex ){
                Logger.getLogger( simPanel.class.getName() ).log( Level.SEVERE, null, ex );
                System.exit( 1 );
            }catch( ExecutionException ex ){
                Logger.getLogger( simPanel.class.getName() ).log( Level.SEVERE, null, ex );
                System.exit( 1 );
            }//end try-catch

        }//end for loop

1 Ответ

0 голосов
/ 06 июля 2011

Несмотря на то, что последовательное поведение Java не слишком знакомо с классом Java Executors, это указывает на то, что в вашем пуле потоков запущены все потоки на одном процессоре.Возможно, это как-то связано с тем, как JVM обрабатывает потоки?В любом случае, посмотрите, можете ли вы создавать отдельные процессы в Java, и посмотрите, имеет ли это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...