Форум программистов, компьютерный форум, киберфорум
MPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 10.04.2021
Сообщений: 75

Циклическое распределение столбцов матрицы ленточным способом по процессам

26.11.2023, 15:59. Показов 1219. Ответов 2

Студворк — интернет-сервис помощи студентам
Помогите изменить программу так, чтобы столбцы распределялись циклически по процессам ленточным способом с использованием MPI.

Вся задача: В целочисленной матрице MxN обнулить все числа, которые являются составными. Матрица должна быть распределена по процессам ленточным способом в чередующихся столбцах.
**Каждый раз процесс должен принимать по 1 столбцу, пока не закончатся столбцы. Транспонировать матрицу нельзя.

Как-то тяжело дается распараллеливание процессов...Помогите, чем сможете.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
 
const int ncolumns = 15;//количество строк
const int columnlen = 6;//количество столбцов
int main(int argc, char** argv)
{
    int** A = NULL;   // 2D массив, инициализированный в процессе 0 
    int* Adata = NULL;
    int* sendbufptr = NULL;
    int i, j;
    int** rows;  // 2D массив для строк 
    int* columndata;   // Хранилище данных для 1D массива строк 
 
    int my_rank, p;
    MPI_Datatype vector_mpi_t;
 
    MPI_Init(&argc, &argv);
 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
 
    // Инициализация 2D массива в процессе 0 и выделение памяти 
    if (my_rank == 0){
        A = (int**)malloc(ncolumns * sizeof(int*));
        Adata = (int*)malloc(ncolumns * columnlen * sizeof(int));
        for (i = 0; i < ncolumns; i++)
            A[i] = &(Adata[i * columnlen]);
        int y=1;
        for (i = 0; i < ncolumns; i++)
            for (j = 0; j < columnlen; j++)
                A[i][j] = ++y;
 
        // Вывод 2D массива на экран 
        printf("Rank 0's 2D array:\n");
        for (i = 0; i < ncolumns; i++)
        {
            for (j = 0; j < columnlen; j++)
                printf("%3ld ", A[i][j]);
            printf("\n");
        }
        printf("\n");
        printf("\n");
    }
    // Инициализация и выделение памяти для 1D массива столбцов на каждом процессе 
    columndata = (int*)malloc((ncolumns / p) * columnlen * sizeof(int));
    rows = (int**)malloc((ncolumns / p) * sizeof(int*));
    for (i = 0; i < (ncolumns / p); i++){
        rows[i] = &(columndata[i * columnlen]);
    }
 
    // Производный тип данных для столбцов 2D массива 
    MPI_Type_vector(columnlen, 1, 1, MPI_INT, &vector_mpi_t);
    MPI_Type_commit(&vector_mpi_t);
 
    sendbufptr = NULL;
    if (my_rank == 0) sendbufptr = &(A[0][0]);
    MPI_Scatter(sendbufptr, (ncolumns / p), vector_mpi_t, &(rows[0][0]), (ncolumns / p), vector_mpi_t, 0, MPI_COMM_WORLD);
 
    // Вывод столбцов на каждом процессе 
    printf("Rank %d's columns: \n", my_rank);
    for (i = 0; i < ncolumns / p; i++){
        for (j = 0; j < columnlen; j++){
            if ((rows[i][j] % 2 == 0 || rows[i][j] % 3 == 0 || rows[i][j] % 4 == 0 || rows[i][j] % 5 == 0 || rows[i][j] % 6 == 0 || rows[i][j] % 7 == 0
                || rows[i][j] % 8 == 0 || rows[i][j] % 9 == 0 || rows[i][j] % 10 == 0) && (rows[i][j] != 2 && rows[i][j] != 3 && rows[i][j] != 5 && rows[i][j] != 7)) {
                rows[i][j] = 0;
            }
            printf("%3ld ", rows[i][j]);
        }printf("\n");
    }
 
    // Сбор данных на 0 процессе 
    int* recvbufptr = NULL;
    if (my_rank == 0) recvbufptr = &(A[0][0]);
    MPI_Gather(&(rows[0][0]), (ncolumns / p), vector_mpi_t, recvbufptr, (ncolumns / p), vector_mpi_t, 0, MPI_COMM_WORLD);
 
    // Вывод собранных данных на 0 процессе 
    if (my_rank == 0)
    {
        printf("\nRank 0's gathered array:\n");
        for (i = 0; i < ncolumns; i++)
        {
            for (j = 0; j < columnlen; j++)
                printf("%3ld ", A[i][j]);
            printf("\n");
        }
    }
 
    MPI_Type_free(&vector_mpi_t);
    MPI_Finalize();
 
    free(rows);
    free(Adata);
    free(A);
    
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2023, 15:59
Ответы с готовыми решениями:

MPI C++ Перемножение матриц ленточным способом по строкам
Необходимо реализовать перемножение двух матриц в MPI ленточным способом, при этом алгоритм предполагает, что в подзадачах располагаются не...

Циклическое смещение столбцов матрицы
Провести такое преобразование матрици А(m,n) (m&lt;=5, n&lt;7), при котором последний столбик займет место первого, а все остальные сместятся на...

Вывести результаты обработки матрицы паралелльным способом, указав при выводе распределение итераций по потокам
В продолжении заголовка: .....для разных значений опции schedule. Полностью задание: нужно написать программу, которая будет выполнять...

2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
27.11.2023, 13:35
В чём конкретно вопрос?

Добавлено через 56 секунд
Люди, учитесь понятно задавать вопросы!
Или все догадываться должны что вам нужно и что вас не устраивает?
0
1 / 1 / 0
Регистрация: 10.04.2021
Сообщений: 75
27.11.2023, 17:14  [ТС]
Цитата Сообщение от ne_master Посмотреть сообщение
Помогите изменить программу так, чтобы столбцы распределялись циклически по процессам ленточным способом с использованием MPI.
Я же написала, что не получается переделать программу под задание. Само задание я понимаю, а реализовать не получается...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.11.2023, 17:14
Помогаю со студенческими работами здесь

Блочное и циклическое распределение цикла
Всем привет, вообщем мне нужна ваша помощь. стоит задача по сути простая, но как сделать я не знаю=(( Дана целочисленная прямоугольная...

Распределение одинаковых символов случайным способом по условию
Помогите пожалуйста, есть необходимость распределить по случайным ячейкам таблицы символ “x”. Если есть возможность помочь, я скину...

Циклическое увеличение/уменьшение столбцов диаграммы (компонент TChart)
реализовать параллельное выполнение двух независимых задач. 1. Алгоритм, определяющий является ли число простым. 2. Циклическое...

Циклическое смещение элементов квадратной матрицы
Совершить циклическое смещение элементов квадратной матрицы размерности NxN вправо на К элементов таким образом: элементы 1 рядка смещаются...

Осуществить циклическое смещение элементов прямоугольной матрицы
Осуществить циклическое смещение элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима), n...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru