Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Помогите пожалуйста на основе кода реализовать параллельный алгоритм вычисления скалярного произведения в рамках функции 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


23:24.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru