Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2018, 09:26   #1
drako08
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 30
По умолчанию Распараллелить скалярное произведение векторов

Помогите пожалуйста на основе кода реализовать параллельный алгоритм вычисления скалярного произведения в рамках функции double scalmult (int n, double* a, double* b). В качестве имени функции на каждом процессе должно возвращаться вычисленное значение скалярного произведения,воспользоваться функцией глобальной редукции, чтобы собрать полученные результаты.

Код:
#include <stdio.h>
#include "mpi.h"
#include <iostream>
using namespace std;
 
// Функция выделения памяти под вектор
double* malloc_array(int n)
{
    double* a = new double[n];
    return a;
}
 
// Функция освобождения памяти 
int free_array(double*a, int n)
{
    delete[] a;
    return 0;
}
double scalmult(int n, double* a, double* b)
{
    // Определения числа доступных процессов и размера подзадач
 
    // Вычисление скалярного произведения
    double sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += a[i] * b[i];
    }
    sum = sqrt(sum);
    return sum;
}
 
int main(int argc, char **argv)
{
 
    // Иницилизация MPI
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
 
    // Определение размера задачи и подзадач
    int n = 100;
    int n1 = n / size;
    if (rank < n - n1 * size) n1++;
 
    // Выделение памяти 
    double *a = malloc_array(n1);
    double *b = malloc_array(n1);
 
    // Заполнение векторов
    for (int i = 0; i < n1; i++)
    {
        a[i] = (double) rand() / RAND_MAX;
        b[i] = (double) rand() / RAND_MAX;
    }
 
    double sc = scalmult(n, a, b);
 
    if (rank == 0) {
        cout << "The Program is RUN on " << size << " CPU" << endl;
    }
 
    free_array(a, n);
    free_array(b, n);
    MPI_Finalize();
    return 0;
}
drako08 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скалярное умножение векторов(Структуры и классы) MAx721 Общие вопросы C/C++ 5 10.10.2015 12:46
Программа на скалярное произведение векторов вася радугов Помощь студентам 3 21.09.2011 22:40
скалярное произведение векторов Wika17 Паскаль, Turbo Pascal, PascalABC.NET 1 29.12.2010 11:32
скалярное произведение tilperion777 Паскаль, Turbo Pascal, PascalABC.NET 0 11.04.2010 16:13