Я хочу оптимизировать свой последовательный код, чтобы сделать градиент.Почему использование более двух потоков потребляет больше времени?
Основной поток вычисляет градиент для границы изображения и других потоков, каждый из которых вычисляет градиент для фрагмента изображения, , используя 2 потока и основной поток, дает результат лучше, чем последовательный код, но с использованием более 2 нить, но он потребляет больше времени и выглядит хуже, чем последовательный.
Я попробовал этот код, чтобы ускорить процесс градиента:
for (int n = 0; n<iter_outer; n++)
{
int chunk = 1 + ((row - 1)/num_threads); //ceiling
int start=0;
int end=0;
//Launch a group of threads
for (int tid = 0; tid < num_threads; ++tid)
{
start = tid * chunk;
end = start + chunk;
t[tid] = thread(gradient, tid, g, vx, vy, row, col, 1, start, end);
}
//Launched from the main;
gradient(1, g, vx, vy, row, col,0, start, end);
//Join the threads with the main thread
for (int i = 0; i < num_threads; ++i)
{
t[i].join();
}
}
Сколько ядер имеет ваша машина? Возможно 2? – NathanOliver
Каждый раз, когда вы переключаетесь между потоками, вам требуется время для настройки нового контекста. –
Для коротких рабочих потоков существует точка, в которой накладные расходы на создание потока (и переключение между контекстами) отменяет коэффициент усиления от нескольких потоков. Я подозреваю, что ваш образ слишком мал. –