MatLab: Parallel Computing Toolbox
Feb. 28th, 2014 05:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Пытаюсь закрутить нашу программу чуть побыстрее. Взяли потестировать PCT, который, теоретически, с минимальными исправлениями кода позволяет раскидывать расчёты на разные процессоры, а то и компы. Например, говорят, если у вас есть цикл for, все итерации которого совершено независимы, то вы можете просто заменить ключевое слово for на parfor, и PCT сам разберётся, какую итерацию на какой процессор посылать, как собрать потом результаты и т.п.
Начал тестировать. Вот есть у меня некая процедура doSomeWork(), которая читает какой-то файл с диска, что-то там считает и пишет результат на диск же. Время её работы засёк — 664 секунды. Написал цикл из одной итерации:
for i = 1 : 1
doSomeWork();
end
Проверил, всё ещё 664 секунды.
Запустил PCT, поменял for на parfor — 734 секунды.
Ненормально. Попытался понять, что происходит. MatLab при запуске PCT создаёт дополнительные процессы MatLab, то есть в моём случае крутилось два процесса: один — тот, что исполнял скрипт до parfor, а потом работал диспетчером, и второй — который отрабатывал единственную итерацию моего цикла. Теоретически, есть какая-то потеря времени для передачи данных от одного потока к другому. Но у меня нарочно сделано так, чтобы не было видно вообще ни одной лишней переменной. Теоретически, нужно скопировать код (я не знаю, могут ли разные процессы делить один код, не думаю), но всё равно ведь не на 70 секунд работы!
Поменял цикл до 2, запустил снова. Вижу, как у меня крутится 3 MatLab'а — 2 сожрали по куче памяти (каждый процесс кушает где-то 3GB) и по одному ядру процессора, а третий почти ничего памяти и на нуле процессор, он ждёт.
Время работы — 931 секунда. Оппаньки! Опять же, я понимаю, что у меня есть какой-то код, который не параллелится (чтение данных с диска, запись результатов), но его там с гулькин нос, на пару секунд работы (я проверял). А кроме чтения диска я не вижу ничего — ни сеть не используется, ни ещё какие другие внешние устройства. Куда время потерялось?
С тремя итерациями время ускакало вообще до 1223 секунд, смысл распараллеливать постепенно пропадает.
Проверил, что у меня хватает памяти (не начало ещё свопить) — только сегодня поставили 16GB, а даже с тремя считающими MatLab’ами используется до 11GB. Проверил, что параллельно на этом компе ничего ресурсоёмкого нет (только ЖЖ).
Какие ещё есть варианты? Куда смотреть? А то официальный support откровенно косит под тупых (проблемы только у вас, а у нас вот только что один крупный клиент заказал ферму на 700 ядер, и всё работает!), не сложились у меня как-то с ними отношения...
Начал тестировать. Вот есть у меня некая процедура doSomeWork(), которая читает какой-то файл с диска, что-то там считает и пишет результат на диск же. Время её работы засёк — 664 секунды. Написал цикл из одной итерации:
for i = 1 : 1
doSomeWork();
end
Проверил, всё ещё 664 секунды.
Запустил PCT, поменял for на parfor — 734 секунды.
Ненормально. Попытался понять, что происходит. MatLab при запуске PCT создаёт дополнительные процессы MatLab, то есть в моём случае крутилось два процесса: один — тот, что исполнял скрипт до parfor, а потом работал диспетчером, и второй — который отрабатывал единственную итерацию моего цикла. Теоретически, есть какая-то потеря времени для передачи данных от одного потока к другому. Но у меня нарочно сделано так, чтобы не было видно вообще ни одной лишней переменной. Теоретически, нужно скопировать код (я не знаю, могут ли разные процессы делить один код, не думаю), но всё равно ведь не на 70 секунд работы!
Поменял цикл до 2, запустил снова. Вижу, как у меня крутится 3 MatLab'а — 2 сожрали по куче памяти (каждый процесс кушает где-то 3GB) и по одному ядру процессора, а третий почти ничего памяти и на нуле процессор, он ждёт.
Время работы — 931 секунда. Оппаньки! Опять же, я понимаю, что у меня есть какой-то код, который не параллелится (чтение данных с диска, запись результатов), но его там с гулькин нос, на пару секунд работы (я проверял). А кроме чтения диска я не вижу ничего — ни сеть не используется, ни ещё какие другие внешние устройства. Куда время потерялось?
С тремя итерациями время ускакало вообще до 1223 секунд, смысл распараллеливать постепенно пропадает.
Проверил, что у меня хватает памяти (не начало ещё свопить) — только сегодня поставили 16GB, а даже с тремя считающими MatLab’ами используется до 11GB. Проверил, что параллельно на этом компе ничего ресурсоёмкого нет (только ЖЖ).
Какие ещё есть варианты? Куда смотреть? А то официальный support откровенно косит под тупых (проблемы только у вас, а у нас вот только что один крупный клиент заказал ферму на 700 ядер, и всё работает!), не сложились у меня как-то с ними отношения...
no subject
Date: 2014-02-28 04:23 pm (UTC)no subject
Date: 2014-02-28 04:30 pm (UTC)no subject
Date: 2014-02-28 04:38 pm (UTC)no subject
Date: 2014-02-28 04:43 pm (UTC)Есть, конечно, время на подъём процессов, но специально запускаю ручками с консоли, чтобы это время не входило в подсчитанное. А разговаривать им там не о чем, я специально сделал так, чтобы никакого общения не было, всё только с диска и на диск (ну, я преувеличиваю, я передаю из master thread в каждый worker thread номер папки, из которой нужно читать данные, и в которую писать ответ, но это пара байт в одну сторону, и по получении я вывожу на консоль «папка прочитана» — эти сообщения вылетают явно не через 70 секунд).
no subject
Date: 2014-02-28 04:50 pm (UTC)no subject
Date: 2014-02-28 04:25 pm (UTC)no subject
Date: 2014-02-28 04:33 pm (UTC)А память не параллелится, точно? Потому что у меня как раз основные операции в этих 664 секундах — это тупые операции + и *, но на огромных матрицах. Насколько я понимаю, время доступа к памяти соизмеримо со временем этих операций. А есть варианты распараллелить? Одна плашка памяти или две — это на что-то влияет (по аналогии с винтами)? Существуют ли варианты с несколькими процессорами, у каждого из которых своя память? Несколько материнок?
no subject
Date: 2014-02-28 04:48 pm (UTC)no subject
Date: 2014-02-28 04:51 pm (UTC)no subject
Date: 2014-02-28 04:55 pm (UTC)no subject
Date: 2014-02-28 05:08 pm (UTC)А не специалист совершенно, но да, две плашки должны помочь. Несколько материнок - тоже. возможно архитектура допускает несколько шин памяти, но, опять же возможно, только дорогие материнки это используют. Не знаю толком. Подозреваю, что много дешевых материнок - оптимально.
no subject
Date: 2014-02-28 05:34 pm (UTC)no subject
Date: 2014-03-01 04:55 pm (UTC)no subject
Date: 2014-03-02 12:43 am (UTC)