2015-06-02 4 views
1

Я пытаюсь написать на файл различных матриц, каждая обрабатывается другим процессом MPI, mergin их содержание, как описано в следующем изображении:Запись на файл, используя другой вид для каждого процесса МПИ

enter image description here

Есть ли способ получить желаемый результат с помощью подходящего MPI-View? Чтобы ответить на вопрос, я присоединяю простой код, где в отношении предыдущего изображения белые столбцы также включаются в выходной файл.

#include <mpi.h> 
#define N 6 

int main(int argc, char **argv) { 

    double A[N*N]; 
    int mpi_rank, mpi_size; 

    MPI_File file; 
    MPI_Status status;  

    MPI_Init(NULL, NULL); 
    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); 

    MPI_File_open(MPI_COMM_WORLD, "test.dat", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &file); 

    MPI_Datatype my_type; 
    MPI_Type_vector(N, N, N*mpi_size, MPI_DOUBLE, &my_type); 
    MPI_Type_commit(&my_type); 

    MPI_Offset disp = mpi_rank*N*sizeof(double); 
    MPI_File_set_view(file, disp, MPI_DOUBLE, arr_type, "native", MPI_INFO_NULL); 

    MPI_Datatype row_type; 
    MPI_Type_contiguous(N, MPI_DOUBLE, &row_type); 
    MPI_Type_commit(&row_type); 

    MPI_File_write(file, A, N, row_type, &status); 

    MPI_File_close(&file); 
    MPI_Finalize(); 

    return 0; 
} 

ответ

1

Я восхищаюсь вашей отрасли в Переизобретая MPI_TYPE_SUBARRAY, но, конечно, вы можете просто сделать это вместо того, чтобы создавать арендуемая-из-векторов?

Вы так близко. Чтобы опустить ячейки-призраки из вашего вывода, я бы просто определил тип памяти subaray, который не описывает их.

Я думаю, что это может быть сделано с N-1 вместо N до длины блока вектора ... но просто используйте подмассиву и сделайте его более понятным. Давным-давно, векторы вроде этого были действительно идиоматическим MPI, но MPI-2 вводил типы подмассивов в 1995 году, поэтому я думаю, что вы хорошо используете эту «новомодную» функцию.

Вы действительно можете сдвинуть представление файла с помощью параметра смещения. Вы также можете запустить каждый файл со смещением 0 и вместо этого изменить аргументы subarray-in-file. Все процедуры будут иметь одинаковые значения «глобального массива». вы отрегулировали бы начало [] и, возможно, счетчик [] для каждого процессора.

Смежные вопросы