[gmx-developers] using arrays of rvec[] (ie x, v, f, etc)

David van der Spoel spoel at xray.bmc.uu.se
Tue Jul 5 20:43:46 CEST 2005


On Tue, 5 Jul 2005, Nathan Moore wrote:

>I've figured out a possible fix.  I've defined temp_x in the following way,
>
>    rvec *temp_x = (rvec *) malloc(array_length * sizeof(rvec));
>
>and then copied the array contents with,
>
>for (i = 0; i < array_length; i++) {
>        x[i][0] = temp_x[i][0];
>        x[i][1] = temp_x[i][1];
>        x[i][2] = temp_x[i][2];
>    }
>
>Comments?

It should be possible without any copying, if you do Nprocs MPI calls on 
array segments. Copying and mallocing will kill any gain in performnce.


>
>NT Moore
>
>
>> I'm working to rewrite the move_x/move_f functions to allow for the use of
>> an MPI_AllgatherV on an IBM BlueGene system.  I'm struggling at present
>> with the definition of the x and f arrays as "rvec[]" or "real variables.
>> The code below fails on compile with errors:
>>
>> "mvxvf.c", line 196.25: 1506-019 (S) Expecting an array or a pointer to
>> object type.
>> "mvxvf.c", line 197.25: 1506-019 (S) Expecting an array or a pointer to
>> object type.
>> "mvxvf.c", line 198.25: 1506-019 (S) Expecting an array or a pointer to
>> object type.
>>
>> I assume that the compiler doesn't like how I'm copying the temp_x array
>> back to the x array after the MPI_Allgatherv.  Any suggestions as to how
>> this section should be written?
>>
>> Also, I'd like to lose the malloc definition of temp_x, but I'm not sure
>> if there's a #define'd size for that array.  ie, I'd like to say
>> statically at the beginning of this function,
>>      real temp_x[N_ATOMS]
>> Is the problem size (NUM_ATOMS or similar) defined outside of the
>> (nsb->natoms)?
>>
>> thanks,
>>
>> NT Moore
>>
>>
>> void move_x(FILE * log,
>>        int left, int right, rvec x[], t_nsborder * nsb, t_nrnb * nrnb)
>> {
>> int i;
>>
>>     int NT_status;              /* Did the send work? */
>>
>>     int array_length;           /* length of the whole x array */
>>     array_length = DIM * (nsb->natoms);
>>
>>     int start_element;          /* index of where this node's array
>> begins*/
>>     start_element = nsb->index[nsb->nodeid];
>>
>>     /* The number of elements each node sends */
>>     int *num_sent = (int *) malloc((nsb->nnodes) * sizeof(int));
>>     for (i = 0; i < (nsb->nnodes); i++) {
>>         num_sent[i] = nsb->homenr[i];
>>     }
>>
>>     /* The starting index of each node's block of elements */
>>     /* note the obvious redundancy that
>> start_element==starting_block[nsb->nodeid] */
>>     int *starting_block = (int *) malloc((nsb->nnodes) * sizeof(int));
>>     for (i = 0; i < (nsb->nnodes); i++) {
>>         starting_block[i] = nsb->index[i];
>>     }
>>
>>     /* The temporary array where x elements are gathered to */
>>     real *temp_x = (real *) malloc(array_length * sizeof(real));
>>
>>     /* pass the x array around */
>>     NT_status = MPI_Allgatherv(&x[start_element],
>>                                num_sent[nsb->nodeid],
>>                                MPI_REAL,
>>                                &temp_x[0],
>>                                &num_sent[0],
>>                                &starting_block[0],
>>                                MPI_REAL, MPI_COMM_WORLD);
>>
>>     /* update the x array with the gathered temp_x array */
>>     for (i = 0; i < array_length; i++) {
>>         x[i][0] = temp_x[i][0];
>>         x[i][1] = temp_x[i][1];
>>         x[i][2] = temp_x[i][2];
>>     }
>>
>>     free(num_sent);
>>     free(starting_block);
>>     free(temp_x);
>>
>> }
>>
>> _______________________________________________
>> gmx-developers mailing list
>> gmx-developers at gromacs.org
>> http://www.gromacs.org/mailman/listinfo/gmx-developers
>> Please don't post (un)subscribe requests to the list. Use the
>> www interface or send it to gmx-developers-request at gromacs.org.
>>
>
>_______________________________________________
>gmx-developers mailing list
>gmx-developers at gromacs.org
>http://www.gromacs.org/mailman/listinfo/gmx-developers
>Please don't post (un)subscribe requests to the list. Use the
>www interface or send it to gmx-developers-request at gromacs.org.
>

-- 
David.
________________________________________________________________________
David van der Spoel, PhD, Assoc. Prof., Molecular Biophysics group,
Dept. of Cell and Molecular Biology, Uppsala University.
Husargatan 3, Box 596,  	75124 Uppsala, Sweden
phone:	46 18 471 4205		fax: 46 18 511 755
spoel at xray.bmc.uu.se	spoel at gromacs.org   http://xray.bmc.uu.se/~spoel
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




More information about the gromacs.org_gmx-developers mailing list