2014-12-03 3 views
0

Оригинальная программа имеет около 100 «твердых» объектов, которые вычисляют целочисленную «цену» после сравнения их собственных атрибутов с атрибутами смежных фирм.Возможно ли «распараллелить» эту программу?

Отношения между фирмами могут быть «круговыми». В какой-то момент фирме [99] понадобится информация от фирмы [98] и фирмы [0] для получения цены. фирма [0] обновится после просмотра фирмы [99] и фирмы [1].

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

ВОПРОС:

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

Моя интуиция и опыт говорят, что это невозможно, но многопоточное программирование - это новая территория для меня, и я был удивлен умным дизайном раньше.

+4

Нам нужно будет увидеть алгоритм, чтобы прокомментировать, можно ли его распараллелить. –

+0

«ЦЕНА» зависит от «цены» смежных фирм (и фактической фирмы)? – Jarod42

+0

Есть ли компьютерная часть в вычислении стоимости фирмы, которая может быть достигнута независимо от других фирм? –

ответ

0

Это не - вообще - иметь ничего общего с многопоточность технологии, многопоточность используется, когда ваш алгоритм нуждается в этом, обратите внимание, что ключевое слово здесь алгоритм.

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

Так, чтобы ответить на ваш вопрос, от информации, я прямо сейчас о вашей ситуации (что почти 0%), я могу только сказать, что это невозможно логически и, как вы описали это сделать что ты хочешь делать.

Существует одно возможное исправление этого вопроса: каждый узел имеет начальные значения (например, фирма [0]), вы даже можете сделать алгоритм немного умнее и разработать какую-то математическую функцию для вывода исходных данных из ранее использованных данных в той же/предыдущей фирме, но я думаю, что это разрушит весь алгоритм! так что, возможно, вам стоит подумать о перепроектировании всего алгоритма математически, так как ваш код работал нормально, и у вас есть данные для тестирования!

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

UPDATE

Поскольку вы работаете с N узлами как фирмы, вы можете думать о создании N темы (я.e: один для каждого узла) и основной, который будет собирать информацию из каждого потока, теперь это не означает, что это многопоточное решение (логически, поскольку основной процесс будет бездействовать/ждать данные почти все время) , но с другой стороны каждый процесс узла может отправить свои данные в основной процесс и снова вернуться к работе, основным процессом будет тот, который ожидает данные из номера процесса i (0 < i < N).

+0

Это проект/упражнение в колледже, поэтому не беспокойтесь о аспекте «услуг». Хотя я не много говорил об алгоритме (потому что он действительно очень большой), я считаю, что я переделал проблему до существенного момента - вот вопрос о том, имеет ли он логический смысл. Это именно то, что мне нужно, спасибо! Я просто хотел быть уверенным, прежде чем объявить что-то «невозможным». – 3932695

+0

Хорошо, тогда ответ должен быть * манипулировать самим алгоритмом, прежде чем думать о коде *. – Ash

+0

См. Редактирование, возможно, это может помочь. – Ash

1

Часто в алгоритмах эволюции в прямом направлении, как вы, кажется, описываете, «приближение», которое сделано, состоит в том, что значение всех элементов при t + 1 зависит только от значения элементов в t. Схематическое изображение будет:

time |   elements 
    t | ... [i-1] [i] [i+1] ... 
    |   \ |/
t+1 | ...  [i]  ... 

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

Если, конечно, вы хотите сделать что-то вроде этого:

time |    elements 
    t | ... [i-1] [i] [i+1] [i+2] ... 
_____|__________\_|_/__|___|________ 
    | ...  [i] | |  ... 
t+1 |    \ |/
_____|_...____________[i+1]______... 

то вам не повезло, потому что [i+1] зависит от т + 1 значения [я], и, таким образом, нет никакой возможности для распараллеливания.

Смежные вопросы