El 22/08/14 20:44, Saliya Ekanayake escribió:
Thank you Oscar for the detailed information, but I'm still wondering how would the copying in 2 would be different than what's done here with copying to a buffer.

If you have a buffer array like this:

    double buffer[] = new double[m * n];

Copy the 2D matrix to the buffer:

    for(int i = 0; i < m; i++)
        System.arraycopy(matrix[i], 0, buffer, i * n, n);

Copy from the buffer to the 2D matrix:

    for(int i = 0; i < m; i++)
        System.arraycopy(buffer, i * n, matrix[i], 0, n);


On Fri, Aug 22, 2014 at 2:17 PM, Oscar Vega-Gisbert <ov...@dsic.upv.es <mailto:ov...@dsic.upv.es>> wrote:

    El 22/08/14 17:10, Saliya Ekanayake escribió:

        Hi,

        I've a quick question about the usage of Java binding.

        Say there's a 2 dimensional double array (size m x n) that
        needs to be sent to another rank. I see two options to get
        this done,

        1. Copy values to a direct buffer of size m*n and send it
        2. Copy values to a 1D array of size m*n and send it

        I guess 2 would internally do the copying to a buffer and use
        it, so suggesting 1. is the best option. Is this the case or
        is there a better way to do this?


    The best option is 1 because 2 requires one extra copy to C heap.
    Supposing the matrix is the following:

        double matrix[][] = new double[m][n];

    Then you can allocate a direct DoubleBuffer:

        DoubleBuffer buffer = MPI.newDoubleBuffer(m * n);

    In order to send/receive the matrix I suggest to use the bulk
    put/get methods:

        for(int i = 0; i < m; i++)
            buffer.put(matrix[i]); // Copy to the buffer.

        MPI.COMM_WORLD.send(buffer, m*n, MPI.DOUBLE, 1, 0);

    The receive code:

        MPI.COMM_WORLD.recv(buffer, m*n, MPI.DOUBLE, 0, 0);

        for(int i = 0; i < m; i++)
            buffer.get(matrix[i]); // Copy from the buffer.

    Note that bulk get/put methods increment the buffer position in n.
    So if you want reuse the buffer you must set the buffer position
    to 0 before copy the matrix:

        buffer.position(0);

    Regards,
    Oscar


        Thank you,
        Saliya
-- Saliya Ekanayake esal...@gmail.com <mailto:esal...@gmail.com>
        <mailto:esal...@gmail.com <mailto:esal...@gmail.com>>
        http://saliya.org


        _______________________________________________
        users mailing list
        us...@open-mpi.org <mailto:us...@open-mpi.org>
        Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
        Link to this post:
        http://www.open-mpi.org/community/lists/users/2014/08/25130.php


    _______________________________________________
    users mailing list
    us...@open-mpi.org <mailto:us...@open-mpi.org>
    Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
    Link to this post:
    http://www.open-mpi.org/community/lists/users/2014/08/25131.php




--
Saliya Ekanayake esal...@gmail.com <mailto:esal...@gmail.com>
Cell 812-391-4914 Home 812-961-6383
http://saliya.org


_______________________________________________
users mailing list
us...@open-mpi.org
Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
Link to this post: 
http://www.open-mpi.org/community/lists/users/2014/08/25132.php

Reply via email to