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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2016, 20:34   #1
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию При распараллеливании программы и запуске её в Linux не обрабатываются первые два элемента первой строки матрицы

ura_111, спасибо Вам! Я поняла. Не слишком ли я много занимаю Вашего времени? Уже не удобно к Вам обращаться, но если можете посмотрите, пожалуйста, еще программу...
Тема: "Реализация матричных операций с использованием коллективных взаимодействий процессов".

Задание: Дана действительная матрица A(n, n). Преобразовать эту матрицу, поэлементно вычитая значение последней строки из значений всех её строк, кроме последней. Запуск программы в ОС Linux. К сожалению, не могу прикрепить скрин, т.к. нет под рукой Linux...

Проблема в том, что при распараллеливании программы и запуске её в Linux не обрабатываются первые два элемента первой строки матрицы. В последовательном варианте и запуске в Windows (без MPI) - программа работает!

Код:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cmath>
#include "mpi.h"
#include<iomanip>

using namespace std;
const int N = 3;

int main(int argc, char *argv[])
{
      setlocale(0, "");
      int i, j, rank=0, size = 1, chunk, mas2[N][N], sum = 0;
      double mas[N][N], mas1[N][N];

      MPI_Status status;
      MPI_Init(&argc, &argv);
      MPI_Comm_rank(MPI_COMM_WORLD, &rank);
      MPI_Comm_size(MPI_COMM_WORLD, &size);

      if (rank == 0)
     {
        for (i = 0; i < N; i++)
       {
         for (j = 0; j < N; j++)
         {
           mas[i][j] = rand() % 10;
          }
        }
        chunk = N / size;
       }

       MPI_Bcast(&chunk, 1, MPI_INT, 0, MPI_COMM_WORLD);

       cout << endl;
       cout << "Первоначальная матрица: " << endl;
       cout << endl;
       for (i = 0; i < chunk; i++)
      {
        for (j = 0; j < chunk; j++)
       {
         mas1[i][j] = rand() % 10;
         cout << setw(3) << mas1[i][j] << " ";
       }
       cout << endl << endl;
      }

      MPI_Scatter(mas, chunk, MPI_DOUBLE, mas1, chunk, MPI_DOUBLE, 0,     MPI_COMM_WORLD);

      for (int i = 0; i < chunk - 1; ++i)
     {
       for (int j = 0; j < chunk; ++j)
      {
        mas2[i][j] = mas1[i][j] - mas1[N - 1][j];
        mas2[N - 1][j] = mas1[N - 1][j];
      }
     }

      MPI_Gather(mas1, chunk, MPI_DOUBLE, mas, chunk, MPI_DOUBLE, 0, MPI_COMM_WORLD);

      if (rank == 0)
     {
       cout << endl;
       cout << "Преобразованная матрица: " << endl << endl;
       for (i = 0; i < N; i++)
      {
        for (j = 0; j < N; j++)
        {
         cout << setw(3) << mas2[i][j] << " ";
        }
         cout << endl << endl;
        }
     }

    MPI_Finalize();
    system("pause");
    return 0;
}
Novichok2016 вне форума Ответить с цитированием
Старый 04.06.2016, 20:42   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Пока я не могу. Выложи программу в новой ветке (на всеобщее обозрение). Может кто-нибудь раньше просмотрет.

У меня нет люнекса.

Последний раз редактировалось ura_111; 04.06.2016 в 20:48.
ura_111 вне форума Ответить с цитированием
Старый 04.06.2016, 21:06   #3
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Пока я не могу. Выложи программу в новой ветке (на всеобщее обозрение). Может кто-нибудь раньше просмотрет.

У меня нет люнекса.
Я выкладывала уже, просмотров много, а ответов нет. А в Windows ещё... Необходимо возвести матрицу во вторую степень. Последовательный код я написала, он работает....

Код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <ctime>

using namespace std;

int main()
{
	setlocale(0, "");
	int const n = 3;
	int a[n][n], c[n][n];
	cout << endl;
	cout << "Матрица А: " << endl << endl;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			a[i][j] = rand() % 10 + 1;
			cout << setw(3) << a[i][j] << "      ";
		}
		cout << endl;
	}
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			c[i][j] = 0;
			for (int k = 0; k < n; ++k)
			{
				c[i][j] = c[i][j] + a[k][j] * a[i][k];
			}
		}
	}
	cout << endl;
	
	cout << "Матрица А*А: " << endl << endl;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << setw(3) << c[i][j] << "      ";
		}
		cout << endl;
	}
	cout << endl;
	
	system("pause");
	return 0;
}
Но нужно решить задачу параллельно с использованием метода
сдваивания. По описанию метода обработку двумерного массива нужно свести к одномерному виду... Например, если бы по заданию требовалось организовать параллельное выполнение умножения матрицы на вектор, по последовательный код ...
Код:
Код:
for (i = 0; i < m; i++)
{
   c[i] = 0;
   for (j = 0; j < n; j++)
   {
     c[i] += A[i][j]*b[j]
   }
}
... заменился бы на функцию потока...
Код:
void SerialResultCalculation(double* pMatrix, double* pVector, double* pResult, int Size, int N)
{
   int i, j; // переменные для организации цикла
   for (i=0; i<Size; i++) 
   {
     for (j=0; j<N; j++)
     pResult[i] += pMatrix[i*N+j]*pVector[j];
   }
}
Вопрос: не могу написать функцию потока для условия своей задачи (возведения матрицы в "квадрат")
Novichok2016 вне форума Ответить с цитированием
Старый 04.06.2016, 22:05   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Мне нужно твоя помощь. Ты мне расскажи все что знаешь и что не получается. Только не здесь на ютубе (у меня канал на нём). Я создал новое видео, ссылка вот:

https://www.youtube.com/watch?v=G-C2dn-Wg1k&edit=vd

Под ним, в качестве комментариев, и будем общаться. Создай себе профиль на ютубе (под именем Novichok2016).
Нужно синхронизовать время выхода на связь. Вместе будем решать твою задачу.

Последний раз редактировалось ura_111; 05.06.2016 в 11:26.
ura_111 вне форума Ответить с цитированием
Старый 04.06.2016, 22:48   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В чем прикол общаться в комментах ютуба? Они ж неудобные.

Не проще уж тогда например скайп или вк взять? (из самого популярного)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.06.2016, 22:59   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Никакого прикола нет, просто первое что пришло в голову.
Мне все равно где общаться.

Хотя для скайпа у меня нет оборудования (веб, гарнитуры). А вк - фамилию не хочется разглашать.
ura_111 вне форума Ответить с цитированием
Старый 04.06.2016, 23:04   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В скайпе текстовый чат есть.
Который не грузится 4 секунды при каждом обновлении страницы и не скрывает сообщения
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.06.2016, 01:19   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
#include <thread>
Старенький он уже, но гад, работает.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 05.06.2016, 02:33   #9
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Кто старенький?
thread? Всего-то пять лет )))
Croessmah вне форума Ответить с цитированием
Старый 05.06.2016, 11:27   #10
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Мне нужно твоя помощь. Ты мне расскажи все что знаешь и что не получается. Только не здесь на ютубе (у меня канал на нём). Я создал новое видео, ссылка вот:

https://www.youtube.com/watch?v=G-C2dn-Wg1k&edit=vd

Под ним, в качестве комментариев, и будем общаться. Создай себе профиль на ютубе.
Нужно синхронизовать время выхода на связь. Вместе будем решать твою задачу.
Вам какое время удобно? Я сейчас могу
Novichok2016 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отсортировать строки матрицы по возрастанию первого элемента строки. Не работает код в Паскале. Что исправить? kyle16 Паскаль, Turbo Pascal, PascalABC.NET 2 28.04.2016 18:48
ошибка при запуске программы с++ IVT27 Помощь студентам 4 11.11.2012 18:09
Есть три программы. Их нужно объеденить в одну, тоесть чтоб при запуске программы были пункты меню для каждой из программ afirat Помощь студентам 9 28.04.2012 12:39
Даны 2-е матрицы размерностью 40,40. Выполнить перестановку первой и последней строки. V1rus.25 Паскаль, Turbo Pascal, PascalABC.NET 9 22.04.2012 11:06
DBGrid при запуске курсор не на первой позиции Alana БД в Delphi 4 16.04.2012 10:50