КАРТА САЙТА
Sibnet.ru
Sibnet.ru

Sibnet.ru — это информационно-развлекательный интернет-проект, ориентированный на широкий круг Сибирского региона.
По данным Rambler Top100, Sibnet.ru является самым популярным порталом в Сибири.

Контакты:
АО "Ринет"
ОГРН 1025402475856
г. Новосибирск, ул. Якушева, д. 37, 3 этаж
отдел рекламы:
(383) 347-10-50, 347-06-78, 347-22-11, 347-03-97

Редакция: (383) 347-86-84

Техподдержка:
help.sibnet.ru
Авторизируйтесь,
чтобы продолжить
Некоторые функции доступны только зарегистрированным пользователям
Неправильный логин или пароль

Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!

Здравствуйте, гость ( Вход | Регистрация )



 
Ответить в эту темуОткрыть новую тему
> Параллельное программирование, на java
BloodSeeker
сообщение 18.12.2013, 0:33
Сообщение #1


Товарищ
Group Icon


Группа: Sibnet-club
Сообщений: 863
Регистрация: 22.6.2007
Из: Санкт-Петербург
Пользователь №: 485



Репутация:   49  


Ребят, я в java - полный профан, если честно. В шарпе и плюсах норм все вроде, разобрался со стандартными вещами + open mp. Помогите, как распараллелить САМЫЙ простой цикл в java?
Что-нибудь наподобие
Код

for (int i = 0; i < a.length; i++)
                for (int j = 0; j < x.length; j++)
                    xk[i] += a[i][j] * x[j];


Начал про Threads что-то читать, но до конца не вкупил - то ли не там читал, то ли еще что. Но насколько я понял, для каждого распараллеливаемого цикла надо несколько классов писать (для каждого диапазона рассматриваемых значений), и потом создавать объект thread этих классов и запускать их. А у меня в проге много циклов, каждый разбивать и переписывать вручную запаришься...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
BloodSeeker
сообщение 18.12.2013, 2:07
Сообщение #2


Товарищ
Group Icon


Группа: Sibnet-club
Сообщений: 863
Регистрация: 22.6.2007
Из: Санкт-Петербург
Пользователь №: 485



Репутация:   49  


Нашел еще в интернете статью по Executor. Покопался, вроде немного разобрался, что да с чем, но, видимо, не полностью. Все испортила какая-то неведомая ошибка:
Цитата

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task main.Main$Task@566dab9b rejected from java.util.concurrent.ThreadPoolExecutor@3a1d7971[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 100000]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
at main.Main.calcProperNumber1(Main.java:71)
at main.Main.main(Main.java:30)

В таком коде:
» Спойлер (нажмите, чтобы прочесть) «

Может, кто сталкивался?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 18.12.2013, 3:20
Сообщение #3


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



100000 не многовато ли? Особенно в задаче, где на IO ничего не завязано?

Переводчик из меня плохой, поэтому я лишь выделю наиболее интересное место в цитате.
http://docs.oracle.com/javase/7/docs/api/j...olExecutor.html
Цитата

New tasks submitted in method execute(java.lang.Runnable) will be rejected when the Executor has been shut down, and also when the Executor uses finite bounds for both maximum threads and work queue capacity, and is saturated. In either case, the execute method invokes the RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) method of its RejectedExecutionHandler.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 18.12.2013, 3:58
Сообщение #4


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



А еще, создание нити может быть не дешевой операцией (зависит от ОС и реализации в ЯП). Лучше не создавать нить на каждые «2×2», а обрабатывать в одной ните несколько заданий так, чтобы она проработала значительно больше времени, чем требуется на её создание и «уничтожение».
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
BloodSeeker
сообщение 18.12.2013, 8:55
Сообщение #5


Товарищ
Group Icon


Группа: Sibnet-club
Сообщений: 863
Регистрация: 22.6.2007
Из: Санкт-Петербург
Пользователь №: 485



Репутация:   49  


Цитата(mephisto @ 18.12.2013, 2:20) *

100000 не многовато ли? Особенно в задаче, где на IO ничего не завязано?

Переводчик из меня плохой, поэтому я лишь выделю наиболее интересное место в цитате.
http://docs.oracle.com/javase/7/docs/api/j...olExecutor.html


Уменьшил до 4, потом до 2, ошибка не изменилась =(
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 19.12.2013, 4:36
Сообщение #6


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



Ну значит самая заметная ошибка оказалась не единственной.

Убери из кода странные вещи, вроде массива threads, от которого используется только length. Почитай статью по теме. Если не поможет — пости весь код.

Есть подозрение, что должно быть по экземпляру ThreadPoolExecutor на тред, ограничусь предположением, лезти в документацию в такое время лень.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 10.7.2025, 18:48
Редакция: (383) 347-86-84

Техподдержка:
help.sibnet.ru
Размещение рекламы:
тел: (383) 347-06-78, 347-10-50

Правила использования материалов