Задать вопрос
@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 За реализацию прошу сильно не ругать, первый раз работаю с потоками.
  • Вопрос задан
  • 3076 просмотров
Подписаться 2 Оценить 3 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Нетология
    Специалист по информационной безопасности + нейросети
    12 месяцев
    Далее
  • Компьютерная академия «TOP»
    Учебная программа “Разработка программного обеспечения”
    30 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
А зачем создавать потоки каждый раз в цикле? Лучше сначала создать нужное количество потоков с учётом их количества в системе и потокам отдавать диапазон для вычислений. Может стоит взять что-то готовое вроде en.cppreference.com/w/cpp/thread/async смотреть пример внизу, там как раз идёт параллельное суммирование элементов вектора. Обратите внимание, что если меньше 1000 элементов, потоки вообще не создаются.
Ответ написан
@exaw
Для организации параллельных вычислений обычно используют OpenMP или Intel tbb. Там планирование, балансировка, создание потоков идёт из коробки. Попробуйте.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы