многопоточность нескольких коротких задач в C ++ 11 замедляет процесс? - PullRequest
0 голосов
/ 17 октября 2018

Я не очень опытен, когда дело доходит до многопоточности.У меня есть детектор наземных ориентиров, который обнаруживает 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?

Я был бы очень признателен за вашу помощь в поиске правильного подхода к этому проекту.

Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...