Прежде всего я создал пул потоков и попытался выполнить некоторые тяжелые арифметические операции над массивом размером 40960 элементов float.C++ 11 параллельный для реализации
Однопоточный подход получил результат 0,0009 секунды, в то время как параллельный подход с 4 потоками, выполняемый синхронно, получил 0,0003 секунды. В этой реализации я вручную распределил задачу на 4 части и поставил их в пул потоков.
Теперь я хочу предоставить общий метод parfor
для моего пула потоков. Я пробовал:
void parfor(int begin, int end, std::function<void(int)>func)
{
int delta = (end - begin)/M_count;
for (int i = 0; i < M_count; ++i)
queue([=]{
int localbegin = begin + i*delta;
int localend = (i == M_count - 1) ? end : localbegin + delta;
for (int it = localbegin; it < localend; ++it)
func(it);
});
wait();
}
Где M_count - количество потоков. И время выполнения составляет 0,003 секунды (примерно в 10 раз больше, чем при ручном распределении задания). Я предполагаю, что std :: function имеет большие накладные расходы во время выполнения, но не знает другого альтернативного подхода. Не могли бы вы дать мне совет? Большое спасибо.
Edit: По совету Rapptz, я попытался это:
template <typename Function>
void parfor(int begin, int end, Function)
И использовали его, как это:
pool.parfor(0, 40960, [&](int i){
buff[i] = pow5(buff[i]);
});
Это показывает некоторые ошибки:
error C2371: 'it' : redefinition; different basic types
error C2512: 'wmain::<lambda_badf06dfbebc4bb15b3ade2b922c7f76>' : no appropriate default constructor available
Я думаю, он относится к лямбда как к типу, но не знает, как ее решить ...
Возможно, ваша версия руководства может встроить функцию, в то время как 'parfor' явно не может. – woolstar
Используйте шаблон вместо 'std :: function'. – Rapptz
@ woolstar Да, я так думаю. Но не знаю, как заставить функцию inline в моем парфоре. – babel92