Написать программу в C++
Сгенерировать два вектора одинаковой длины и вычислить, используя потоки, скалярное произведение. Расчеты проведете на четырех, восьми и шестнадцати. Подсчитаете эффективность и ускорение вычислений. На одном потоке программа должна работать 3-4 секунды, соответственно, выбирайте большую размерность вектора.
Комментарии к заданию:
В программе ничего не вводится. Сразу прописывайте размерность массивов. Программа на одном потоке должна считать 3-4 секунды. Время выдавать в секундах и три знака миллисекунд
Исходные данные для задания многопоточно генерируем, считать время не нужно, количество потоков - количество ядер в вашей системе.
Расчет эффективности = Ускорение / количество потоков.
C/C++
Помогите пожалуйста решить задачу, буду благодарен
Вот пример программы на C++, которая генерирует два вектора заданной длины, вычисляет скалярное произведение с помощью потоков и выводит на экран время работы, эффективность и ускорение:
#include
#include
#include
#include
using namespace std;
// Функция, вычисляющая скалярное произведение векторов
double dot_product(const vector& a, const vector& b)
{
double result = 0.0;
for (size_t i = 0; i < a.size(); ++i) {
result += a[i] * b[i];
}
return result;
}
int main()
{
const size_t size = 10000000; // Длина векторов
vector a(size);
vector b(size);
// Генерация случайных значений векторов
for (size_t i = 0; i < size; ++i) {
a[i] = static_cast(rand()) / RAND_MAX;
b[i] = static_cast(rand()) / RAND_MAX;
}
// Вычисление скалярного произведения на 1, 2, и 4 потоках
for (int num_threads = 1; num_threads
Ильдар Хасенов
Нужно наподобие такого

#include
#include
#include
#include
#include
// Функция для генерации случайных чисел в указанном диапазоне
double generate_random_number(double min, double max)
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution dis(min, max);
return dis(gen);
}
// Функция для вычисления скалярного произведения векторов
double scalar_product(const std::vector& a, const std::vector& b)
{
double result = 0.0;
#pragma omp parallel for reduction(+:result)
for (size_t i = 0; i < a.size(); ++i)
{
result += a[i] * b[i];
}
return result;
}
int main()
{
// Задаем размерность векторов
size_t vector_size = 10000000;
// Генерируем два вектора с случайными значениями
std::vector vector1(vector_size);
std::vector vector2(vector_size);
for (size_t i = 0; i < vector_size; ++i)
{
vector1[i] = generate_random_number(1.0, 10.0);
vector2[i] = generate_random_number(1.0, 10.0);
}
// Вычисляем скалярное произведение на одном потоке
double start_time = omp_get_wtime();
double scalar_product_single_thread = scalar_product(vector1, vector2);
double end_time = omp_get_wtime();
double time_single_thread = end_time - start_time;
// Вычисляем скалярное произведение на многопоточности с количеством потоков равным количеству ядер
int num_threads = omp_get_num_procs();
start_time = omp_get_wtime();
double scalar_product_multithread = scalar_product(vector1, vector2);
end_time = omp_get_wtime();
double time_multithread = end_time - start_time;
// Вычисляем эффективность и ускорение
double efficiency = time_single_thread / (time_multithread / num_threads);
double speedup = time_single_thread / time_multithread;
// Выводим результаты
std::cout
Ильдар Хасенов
Нужно наподобие такого

Похожие вопросы
- Помогите пожалуйста решить задачу на языке С#.
- Помогите пожалуйста решить задачу по с++
- Помогите пожалуйста решить задачу на Си
- Программирование С++. Помогите, пожалуйста, решить задачу.
- Помогите, пожалуйста, решить задачу.
- Помогите пожалуйста решить задачу на языке СИ или С# !!!
- Помогите пожалуйста решить задачу на C ИЛИ C#
- Помогите пожалуйста решить задачу на С#
- Помогите пожалуйста решить задачу
- Помогите, пожалуйста, решить задачу C++.