Распараллеливание черного ящика.(ч.1)

Существует точка зрения, что при распараллеливании неправильно рассматривать последовательно реализованную программу как черный ящик. Другими словами, необходимо знать алгоритмы, которые реализованы в данном пакете. С одной стороны, это правильно, ведь порой эффективнее заменить, существующий алгоритм на другой. На алгоритм, который хорошо ложиться на ту или иную архитектуру.
Я хочу рассказать о результате летнего школьника Интел-ННГУ 2009, т.е. о проекте, которым занимался студент, у которого я был руководителем. Задача стояла следующая: взять уже существующий проект и распараллелить его с помощью Intel® Parallel Studio, рассматривая его как черный ящик. А потом сравнить с параллельным вариантом разработчиков сэмпла. Главное условие было взять только последовательный вариант проекта и не смотреть параллельный вариант. Выбор остановился на сэмпле для Intel® TBB - Tachyon, у которого существует два параллельных варианта с использованием технологии Intel® TBB. (если установлен пакет "Intel® Parallel Studio", то солющен(Solution) можно найти тут: C:\Program Files\Intel\Parallel Studio\Composer\tbb\examples\parallel_for\tachyon). Это трассировщик лучей, один из результатов которого фрактал с тремя источниками освещения.



Стоит заметить, что 3 ноября будет проведен Онлайн Семинар "Intel® Parallel Studio Workflow" на базе Tachyon. Количество участников ограничено.
Первый Шаг в расспараллеливание - это найти наиболее часто используемый участок программы. Для этого использовался Intel® Parallel Amplifier. И для сравнения удобства и простоты работы Intel® VTune™ Performance Analyzer. Как Amplifier так и VTune указали на функции:
grid_intersect и sphere_intersect.



Анализ данных функций показывает, что они не совсем пригодны к распараллеливанию или тюнингу. Соответственно нужно найти либо родительские либо дочерние функции, которые содержат циклы.
Для VTune пришлось собрать профиль Call Graph, на что ушло порядка 13 минут накладных расходов (время работы последовательного варианта Tachyon 30 сек). И 1 час на анализ профиля. У Ampilfier-а использовался уже созданный профиль, что оказалось очень удобным:



В результате мы остановились на кандидате parallel_thread:

static void parallel_thread (void)

{


    unsigned int serial = 1;

	unsigned int mboxsize = sizeof(unsigned int)*(max_objectid() + 20);

    unsigned int * local_mbox = (unsigned int *) alloca(mboxsize);

	memset(local_mbox,0,mboxsize);


    for (int y = starty; y < stopy; y++) { {

        drawing_area drawing(startx, totaly-y, stopx-startx, 1);

        for (int x = startx; x next_frame()) return;

     }



}



И пока я дописываю следующий Блог, предлагаю Вам самим попытаться распараллелить.

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