У меня есть программа на C++, которая может быть распараллелена. Я использую компиляцию Visual Studio 2010, 32bit.Параллельные задачи улучшают производительность с boost :: thread, чем с ppl или OpenMP
В короткой структуре программы является следующая
#define num_iterations 64 //some number
struct result
{
//some stuff
}
result best_result=initial_bad_result;
for(i=0; i<many_times; i++)
{
result *results[num_iterations];
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
// update best_result;
}
Поскольку каждый some_computations()
является независимым (некоторые глобальные переменные чтения, но никакие глобальные переменные не будут изменены) Я распараллелен внутреннюю for
-loop.
Моя первая попытка была с импульс :: нить,
thread_group group;
for(j=0; j<num_iterations; j++)
{
group.create_thread(boost::bind(&some_computation, this, result+j));
}
group.join_all();
Результаты были хорошими, но я решил попробовать больше.
Я попробовал библиотеку OpenMP
#pragma omp parallel for
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
результаты были хуже, чем те, boost::thread
«s.
Тогда я попробовал Закон о госзакупках библиотеку и использовали parallel_for()
:
Concurrency::parallel_for(0,num_iterations, [=](int j) {
some_computations(results+j);
})
Результаты были хуже.
Я нашел это поведение совершенно неожиданным. Поскольку OpenMP и ppl предназначены для распараллеливания, я ожидал бы лучших результатов, чем boost::thread
. Я ошибаюсь?
Почему boost::thread
дает мне лучшие результаты?
Не могли бы вы подсчитать «лучше», например? обеспечить время выполнения по сравнению с количеством потоков? С 'boost :: thread' вы создаете 64 потока. OpenPM использует команду рабочих потоков, число которых по умолчанию соответствует количеству виртуальных процессоров. PPL также использует пул потоков и имеет еще более высокие накладные расходы, чем OpenMP, поскольку он также реализует балансировку работы. –
Я использовал один и тот же номер (32 или 64) для каждой попытки, возможно, как вы указали, с помощью OpenMP и ppl я мог бы получить лучшие результаты, устанавливая количество потоков, равное количеству ядер. Я попробую. – 888
Почти невозможно ответить на вопрос, поскольку он стоит. Что такое 'some_computations'? Я где-то встречаю возможное соперничество (которое может поразить разные библиотеки по-разному, например, если у openmp на самом деле более низкие накладные расходы, но у вас много записей в общих кешлях, что может привести к замедлению в результате недействительности кэширования)? Сколько времени требуется для выполнения параллельного блока для каждого варианта – Grizzly