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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2017, 12:28   #1
Live_Death
Новичок
Джуниор
 
Регистрация: 12.12.2017
Сообщений: 1
По умолчанию Параллельное программирование в С++

Написать multithread-подпрограмму, получающую в качестве аргументов n х n
массив a вещественных чисел, целое число n, номер задачи (thread) k, общее количество
задач (threads) p, и заменяющую матрицу а на матрицу (а+аt)/2 (1), где аt –
транспонированная матрица а. При этом должна быть обеспечена равномерная загрузка всех
задач. Основная программа должна вводить числа p, n и массив a (из файла или по заданной
формуле), запускать задачи, вызывать эту подпрограмму и выводить на экран результат ее
работы.
Код:
#include "library.h"
#pragma warning(disable : 4996)
int array[SIZE][SIZE];
 
void save_result(char * file_name)
{
    
    FILE* f = fopen(file_name, "w");
    if (!f)
    {
        fprintf(stderr, "Ошибка открытия файла для записи результата.\n");
        MPI_Abort(MPI_COMM_WORLD, errno);
    }
    for ( int j = 0; j<SIZE; j++)
    {
        for (int i = 0; i<SIZE; i++)
            fprintf(f, "%d ", array[i][j]);
        fprintf(f, "\n");
    }
    fclose(f);
}
int main(int argc, char *argv[])
{
    int myrank, nproc;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    printf("Master started. My rank is %d, npr is %d\n", myrank, nproc);
    MPI_Status status;
    int tmp_dim = SIZE / (nproc - 1);
    int tmp_begin = 0;
    int tmp_end;
    int * tmp_arr;
    int tmp_size;
    int i, j, k;
    int r;
    for (i = 0, k = 0; i<SIZE; i++) //заполняем массив
        for (j = 0; j<SIZE; j++)
            array[j][i] = k++;
    save_result("in.txt"); //сохраняем результат в файл
    for (r = 0; r<nproc; r++) //рассылаем задания
    {
        if (r == myrank) continue;
        if (r == nproc - 1 && nproc>2)
            tmp_dim = SIZE - (nproc - 2)*tmp_dim;
        tmp_size = tmp_dim*SIZE * sizeof(int);
        tmp_arr = static_cast <int*> (malloc(tmp_size));
        tmp_end = tmp_begin + tmp_dim;
        for (i = tmp_begin, k = 0; i<tmp_end; i++)
            for (j = 0; j<SIZE; j++)
                tmp_arr[k++] = array[j][i];
        MPI_Send(&tmp_begin, 1, MPI_INT, r, 0, MPI_COMM_WORLD);
        MPI_Send(&tmp_end, 1, MPI_INT, r, 1, MPI_COMM_WORLD);
        MPI_Send(tmp_arr, tmp_size / sizeof(int), MPI_INT, r, 2, MPI_COMM_WORLD);
        printf("Master sent (%d-%d) to slave rank %d.\n", tmp_begin, tmp_end, r);
        free(tmp_arr);
        tmp_begin = tmp_end;
    }
    for (r = 0; r<nproc; r++) //получаем ответы
    {
        if (r == myrank) continue;
        printf("Master waiting for slave rank %d...\n", r);
        MPI_Recv(&tmp_begin, 1, MPI_INT, r, 0, MPI_COMM_WORLD, &status);
        MPI_Recv(&tmp_end, 1, MPI_INT, r, 1, MPI_COMM_WORLD, &status);
        MPI_Recv((int*)array + (tmp_begin*SIZE), (tmp_end - tmp_begin)*SIZE, MPI_INT, r, 2, MPI_COMM_WORLD, &status);
        printf("Master received (%d-%d) from slave rank %d.\n", tmp_begin, tmp_end, r);
    }
    save_result("out.txt"); //сохраняем результат в файл
    printf("Master ended.\n");
    MPI_Finalize();
 
 
 
    system("pause");
    return 0;
}
library.h
Код:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<mpi.h>
#define SIZE 1024
Ошибка при запуске программы.Помогите исправить!Заранее благодарен!
error.png
Live_Death вне форума Ответить с цитированием
Старый 12.12.2017, 12:31   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И? Написано ж, деление на 0.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параллельное программирование Dass Помощь студентам 8 15.09.2011 23:38
Параллельное программирование DENiskaKURT Помощь студентам 2 26.02.2011 13:31
Параллельное программирование L10n Помощь студентам 5 05.08.2010 15:13
Параллельное программирование mages Общие вопросы C/C++ 18 25.12.2009 17:59
Параллельное программирование Ugly Win Api 7 16.03.2008 15:33