使用MPI进行动态数组分配的基本矩阵运算

时间:2015-02-18 10:32:30

标签: arrays matrix mpi allocation

我已经找到了有关MPI和动态分配的答案,但我的代码中仍然存在错误。

我认为对发送/接收效果很好。当我想做一些基本操作时,问题可能是由于相同的部分。我无法指定数组的索引,否则我收到此错误:

  

[lyomatnuc09:07574] *处理收到的信号*

     

[lyomatnuc09:07575] *处理收到的信号*

     

[lyomatnuc09:07575]信号:分段错误(11)

     

[lyomatnuc09:07575]信号代码:未映射的地址(1)

     

[lyomatnuc09:07575]地址失败:0x60

重现错误的基本代码如下:

int **alloc_array(int rows, int cols) {
    int *data = (int *)malloc(rows*cols*sizeof(int));
    int **array= (int **)malloc(rows*sizeof(int*));
    for (int i=0; i<rows; i++)
        array[i] = &(data[cols*i]);

    return array;
}

int main(int argc, char *argv[])
{
    MPI_Init(&argc, &argv); //initialize MPI operations
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); //get the rank
    MPI_Comm_size(MPI_COMM_WORLD, &size); //get number of processes
    MPI_Datatype columntype;
    MPI_Type_vector(10, 1, 10, MPI_INT, &columntype);
    MPI_Type_commit(&columntype);
    start_time = MPI_Wtime();     

    if (rank == 0) 
    {
        int **A;
        A = alloc_array(10,10);
        for ( int i =1 ;i<size;i++)
        {
            MPI_Send(&(A[0][0]), 10*10, MPI_INT, i, 1, MPI_COMM_WORLD);
        }
    } else if (rank >= 1) {
        int **A2;
        A2 = alloc_array(10,10);
        MPI_Recv(&(A2[0][0]), 10*10, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
        for (int i =0; i<10; i++)
        {
            for ( int j=0; j<10;i++)
            {
                A2[i][j]=i*j;//bug here
            }
        }
    }//end slaves task
    MPI_Finalize();
    return 0;
}

0 个答案:

没有答案