Matrices con punteros

Iniciado por Skali, 15 Mayo 2018, 18:48 PM

0 Miembros y 1 Visitante están viendo este tema.

Skali

Buenas! Qué tal? Les comento mi problema. Necesito enviar el offset de cada fila de una matriz cuadrada a través de la función MPI_Send(). La matriz está implementada a través de punteros, por lo cuál sus valores se almacenan en la heap y no en el stack como ocurre con las matrices comunes de la forma: matriz[fila][columna]. Les muestro como las estoy implementando. Imaginemos que en éste caso tenemos una matriz de 4x4 y la inicializamos con 1 en todos sus campos.

//Dimension de la matriz cuadrada
int N = 4;

//Declaracion de la matriz
int *A;

//Alocacion de memoria dinamica para la matriz
A = (int *) malloc(sizeof(int) * N * N);

//Inicializacion de todos los campos de la matriz en 1
for (int fila=0; fila<N; fila++) {
    for (int columna=0; columna<N; columna++) {
        A[fila*N+columna]=1;
    }
}


La matriz resultante en éste caso sería una matriz asi:

1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

Ahora lo que necesito es enviar la dirección de cada fila a través de la función MPI_Send(), la cuál en su primer parámetro recibe un puntero a buffer. Aca les dejo una parte del manual de Mpi_Send:

Citar#include <mpi.h>
int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest,
    int tag, MPI_Comm comm)

Input Parameters

buf
    Initial address of send buffer (choice).
count
    Number of elements send (nonnegative integer).
datatype
    Datatype of each send buffer element (handle).
dest
    Rank of destination (integer).
tag
    Message tag (integer).
comm
    Communicator (handle).

Lo que no se es cómo enviar el primer parámetro, me estoy volviendo loco con los tipos  de datos y los punteros. Espero que me puedan dar una mano. Las matrices si o si deben utilizarse con memoria dinámica como mencioné en el código de arriba. Muchas gracias desde ya. Saludos

MAFUS

La dirección será &A[fina*N]

Si hubieras hecho una verdadera matriz cuadrada la fila sería A[fila], más intuitivo.

Skali

Hola MAFUS! Muchisimas gracias por la respuesta y por la velocidad en responder! :D. Resulta que estaba usando bien la dirección, pero el problema me surgía al estar usando mal el segundo parámetro:

Citar
count
    Number of elements send (nonnegative integer).

Más detalladamente, estaba paralelizando a través de MPI una multiplicación de matrices. A cada proceso worker le divido una parte del for que hace referencia a la fila, y para ello estaba usando las variables base y tope. Al segundo parámetro estaba enviando:

(base - tope) * N

cuando lo correcto sería:

(tope - base) * N

Un error muy tonto... En fin, gracias nuevamente por la respuesta. Me fue de mucha ayuda.

Saludos!