У меня есть оценка функции, которая несколько медленная. Я пытаюсь ускорить его с помощью многопоточности, так как есть три вещи, которые можно делать параллельно. Однопоточная версия
return dEdx_short(E) + dEdx_long(E) + dEdx_quantum(E);
где вычисление этих функций занимает ~250 мкс, ~250 мкс и ~100 мкс соответственно. Поэтому я реализовал трехпоточное решение:
double ret_short, ret_long, ret_quantum; // return values for the terms
auto shortF = [this,&E,&ret_short] () {ret_short = this->dEdx_short(E);};
std::thread t1(shortF);
auto longF = [this,&E,&ret_long] () {ret_long = this->dEdx_long(E);};
std::thread t2(longF);
auto quantumF = [this,&E,&ret_quantum] () {ret_quantum = this->dEdx_quantum(E);};
std::thread t3(quantumF);
t1.join();
t2.join();
t3.join();
return ret_short + ret_long + ret_quantum;
Я ожидал, что это займет около 300 долларов США, но на самом деле это занимает около 600 долларов США - в основном то же самое, что и однопоточная версия! Все они по своей сути потокобезопасны, поэтому блокировки не нужно ждать. Я проверил время создания потока в своей системе, и оно составляет ~ 25 мкс. Я не использую все свои ядра, поэтому я немного озадачен тем, почему параллельное решение такое медленное. Это как-то связано с созданием лямбды?
Я пытался обойти лямбду, например:
std::thread t1(&StopPow_BPS::dEdx_short, this, E, ret_short);
после перезаписи вызываемой функции, но это дало мне ошибку attempt to use a deleted function
...
union cache_friendly { double value; char dummy[CACHE_LINE_SIZE]; };
лучше? 09.04.2014