Когда простая парализация не даст ускорения? - PullRequest
3 голосов
/ 25 февраля 2010

У меня есть простая программа, которая разбивает набор данных (файл CSV) на 4 блока, считывает каждый блок, выполняет некоторые вычисления и затем добавляет результат вместе. Думайте об этом как о простой операции уменьшения карты. При обработке одного фрагмента используется около 1 ГБ памяти. Я запускаю программу на четырехъядерном ПК с 4 ГБ оперативной памяти, работающей под управлением Windows XP. Я случайно закодировал это, используя R, но я не думаю, что это актуально.

Я кодировал две версии. Одна версия обрабатывает каждый кусок в последовательности. Другая версия обрабатывает куски по два одновременно. Обе версии требуют почти одинакового времени для завершения.

При каких обстоятельствах вы ожидаете увидеть этот результат производительности?

Моя текущая гипотеза состоит в том, что процессы ограничены производительностью памяти, но я не знаю лучшего способа исследовать это дальше. Любые предложения или догадки?

Редактировать: Программа не связана с вводом-выводом с точки зрения диска. Этап обработки считывает кусок файла CSV в память, перемешивает его в течение 5 минут или около того, а затем записывает результат обратно в файл на диске. Ввод и вывод файла занимает не более нескольких секунд.

Ответы [ 4 ]

2 голосов
/ 25 февраля 2010

Существует один обычный ответ на вопросы о производительности, и это применимо, если вы занимаетесь последовательным или параллельным программированием. Используйте профилировщик. : -)

2 голосов
/ 25 февраля 2010

Ваше предположение о том, что вы связаны с памятью, верно. Вам нужно уменьшить ваши рабочие наборы до размера кэша или увеличить пропускную способность памяти. Один из способов сделать это - распространить вашу программу на несколько машин. Затем вам нужно убедиться, что ваши блоки достаточно грубые, чтобы преодолеть расходы на связь между машинами. Графические процессоры также имеют очень высокую пропускную способность памяти. Ваша проблема по-прежнему достаточно мала, чтобы она могла уместиться в памяти видеокарты.

0 голосов
/ 25 февраля 2010

5 минут звучит очень долго, даже если R читает гигабайтный файл, поэтому я предполагаю, что вы не связаны с вводом / выводом. В этом случае ответом является то, что вы, скорее всего, связаны с памятью. Если это так, если вы читаете только половину фрагмента, распараллеливание должно вам помочь. (Но уверены ли вы, что вычисления на самом деле происходят в отдельных потоках, а не разделены по времени между одним и тем же потоком? Что произойдет, если вы запустите два отдельных экземпляра R, один из которых обрабатывает один блок, а другой - другой?)

0 голосов
/ 25 февраля 2010

Если процессы конкурируют за ресурсы, то преимущества парализации уменьшаются.

Если диск работает постоянно (и поэтому процессы связаны с вводом-выводом), вы не заметите никакой выгоды. Если они используют одни и те же экземпляры структур данных (что приводит к потере времени на синхронизацию), вы заметите значительное снижение производительности. Если часть операции «уменьшить» - это то, что занимает большую часть времени, парализация «карты» не приведет к значительному увеличению производительности.

Вы не предоставили нам достаточно данных, чтобы точно сказать, в чем причина вашего дела.

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