| 04.10.2009 14:00 | |
Аннотация
Целью проекта TBB являлось изучение применения библиотеки TBB при разработке параллельных программ на общей памяти. Для сравнения использовалась библиотека OpenMP. Сравнение проводилось по следующим параметрам: трудоемкость и сложность разработки программы, затраченное время, производительность и ускорение полученного программного продукта. В качестве задачи была взята модель работы сердца человека, представляющая собой систему дифференциальных уравнений. Результатом проекта стало сравнение используемых технологий и рекомендации по применению TBB и реализованных в ней алгоритмов.
Введение
Проект TBB был нацелен на сравнение возможностей библиотеки TBB с OpenMP по таким критериям, как время, потраченное на разработку программного кода; трудоемкость и сложность разработки; производительность полученного программного продукта. В качестве задачи для распараллеливания была взята модель работы человеческого сердца. В терминах математического описания данная модель представляет собой систему дифференциальных уравнений (ДУ), которые характеризуют состояние клеток сердца человека. Моей задачей было решение данной системы в общем виде, а также разработка программы решения системы ДУ с использованием OpenMP. В результате полученное общее решение системы ДУ позволило сгенерировать наборы начальных данных и конечных состояний для них, на основании которых можно сделать вывод о правильности реализации программы. Реализованные мной алгоритмы на OpenMP позволили сделать сравнение алгоритмов, представленных другими участниками проекта на TBB. Таким образом, были достигнуты ключевые цели проекта.
Основная часть
В качестве задачи проекта, была взята модель работы сердца человека, представляющая собой систему дифференциальных уравнений:
Переменные u и v представляют собой параметры, характеризующие состояние клетки человеческого сердца, а коэффициенты D1 и D2 - связь клеток друг с другом (в культуре клеток). Соответственно возникла необходимость нахождения общего решения данной системы, что позволило в дальнейшем составить набор тестовых данных для проверки правильности работы программы. На рисунках 1 и 2 показано качественное поведение системы для упрощенного случая с отсутствующими связями:
Рис.1 Состояние равновесия
Рис.2 Цикл
Существует два состояния клеток сердца человека:
- Устойчивое (или состояние равновесия) (рис.1)
- Постоянного сокращения (или цикл) (рис.2)
Первое характерно для клеток сердца не участвующих в генерации сердечных импульсов, т.е. для основной массы клеток. Второе характеризует клетки, генерирующие импульсы, т.е. задающие ритм сердца (находятся в сердечных центрах).
Полученное общее решение и выведенные из него частные, позволили составить наборы данных для тестирования правильности вычислений параллельной программы. В ходе решения был изучен и задействован математический пакет Waterloo Maple.
Для численного решения системы ДУ была составлена разностная схема следующего вида:
Следующей задачей была разработка параллельной программы решения данной системы ДУ с использованием библиотеки OpenMP. Для решения системы ДУ был выбран сеточный метод, в котором при вычислении параметров клетки на текущем временном шаге требуются параметры четырех ее геометрических соседей (рис. 3 иллюстрирует сказанное).
Рис.3 Схема зависимости данных
При такой схеме зависимостей по данным, модель программирования на общей памяти наиболее предпочтительна. В OpenMP все потоки могут иметь доступ к общим массивам данных, таким образом отсутствуют затраты на пересылку. Первый реализованный мной алгоритм построен именно таким образом. На каждом временном шаге, создается пул потоков, которые осуществляют двумерный расчет по пространству матриц состояний U и V. Так как решаемая задача является двумерной, исходные данные хранятся в прямоугольных матрицах.
#pragma omp parallel shared(init_val,next_val,param), private(x,y)
{
#pragma omp for schedule(dynamic,chunk) nowait
for(y=1; y <= static_cast<long>(init_val->height()); ++y)
{
for(x=1; x <= static_cast<long>(init_val->row_width(y)); ++x)
{
uv_pair<T> init_x_1y = init_val->at(x-1,y);
uv_pair<T> init_x1y = init_val->at(x+1,y);
uv_pair<T> init_xy_1 = init_val->at(x,y-1);
uv_pair<T> init_xy1 = init_val->at(x,y+1);
uv_pair<T> init_xy = init_val->at(x,y);
T init_u = init_xy.u;
next_val->at(x,y).u = init_u + tau*(init_u - pow(init_u,3.0)/3.0 -
init_xy.v) + tau*(param->u_D->at(x,y)/h) *
(init_x_1y.u + init_x1y.u + init_xy_1.u + init_xy1.u - 4.0*init_u);
next_val->at(x,y).v = init_xy.v + tau*param->v_eps*(init_u-param->v_a->at(x,y)) +
tau*(param->v_D->at(x,y)/h) *
(init_x_1y.v + init_x1y.v + init_xy_1.v + init_xy1.v - 4.0*init_xy.v);
}
}
}
В данном листинге приведена ключевая часть кода счетного шага по времени. При помощи директивы OpenMP структуры параметров U и V объявляются доступными для всех потоков. После этого в директиве распараллеливания внешнего цикла указывается динамический режим планирования работы потоков. Управление планированием осуществляется при помощи указания размера итераций цикла, выполняющихся внутри каждого потока. Изменяя данный параметр, можно добиться оптимальной загруженности процессора во время счета задачи. Так же вместо schedule (dynamic, chunk) можно использовать schedule (guided, chunk), что также дает хороший результат. Тестовые запуски показали, что для данной задачи schedule (dynamic,chunk) дает лучший результат (переменная chunk вычисляется после каждого счетного шага).
Другим подходом к распараллеливанию является распараллеливание счета временных шагов. При таком методе распараллеливания в каждом потоке должны храниться матрицы параметров с их дополнениями, которые будут уменьшаться после каждой итерации (рис.4).
Рис.4 Схема распараллеливания по времени
Приведена схема разбиения матриц параметров для 4-х потоков и 3-х временных шагов (красные линии – актуальные данные, оранжевые пунктирные – дополнения для пересчета параметров). Рассмотрим детально схему распределения данных на примере 0-го потока. Светлый квадрат в левом верхнем углу рисунка, актуальные данные для потока. Для того чтобы можно было рассчитывать значения параметров независимо от других потоков (без обменов после каждой итерации по времени), актуальные данные нужно дополнить соседними. Эти дополняющие данные (темное окаймление), которые получил бы поток после 3-х шагов по времени от своих соседей в случае постоянных обменов данными, будут устаревать по одной линии после каждого временного шага. Основная сложность при этом заключается в сохранении целостности данных при «обрезке» границ исходных матриц, разработке специальных структур хранения данных для этих целей, а так же создании нового оптимизированного алгоритма расчета одного счетного шага по пространству и времени. Требования к структурам заключаются в быстроте работы с ними, так как очевидно, что при большом объеме входных данных операции изменения размеров матриц будут довольно частыми. Так же требуется дополнительное введение переменных, в которых хранятся данные о количестве итераций до синхронизации данных всей задачи вцелом. Отсюда возникает вопрос о равномерной загруженности всех потоков, так как операция синхронизации требует, чтобы синхронизируемые данные были достоверными и правильными (с одного и того же временного шага). Решение данного вопроса напрямую связанно с разработкой алгоритма расчета одного счетного шага, т.е. переходе от многомерных вложенных циклов к одномерному с сохранением правильности вычислений и использовании алгоритмов планирования, предоставляемых библиотекой OpenMP. Данные задачи были успешно решены, и получен оптимизированный алгоритм, показавший заметно лучшие результаты по сравнению с первоначальным.
Далее представлены графики замеров времени работы первого алгоритма (вертикальные шкалы – время выполнения в секундах, горизонтальные – размеры матриц в элементах, вещественные двойной точности):
Рис.5 График времени выполнения первого алгоритма на малых объемах данных
Рис.6 График времени выполнения первого алгоритма на больших объемах данных
Следующие графики замеров времени выполнения оптимизированного алгоритма:
Рис.7 График времени выполнения оптимизированного алгоритма на малых объемах данных
Рис.8 График времени выполнения оптимизированного алгоритма на больших объемах данных
Рис.9 Сравнительный график времени выполнения оптимизированного и не оптимизированного алгоритмов при малых объемах данных
Рис.10 Сравнительный график времени выполнения оптимизированного и не оптимизированного алгоритмов при больших объемах данных
Как видно из представленных графиков, оптимизация алгоритма счета, а также правильный выбор планирования выполнения потоков и организация их взаимодействия с контролем использования ресурсов дали хороший результат и позволили увеличить быстродействие программы в целом.
Заключение
В итоге мной были разработаны два алгоритма решения системы ДУ, моделирующей работу человеческого сердца. Первый из них использует подход распараллеливания счета по пространственной сетке. Второй является более оптимальным, так как в нем используется распараллеливание счета по временным и пространственным шагам. Полученные замеры времени счета показали, что при не большем количестве счетных данных алгоритмы с использованием OpenMP опережают свои аналоги на TBB, а при больших объемах данных наблюдается незначительное отставание (в случае первого алгоритма), растущее в арифметической прогрессии. Особого внимания заслуживает оптимизированный алгоритм, который при больших объемах данных не отстает от аналогов. Таким образом, задачи и цели проекта были успешно выполнены.
Об авторе
Раткевич Ирина Сергеевна, студентка 3 курса экономико-математического факультета, кафедры «Информационные системы в экономике» Саровского Физико-Технического Института (в настоящее время Национального Исследовательского Ядерного Университета). Участница проекта MPI и менеджер проекта ISPS4U совместной лаборатории СарФТИ и Интел BiPro. Участница конференций:
- Математика и математическое моделирование 2008 «Разработка параллельной программы численного интегрирования функции 2-х переменных на заданной области с заданной точностью» - 3е место;
- Молодежь в науке 2008 «Разработка параллельной программы численного интегрирования функции 2-х переменных на заданной области с заданной точностью и заданным методом»;
- Научная сессия МИФИ 2009 «Разработка параллельной программы численного интегрирования функции 2-х переменных на заданной области с заданной точностью и заданным методом (с постановкой проблемы балансировки вычислительной нагрузки на счетные узлы)»;
- Научная сессия МИФИ 2009 «Основные проблемы Закрытых Административно-Территориальных Образований»;
- Математика и математическое моделирование 2009 «Исследование алгоритмов балансировки применимых к параллельному алгоритму численного интегрирования функции двух переменных» - 3е место;
- Математика и математическое моделирование 2009 «Анализ современных социальных сетей и сервисов» - 2е место;
- Математика и математическое моделирование 2009 «Основные противоречия и возможные пути развития Закрытых Административно-Территориальных Образований»;
- «Нижегородская сессия молодых ученых».
Список литературы
- Осипов Г.В. «Моделирование сердечной активности»
Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.
Комментарии (52) 
| 06.10.2009 13:35
sergeykasatkin
| Грамотная статья, хорошо описывающая суть проекта. Оптимизированный OpneMP алгоритм показал отличные результаты, чего довольно сложно добится от реализации алгоритмов на OpenMP. |
| 06.10.2009 13:42
andreyneznamov
| Интересная работа, наверняка нашла практическое применение. Отличное описание алгоритмов и наглядные графики. Хорошая исследовательская работа. |
| 06.10.2009 13:48
sergeykravnik
| Довольно информативно, сразу видно, что знаешь о чём пишешь. Схема расчёта при нескольких независимых шагах весьма интересна. Достигнутое ускорение примерно 2 на мой взгляд более чем хороший результат, не в каждой программе удаётся его достигнуть. |
| 06.10.2009 13:59
genadysemenov
| Работа является очень полезной для меня как для начинающего разработчика параллельных программ. В статье описываются хорошо масштабируемые алгоритмы и принципы их реализации. Статья написана хорошим техническим языком, было просто приятно почитать. |
| 06.10.2009 14:06
stanislavyen
| Статья полностью соответствует названию. Хорошо описана постановка задачи и принципы реализации алгоритмов. Особенного внимания заслуживают результаты, которые являются просто отличными. Статья оставила хорошие впечатления. |
| 07.10.2009 14:25
yaroslavegorov
| Интересная статья, хорошо было бы прочитать о достижениях остальных участников проекта, чтобы картина была абсолютно полной. Результаты запусков, просто отличные. |
| 07.10.2009 14:31
fedorandreev
| Статья привлекает к себе внимание тем, что в ней изложены актуальные принципы построения параллельных программ на общей памяти. В целом понравилось. |
| 07.10.2009 14:40
andreyilin
| Кратко, информативно, понятно - такие ощущения оставляет статья. Из пожеланий, хотелось бы почитать об алгоритмах реализованных на TBB, для "полной" картины. Так же хотелось бы отметить, что граффики наглядно показывают преимущества параллельных алгоритмов в целом и то, к чему нужно стремится всем разработчикам. |
| 07.10.2009 14:45
mihailkudrin
| Интересный алгоритм расчёта. Как начинающему разработчику статья дала мне представление о современных инструментах используемых при написании параллельных программ на общей памяти. |
| 07.10.2009 14:50
evgenyvjazov
| Классная статья. Очень простой и понятный язык изложения. Большое спасибо, она мне очень помогла при написании разрабатываемой мной программы. |
| 07.10.2009 15:01
svijatoslavegorov
| Думаю данная статья будет полезна не только начинающим программистам, но и тем, кто уже имеет стаж работы и хочет узнать новые технологии и методики. Я, например, благодаря данной статье познакомился с TBB и успешно применил её в своей работе. Спасибо автору, за хороший материал. |
| 07.10.2009 15:06
dmitryrogozin
| Интересно было бы немного подробнее рассмотреть принцып работы первого алгоритма в плане начального распределения данных. А в целом статья просто прекрасная. |
| 07.10.2009 15:10
uriyharotian
| Статья привлекла актуальностью рассматриваемых вопросов, в частности построения алгоритмов и их наилучшая реализация. Я узнал много нового для себя. |
| 07.10.2009 15:18
stepangoldberg
| Статья прекрасная, только хотелось бы уточнить один вопрос. Меняются ли во время счёта значения переменных a, d1, d2? |
| 07.10.2009 15:22
yanzelenkov
| Хорошая статья, особенно для меня, как начинающего программиста. Спасибо за хорошее изложение материала. |
| 07.10.2009 15:26
iliamiroshnichenko
| Спасибо за статью, очень понравилась, особенно оригинальная схема распределения данных на потоках. |
| 08.10.2009 00:16
Irina Ratkevich
|
(TO:stepangoldberg) [Статья прекрасная, только хотелось бы уточнить один вопрос. Меняются ли во время счёта значения переменных a, d1, d2?] Переменные a, d1 и d2 являются двумерыми массивами, также как и U и V, но задаются в начале задачи и больше не изменяются, т.к. характеризуют параметры самих клеток. В принцыпе можно изменять все параметры, но это будет означать серьезное нарушение в работе клеток. |
| 08.10.2009 01:51
semenalekseev
| Хорошая статья. Хотелось бы знать были ли сложности с разработкой оптимизированного алгоритма и если были, то какие? |
| 08.10.2009 02:06
dmitryznamensky
| Спасибо за такую понятную статью. Очень приятно было прочитать. Чувствуется, что автор хорошо владеет излагаемым материалом. |
| 08.10.2009 10:24
grigorysmirnov
| Есть ли какие нибудь ограничения при использовании оптимизированного алгоритма? |
| 08.10.2009 10:31
borisnikolaev
| Хорошая статья, которая отлично отражает сущьность решаемой проблеммы. Очень понравилось. Спасибо за хороший материал. |
| 08.10.2009 10:37
viktorgorodnov
| Прекрасный материал. Как хорошо, что есть такие ресурсы с отличными статьями. Мне очень понравился стиль изложения материала, побольше бы таких статей. |
| 08.10.2009 10:58
vlasstepanenkos
| Прекрасная статья. Хорошо описаны алгоримы. Полученные результаты более чем прекрасные. |
| 08.10.2009 11:02
volvgansmerjin
| Хороший материал. Очень здорово, что удалось его обнаружить. Он помог мне разобраться с параллельнлым программированием и успешно реализовать необходимую мне функциональность. |
| 08.10.2009 11:05
svijatoslavevgeniev
| Отлично написано. Так держать. Очень понравилось. |
| 08.10.2009 11:15
stepanilin
| Хорошая, грамотная статья. Спасибо за материал. |
| 08.10.2009 11:22
svjatoslavznamenskiy
| Мне очень понравился излагаемый материал. Надеюсь благодаря этой работе в нашей стране будет больше исследовний, которые помогут в развитии страны. Спасибо за отличную статью. |
| 08.10.2009 11:26
matveystrischin
| Замечательная статья, хорошо описывающая тематику. Мне очень понравилось. |
| 08.10.2009 11:35
leonidsmijalov
| It's a excellent article! I seeking that material for a months and i am really satisfied with it. So I have just one question, how do you do this perfect thing? |
| 09.10.2009 08:02
Irina Ratkevich
|
(To:semenalekseev) [Хорошая статья. Хотелось бы знать были ли сложности с разработкой оптимизированного алгоритма и если были, то какие?] Спасибо, за вопрос. Сложности с разработкой алгоритма действительно были. Самым сложным была разработка алгоритма распределения нагрузки, с целью наилучшей загруженности процессора (имеется ввиду многоядерный процессор). В остальном, возникали незначительные проблемы с механизмом хранения данных для вычислений, так как на каждом счётном шаге данные менялись довольно значительно, в плане изменения размерностей двумерных массивов на 1 . |
| 09.10.2009 08:03
Irina Ratkevich
|
(To:grigorysmirnov) [Есть ли какие нибудь ограничения при использовании оптимизированного алгоритма?] Да ограничения действительно существуют. Главное при этом в том, что запас размерностей дополнений по осям x и y, должны быть одинаковыми. Т.е. если мы хотим расчитать независимо 3 шага, то необходимо, взять окаймление 3 столбца по x и 3 строки по y. |
| 10.10.2009 06:17
Irina Ratkevich
|
(To: leonidsmijalov) Good Task + Good Team = Good Result !!!! )) |
| 15.10.2009 12:56
andykuchinsky
| Отличная статья. Спасибо за прекрасно изложенный материал. |
| 15.10.2009 13:16
mysergeyliazov
| В статье описывается интересная схема разбиения данных, спасибо за материал. |
| 15.10.2009 13:39
leonidsvistopliasov
| Отличный материал, так держать! Узнал много нового и полезного. |
| 15.10.2009 13:52
dmitryterentev
| Спасибо за такую классную статью, мне очень понравилось. |
| 15.10.2009 13:57
sebastianlasonie
| Очень заинтересовали методы распараллеливания. Материал довольно полезный и судя по полученным результатам более чем катуальный. |
| 15.10.2009 14:04
andreyliholesev
| В работе привлекла не только решение актуальной задачи, но и механизмы с помощью которых было получено грамотное и высокопроизводительное решение. Материал очень хорошо и подробно изложен. Спасибо автору. |
| 16.10.2009 01:43
Svetlana Emelyanova (Intel)
| Положительные комментарии хороши, пока они не являются спамом. IP-адрес "авторов" комментариев нам виден ;) |
| 17.10.2009 15:55
Alexei Alexandrov (Intel)
| Детский сад, действительно, какой-то. Даже IP адресов не надо. Достаточно на время сообщений взглянуть и на имена "пользователей" |
| 18.10.2009 06:06
alexander.musman
|
Статья прекрасная, только хотелось бы уточнить один вопрос (c). Насколько буквально нужно понимать Схему распараллеливания по времени (рис.4)? По идее, если разбивать 2-мерный массив не на квадраты, а прямоугольники (по нескольку строк подряд), то данные одного потока будут менее разбросаны в кеше (а упомянутый в комментариях "запас размерностей дополнений" тогда будет только по оси y). |
| 19.10.2009 07:31
skiddy
| Тестировалась ли программа на более больших матрицах и каково было пиковое ускорение? |
| 19.10.2009 12:15
IT-spec
| Так что же лучше использовать для программирования на общей памяти OpenMP или TBB? |
| 21.10.2009 13:19
Irina Ratkevich
|
(To:alexander.musman) [Статья прекрасная, только хотелось бы уточнить один вопрос (c). Насколько буквально нужно понимать Схему распараллеливания по времени (рис.4)? По идее, если разбивать 2-мерный массив не на квадраты, а прямоугольники (по нескольку строк подряд), то данные одного потока будут менее разбросаны в кеше (а упомянутый в комментариях "запас размерностей дополнений" тогда будет только по оси y).] Схема распараллеливания дана для иллюстрации описываемых действий. В реальном расчёте задействован алгоритм определения количества элементов в матрицах. Предлагаемый вами вариант является частным случаем рассмотренного алгоритма и при некоторых условиях может быть задействован при реальном счёте. В данном случае количество элементов по оси x равно длинне одной строки (в элементах). К плюсам используемого подхода стоит отнести его относительную универсальность и возможность динамической (во время счета) адаптации к данным. |
| 21.10.2009 13:20
Irina Ratkevich
|
(To:skiddy) [Тестировалась ли программа на более больших матрицах и каково было пиковое ускорение?] Тестовые запуски программы проводились на матрицах с максимальной размерностью 500х500, пиковое ускорение составило 1,98. |
| 21.10.2009 13:20
Julia Fedorova (Intel)
|
Вопросы к графикам: 1. Сколько шагов по времени было рассчитано? 2. Каким компилятором и с какими параметрами строился код? (в случае распараллеливания "по пр-ву" и "по времени") ? 3. На каком оборудовании (hardware system) и операционной системе проводились расчеты? 4. Где данные для реализации на ТВВ кот. подтверждают вывод сделанный в статье? |
| 21.10.2009 13:23
Irina Ratkevich
|
(To:IT-spec) [Так что же лучше использовать для программирования на общей памяти OpenMP или TBB?] Всё зависит от сложности решаемой задачи. Общих рецептов нет. Можно лишь сказать, что сложные задачи требующие большого количества ресурсов и описывающие сложные модели при распараллеливании с использованием TBB дадут лучший результат по сравнению со своими аналогами, реализованными с использованием OpenMP. Так что всё зависит от вашего опыта и конкретной задачи. |
| 22.10.2009 08:07
Irina Ratkevich
|
(To: Julia Fedorova (Intel)) [Вопросы к графикам: 1. Сколько шагов по времени было рассчитано? 2. Каким компилятором и с какими параметрами строился код? (в случае распараллеливания "по пр-ву" и "по времени") ? 3. На каком оборудовании (hardware system) и операционной системе проводились расчеты? 4. Где данные для реализации на ТВВ кот. подтверждают вывод сделанный в статье?] 1. Графики приведены для расчётов, равновесных состояний, т.е. когда система приходит в устойчивое равновесие. Таким образом расчёт лимитировался не количеством временных шагов, а погрешностью. В среднем для достижения равновесного состояния требуется от 100 до 10000 тысяч шагов в зависимости от начальных данных. 2. Код компилировался с использованием стандартного компилятора поставляемого вместе с Microsoft Visual Studio 2005 для языка C++ () с поддержкой OpenMP (ключ /openmp). Все ключи:cl.exe /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /openmp /Fo"Debug\" /Fd"Debugvc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt. 3.Операционная система: Microsoft Windows XP SP3. Характеристики компьютера: Intel Core 2 Duo 2,4 ГГц, 2048 Мб RAM, 250 ГГб Hard Drive. 4. Вывод сделан на основе данных, включенных в презентации остальных участников проекта, представленных на закрытии летней школы Intel (INNL Summer School 2009). Так как другие участники не представили своих работ, то ниже следует таблица тестовых запусков аналогичного алгоритма реализованного на TBB с использованием tbb_parallel_while (размерности матриц – элементы вещественного типа двойной точновти, время в секундах): 1 поток 2 потока 5x5 0.14 2.5 10x10 0.36 2.5 25x25 1.88 3.3 50x50 7.41 6 100x100 28 16 200x200 111 59 500x500 700 360 |
| 23.10.2009 05:15
Dmitry Oganezov (Intel)
|
«Проект TBB был нацелен на сравнение возможностей библиотеки TBB с OpenMP по таким критериям, как время, потраченное на разработку программного кода; трудоемкость и сложность разработки» - мне очень, очень хотелось бы верить, что «проект TBB» нацелен на что-то более высокое… Шутка. Прочитав начало статьи, я сначала запутался, а потом снова распутался. Наверное, автор хотел сказать, что цель проекта – сравнительная оценка трудоемкости разработки TBB/OpenMP, а задача автора – выступить на стороне OpenMP. С этих позиций описание мат.методов выглядит избыточным, а описание реализации и оптимизации – недостаточным. Например, фраза «получен оптимизированный алгоритм, показавший заметно лучшие результаты» наводит на мысль, что оптимизированный алгоритм получен с применением магии :). Жаль, что нет информации об использованных инструментах. Жаль, что мы так и не услышали начальника транспортного цеха, который выступал «за TBB». Жаль, что нельзя увидеть сравнение трудоемкости. В результате сложно понять, какие именно «задачи и цели проекта были успешно выполнены». Не с наречием в подавляющем большинстве случаев пишется вместе. А мусор в комментариях, Свет, надо почистить. |
| 24.10.2009 09:49
alexander.musman
|
Похоже, именно на основе результов этого исследования tbb::parallel_while был "deprecated" ( шутка:) ) |
| 07.06.2011 11:59
Amokk | Ваша статья уныла в силу отсутствия приложенного исходного кода всего проекта. А так - это просто отписка, к тому же неинтересная. |
Обратная ссылка (0)
Оставить комментарий 
Irina Ratkevich
|




micaelshevchenko
5