2 * This source code is part of
6 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
7 * Copyright (c) 2001-2009, The GROMACS Development Team
9 * Gromacs is a library for molecular simulation and trajectory analysis,
10 * written by Erik Lindahl, David van der Spoel, Berk Hess, and others - for
11 * a full list of developers and information, check out http://www.gromacs.org
13 * This program is free software; you can redistribute it and/or modify it under
14 * the terms of the GNU Lesser General Public License as published by the Free
15 * Software Foundation; either version 2 of the License, or (at your option) any
17 * As a special exception, you may use this file as part of a free software
18 * library without restriction. Specifically, if other files instantiate
19 * templates or use macros or inline functions from this file, or you compile
20 * this file and link it with other files to produce an executable, this
21 * file does not by itself cause the resulting executable to be covered by
22 * the GNU Lesser General Public License.
24 * In plain-speak: do not worry about classes/macros/templates either - only
25 * changes to the library have to be LGPL, not an application linking with it.
27 * To help fund GROMACS development, we humbly ask that you cite
28 * the papers people have written on it - you can find them on the website!
42 /*! \brief Lock innerloop mutex and read lists indices
46 * This routine is only used when both Fortran innerloops
47 * and threads are enabled.
49 * Since the Fortran77 standard does not include support
50 * for POSIX threads, we call this routine instead which
52 * - Locks the provided mutex
53 * - Reads the counter from memory
54 * - Advances the counter in successively smaller chunks
55 * - Releases the mutex
57 * In other words, it performs exactly the same action as
58 * we do natively in the nonbonded kernel outer loop
59 * when using C language for the kernels.
61 * Fortran does not know anything about a mutex, but since
62 * arguments are passed by reference we mask it as a pointer
63 * to an integer in the Fortran code.
65 * \param mtx Pointer to the mutex to use, masked as int
66 * \param count Pointer to the outer loop counter
67 * \param nri Total umber of (outer loop) neighborlists
68 * \param nthreads Number of working threads
69 * \param nn0 Returned value: Low index to use for outerloop
70 * \param nn1 Returned value: High index to use for outerloop
72 * \warning There is one possible cause of problems. Some
73 * fortran compilers make all variables static by
74 * default, and that will obviously screw up
75 * multithreading in a major way. If your Fortran
76 * compiler does this you only have two alternatives:
77 * Either find the flag to turn it off, or compile
78 * Gromacs without any Fortran nonbonded kernels.
81 F77_FUNC(pwr6kernelsync
,PWR6KERNELSYNC
)
92 #ifdef HAVE_PTHREADS_H
93 pthread_mutex_lock((pthread_mutex_t
*)mtx
);
96 /* Take successively smaller chunks */
97 n1
= n0
+((*nri
)-n0
)/(2*(*nthreads
))+3;
99 #ifdef HAVE_PTHREADS_H
100 pthread_mutex_unlock((pthread_mutex_t
*)mtx
);