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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 00:56   #1
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию MPI, передача двумерных массивов

Попыталась описать проблему в тексте программы, зелененьким цветом
если что не понятно прошу не бить) Если нужно уточню!!
С С++ работаю недавно с MPI тем более...может я что то упустила?
Код программы:
Код:
#include<iostream>
#include<math.h>
#include<mpi.h>

using namespace std;
const int n = 8;
int rank;
void Strassen(int **A, int **B, int **A12A21, int m, int cp)
{   int rank;
	MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

// здесь я пыталась проделать то же самое, что в main , передав 
//указатели на динамические массивы, но ругается на недопустимость
 //памяти, передать статический массив я не могу. Может быть вы 
//подскажете как можно передать двумерный стат массив в //функцию
}

int main(int argc, char * argv[])
{   
	
	int rank, cp, rowNum;
	int matrix[n][n] = 
	{
		{1, -2, 5, 6, 7, 4, 2, 6},
		{8,  9, 2, 1, 4, 6, 2, 0},
		{7,  8, 9, 2, 3, 1, 0, 4}, 
		{4,  5, 8, 9, 7, 2, 1, 1},
		{1,  2, 5, 1, 4, 8, 6, 3},
		{3,  5, 2, 1, 4, 8, 9, 4},
		{2,  3,14,-5, 6,-1, 2, 1},
		{-8,12, 2, 4, 3, 7, 4,-8}
	};
	int A12[n/2][n/2], A21[n/2][n/2], A12A21[n/2][n/2];
// попытка с динамическими массивами
	 // int **A12=new int*[n/2];
	 // int **A21=new int*[n/2];
	 // int **A12A21=new int*[n/2];
	 // for (int i = 0; i < n/2; i++)
	 // {
		//A12[i] = new int[n/2]; //создаём матрицу указателей
		//A21[i] = new int[n/2];
		//A12A21[i] = new int[n/2];
	 // }

	// вычисление элементов А12 и А21
	for (int i = 0; i< n/2; i++)
	for (int j = 0; j< n/2; j++)
	{
		A12[i][j] = matrix[i][j+n/2];
		A21[i][j] = matrix[i+n/2][j];
	}; 
    
	MPI_Init(&argc,&argv);
	MPI_Comm_size(MPI_COMM_WORLD, &cp); // получаем кол-во процессов
	MPI_Comm_rank(MPI_COMM_WORLD, &rank); // опредляем норме процесса в комуникаторе
	//	Strassen(A12, A21, A12A21, n/2, cp);
        int rowMatrix[n][4], colMatrix[n/2][n/2], p;
	if (n < 60) //обычный алгоритм умножения
	{      
        int m = 4;
        int rowNum = m/cp;

// в функции MPI_Scatter и MPI_Gather я передаю стат двумерные
// массивы и все работает хорошо, если пытаюсь передать динамический
// массив  ошибка с памятью
               MPI_Scatter(A21,rowNum*m,MPI_INT,rowMatrix,rowNum*m,MPI_INT,0,MPI_COMM_WORLD); // полосы матрица A
		
	        for (int i=0; i<rowNum; i++) {
		for (int j=0; j<m; j++)
		{
			rowMatrix[i][j]= -rowMatrix[i][j];
		}};

		MPI_Gather(rowMatrix,rowNum*m,MPI_INT,A21,rowNum*m,MPI_INT,0,MPI_COMM_WORLD);
		if (rank == 0)
			for (int i = 0; i < m; i++)
			{
				for (int j = 0; j < m; j++)
				{
					cout<<A21[i][j]<<" ";
				}
				cout<<"\n";
			}; 
	} 
	MPI_Finalize();
}
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Старый 12.06.2011, 16:14   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Rekky, я не работал с MPI, но, по опыту использования других мат. библиотек (Фортрановских и С-шных), рискну предположить, что и в ней где-то должно быть требование о том, что двумерный массив, передаваемый в подпрограмму, должен представлять собою связную область памяти. Коего требования механизм двухэтапного выделения памяти под двумерный массив в C/C++ (массив указателей на массивы.... ) не обеспечивает. Работайте с динамическим одномерным массивом, как с двумерным, через приведенный индекс.
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распределение двумерных массивов в MPI ниче_не_знаю Общие вопросы C/C++ 2 14.05.2010 18:30
Распределение двумерных массивов в MPI ниче_не_знаю Общие вопросы C/C++ 0 14.05.2010 17:43
обработка двумерных массивов... Mizantrop Помощь студентам 2 25.03.2010 09:11
Гики двумерных массивов Кипящий чайник Общие вопросы C/C++ 13 02.02.2010 13:25
передача двумерных массивов в функцию Wast Общие вопросы C/C++ 2 04.05.2009 23:04