Я не очень опытен, когда дело доходит до многопоточности.У меня есть детектор наземных ориентиров, который обнаруживает 68 ориентиров вокруг лицевых компонентов.Для каждого отдельного ориентира объекты HoG должны быть извлечены и добавлены к предыдущим ориентирам, чтобы создать гигантский вектор, прежде чем передать его регрессору.
В настоящее время все функции извлекаются последовательно по порядку, и я пытаюсь извлечь их параллельно, чтобы ускорить процесс.
Извлечение функций из всех ориентиров в SERIALзанимает около 2,5 мс в моей системе.Когда я пытаюсь распараллелить его, используя 68 потоков, требуется около 8,5 мс, извлекая функции из всех ориентиров.Так что на самом деле это замедляет процесс, и я предполагаю, что это, вероятно, из-за времени инициализации потоков.
Ниже приведен исходный код в последовательном
for(int i = 0; i < 68; i++){ // for each landmark
fx = shape[i]; // x position
fy = shape[i + 68]; // y position
extract_features(image, fx, fy, &features[i]);
}
Вот что я сделал для его распараллеливания
vector<std::thread> threads;
for(int i = 0; i < 68; i++){ // for each landmark
fx = shape[i]; // x position
fy = shape[i + 68]; // y position
threads.emplace_back(
[image, fx, fy, &] () { extract_features(image, fx, fy, &features[i]); }
);
}
for(int x = 0; x < 68; x++)
threads[x].join();
Я должен сделать что-то не так, чтозамедление процесса вместо ускорения.Мое лучшее предположение - инициализация потока так, как я это делаю, требует больше времени, чем сама задача.Если это так, есть ли способ, которым я могу уже инициализировать потоки и просто запустить их в цикле for?
Я был бы очень признателен за вашу помощь в поиске правильного подхода к этому проекту.
Спасибо,