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