cf10dfb127b623c62b462881cee9928c07309f76
[alexxy/gromacs.git] / src / contrib / openmm_gpu_utils.cu
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2010,2012 The GROMACS development team,
6  * check out http://www.gromacs.org for more information.
7  * Copyright (c) 2012, by the GROMACS development team, led by
8  * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9  * others, as listed in the AUTHORS file in the top-level source
10  * directory and at http://www.gromacs.org.
11  *
12  * GROMACS is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public License
14  * as published by the Free Software Foundation; either version 2.1
15  * of the License, or (at your option) any later version.
16  *
17  * GROMACS is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with GROMACS; if not, see
24  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
26  *
27  * If you want to redistribute modifications to GROMACS, please
28  * consider that scientific software is very special. Version
29  * control is crucial - bugs must be traceable. We will be happy to
30  * consider code for inclusion in the official distribution, but
31  * derived work must not be called official GROMACS. Details are found
32  * in the README & COPYING files - if they are missing, get the
33  * official version at http://www.gromacs.org.
34  *
35  * To help us fund GROMACS development, we humbly ask that you cite
36  * the research papers on the package. Check out http://www.gromacs.org.
37  */
38
39 #include <stdio.h>
40 #include <stdlib.h>
41
42 #include "smalloc.h"
43 #include "string2.h"
44 #include "types/hw_info.h"
45
46 #include "openmm_gpu_utils.h"
47 #include "../../src/gmxlib/cuda_tools/cudautils.cuh"
48
49 // TODO put this list into an external file and include it so that the list is easily accessible
50 /*! List of supported GPUs. */
51 static const char * const SupportedGPUs[] = {
52     /* GT400 */
53     "Geforce GTX 480",
54     "Geforce GTX 470",
55     "Geforce GTX 465",
56     "Geforce GTX 460",
57
58     "Tesla C2070",
59     "Tesla C2050",
60     "Tesla S2070",
61     "Tesla S2050",
62     "Tesla M2070",
63     "Tesla M2050",
64
65     "Quadro 5000",
66     "Quadro 6000",
67
68     /* GT200 */
69     "Geforce GTX 295",
70     "Geforce GTX 285",
71     "Geforce GTX 280",
72     "Geforce GTX 275",
73     "Geforce GTX 260",
74     "GeForce GTS 250",
75     "GeForce GTS 150",
76
77     "GeForce GTX 285M",
78     "GeForce GTX 280M",
79
80     "Tesla S1070",
81     "Tesla C1060",
82     "Tesla M1060",
83
84     "Quadro FX 5800",
85     "Quadro FX 4800",
86     "Quadro CX",
87     "Quadro Plex 2200 D2",
88     "Quadro Plex 2200 S4",
89
90     /* G90 */
91     "GeForce 9800 G", /* GX2, GTX, GTX+, GT */
92     "GeForce 9800M GTX",
93
94     "Quadro FX 4700",
95     "Quadro Plex 2100 D4"
96 };
97
98 /*! Number of supported GPUs */
99 #define NB_GPUS (sizeof(SupportedGPUs)/sizeof(SupportedGPUs[0]))
100
101 FUNC_QUALIFIER
102 gmx_bool is_gmx_openmm_supported_gpu(int dev_id, char *gpu_name) FUNC_TERM_INT
103
104 /*! 
105  * \brief Checks whether the GPU with the given name is supported in Gromacs-OpenMM.
106  * 
107  * \param[in] gpu_name  the name of the CUDA device
108  * \returns             TRUE if the device is supported, otherwise FALSE
109  */
110 static bool is_gmx_openmm_supported_gpu_name(char *gpuName)
111 {
112     size_t i;
113     for (i = 0; i < NB_GPUS; i++)
114     {
115         trim(gpuName);
116         if (gmx_strncasecmp(gpuName, SupportedGPUs[i], strlen(SupportedGPUs[i])) == 0)
117             return 1;
118     }
119     return 0;
120 }
121
122 /*! \brief Checks whether the GPU with the given device id is supported in Gromacs-OpenMM.
123  *
124  * \param[in] dev_id    the device id of the GPU or -1 if the device has already been selected
125  * \param[out] gpu_name Set to contain the name of the CUDA device, if NULL passed, no device name is set. 
126  * \returns             TRUE if the device is supported, otherwise FALSE
127  * 
128  */
129 gmx_bool is_gmx_openmm_supported_gpu(int dev_id, char *gpu_name)
130 {
131     cudaDeviceProp dev_prop;
132
133     if (debug) fprintf(debug, "Checking compatibility with device #%d, %s\n", dev_id, gpu_name);
134
135     if (do_sanity_checks(dev_id, &dev_prop) != 0)
136         return -1;
137
138     if (gpu_name != NULL)
139     { 
140         strcpy(gpu_name, dev_prop.name);
141     }
142     return is_gmx_openmm_supported_gpu_name(dev_prop.name);
143 }
144
145