@chestik

Как распараллелить цикл с помощью thread?

Переменная len всегда равна 32, поэтому делю на 4 потока, каждый из которых по идее должен выполнить по 8 вычислений, но получается так, что время вычислений увеличивается по сравнению с одним потоком. Что делаю не так?
Сам цикл:
vector<thread> thds;
for (int i = 0; i < len; i = i+4) { // основной цикл умножения
		thds.emplace_back(thread (multi, x, y, ref(res), len, i));
		thds.emplace_back(thread(multi, x, y, ref(res), len, i+1));
		thds.emplace_back(thread(multi, x, y, ref(res), len, i+2));
		thds.emplace_back(thread(multi, x, y, ref(res), len, i+3));
		thds[i].join();
		thds[i+1].join();
		thds[i+2].join();
		thds[i+3].join();
		//cout << i << endl;
	}

Функция:
void multi(vector<int>& x, vector<int>& y, vector<int>& res, int len, int i) {
	for (auto j = 0; j < len; ++j)
		res[i + j] += x[i] * y[j];
}


PS За реализацию прошу сильно не ругать, первый раз работаю с потоками.
  • Вопрос задан
  • 2968 просмотров
Пригласить эксперта
Ответы на вопрос 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
А зачем создавать потоки каждый раз в цикле? Лучше сначала создать нужное количество потоков с учётом их количества в системе и потокам отдавать диапазон для вычислений. Может стоит взять что-то готовое вроде en.cppreference.com/w/cpp/thread/async смотреть пример внизу, там как раз идёт параллельное суммирование элементов вектора. Обратите внимание, что если меньше 1000 элементов, потоки вообще не создаются.
Ответ написан
@exaw
Для организации параллельных вычислений обычно используют OpenMP или Intel tbb. Там планирование, балансировка, создание потоков идёт из коробки. Попробуйте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы