Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Во-вторых, с помощью него не так просто распараллелить сложные алгоритмы.А с помощью Parallel Extensions, которые судя по описанию аналогичны OpenMP, это будет сделать легче? Нет. Что я для себя извлёк из этого: кому действительно нужно было увеличить быстродействие — написали нужный кусок кода на C+OpenMP, а не ждали пока сделают подобное для .NET. Думаю вы, как человек явно разбирающийся в теме, согласитесь, что слышать в нынешнее время фразу
Так что скоро будем параллелить не только между процессорами, но и между компами. :)довольно странно.
extern "C". Ну вот, с OpenMP, теоретически, можно попробовать компилировать его managed C++ компилятором и смотреть, как оно будет работать. Без гарантий.Достоинства PE в том, что они позволяют в существующий проект внедрить параллельный код без особых проблем. Берётся, фактически, любое LINQ выражение в программе, и, при наличии нескольких ядер или процов, начинает обрабатываться параллельно. Без изучения тонкостей вопроса, без изучения нового языка программирования.Что ещё раз доказывает, что можно сравнивать PE и OpenMP :) В удобстве OpenMP для своих прямых и не только задач я убедился.
Насколько я понимаю, Ваш вопрос таков: чем он лучше или круче MapReduce?Нет, его я хотел сравнить с MPI. Имхо они одного порядка решения, а MapReduce действительно упрощённый вариант.
И из этого вовсе не следует, что сейчас разработчик не пишет многопоточные программы, просто сейчас это требуется делать вручную и держать в голове очень много лишней информации. Если хотите, могу привести пару интересных примеров.Интересные примеры бесполезными никогда не будут. Не так часто удаётся прорваться и пообщаться с знающими людьми. Не сочтите снова за занудство, но только совсем простые примеры мне будут понятны, ибо мне приходится работать и на СКИФе, так что я немного в теме :)
Singleton *getSingleton()
{
static *singleton = NULL;
if(singleton == NULL)
singleton = new Singleton();
return singleton;
}
Singleton *getSingleton()
{
static *singleton = NULL;
if(singleton == NULL)
{
Lock();
if(singleton == NULL)
singleton = new Singleton();
Unlock();
}
return singleton;
}
DryadDataContext ddc = new DryadDataContext(dir);
DryadTable<LineRecord> table = ddc.GetTable<LineRecord>(filename);
IQueryable<string> lines = table.Select(lr => lr.line);
IQueryable<string> match = search(lines, searchString);
...
public static IQueryable<string>
search(IQueryable<string> collection,
string searchString)
{
return collection.Where(s => s.IndexOf(searchString) >= 0);
}
Не знаю. Там ведь фишка не только в архитектурном решении, там фишка в LINQ. Нормально параллелятся функциональные языки, и LINQ как раз такой подъязык. Подозреваю, что код на Си++ окажется просто сложнее, поскольку там вся функциональность в шаблонах.Если параллелить по задачам, то думаю и нынешних средств хватит, всё-таки все примеры выше и в статье так или иначе относятся к распараллеливанию циклической обработки данных. Для этого в C(++) ничто не мешает особо :)
double sin(double x)
{
int iteration = 3;
int sign = -1;
double factorial = 6;
double result = x;
double pow = x * x * x;
do
{
double next = (sign * pow)/factorial;
result += next;
sign = -sign;
pow *= x * x;
iteration += 2;
factorial * iteration * (iteration - 1);
}
while(iteration <= 11);
return result;
}
let sin_mmbr x i = (x^i * (-1)^((i - 1)/2))/factorial(i) let after_map x = map (sin_mmbr x) [1..3..11] let sin x = fold_left (+) 0 (after_map x)
PE в некоторых случаях (например у нас на дуал-ксеоне) при отсутствии работы начинает ее активно искать. При этом так активно, что занимает 80% от всех 8 ядер.Лишнее подтверждение тому, что от всех проблем эти абстракции не спасут. конечно же, они скорее всего исправят шедулер потоков, если дело в нём, но программист по хорошему тоже должен думать о том, чтобы все потоки выполнялись примерно одинаковое время. В конечном счёте это выгоднее :)
… вводным обзором в Parallel Extendions.подправьте «Extendions»… Правда полезная статья =)
Parallel Extensions для .net 3.5