Platform.h 9.12 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef OPENMM_PLATFORM_H_
#define OPENMM_PLATFORM_H_

/* -------------------------------------------------------------------------- *
 *                                   OpenMM                                   *
 * -------------------------------------------------------------------------- *
 * This is part of the OpenMM molecular simulation toolkit originating from   *
 * Simbios, the NIH National Center for Physics-Based Simulation of           *
 * Biological Structures at Stanford, funded under the NIH Roadmap for        *
 * Medical Research, grant U54 GM072970. See https://simtk.org.               *
 *                                                                            *
 * Portions copyright (c) 2008 Stanford University and the Authors.           *
 * Authors: Peter Eastman                                                     *
 * Contributors:                                                              *
 *                                                                            *
 * Permission is hereby granted, free of charge, to any person obtaining a    *
 * copy of this software and associated documentation files (the "Software"), *
 * to deal in the Software without restriction, including without limitation  *
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,   *
 * and/or sell copies of the Software, and to permit persons to whom the      *
 * Software is furnished to do so, subject to the following conditions:       *
 *                                                                            *
 * The above copyright notice and this permission notice shall be included in *
 * all copies or substantial portions of the Software.                        *
 *                                                                            *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   *
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    *
 * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,    *
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR      *
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE  *
 * USE OR OTHER DEALINGS IN THE SOFTWARE.                                     *
 * -------------------------------------------------------------------------- */

#include "Stream.h"
#include <map>
#include <vector>
38
#include "internal/windowsExport.h"
39
40
41
42
43

namespace OpenMM {

class Kernel;
class KernelFactory;
44
class OpenMMContextImpl;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class StreamFactory;

/**
 * A Platform defines an implementation of all the kernels and streams needed to perform some calculation.
 * More precisely, a Platform object acts as a registry for a set of KernelFactory and StreamFactory
 * objects which together implement the kernels and streams.  The Platform class, in turn, provides a
 * static registry of all available Platform objects.
 * 
 * To get a Platform object, call
 * 
 * <pre>
 * Platform& platform Platform::findPlatform(kernelNames);
 * </pre>
 * 
 * passing in the names of all kernels that will be required for the calculation you plan to perform.  It
 * will return the fastest available Platform which provides implementations of all the specified kernels.
 * You can then call createKernel() and createStream() to construct particular kernels and streams as needed.
 */

64
class OPENMM_EXPORT Platform {
65
public:
66
    virtual ~Platform();
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
    /**
     * Get the name of this platform.  This should be a unique identifier which can be used to recognized it.
     */
    virtual std::string getName() const = 0;
    /**
     * Get an estimate of how fast this Platform class is.  This need not be precise.  It only is expected to
     * return an order or magnitude estimate of the relative performance of different Platform classes.  An
     * unoptimized reference implementation should return 1.0, and all other Platforms should return a larger
     * value that is an estimate of how many times faster they are than the reference implementation.
     */
    virtual double getSpeed() const = 0;
    /**
     * Get whether this Platform supports double precision arithmetic.  If this returns false, the platform
     * is permitted to implement double precision streams internally as single precision.
     */
    virtual bool supportsDoublePrecision() const = 0;
    /**
     * Get the default StreamFactory for this Platform.  It will be used to create Streams whenever a
     * different StreamFactory has not been registered for the requested stream name.
     */
87
    virtual const StreamFactory& getDefaultStreamFactory() const = 0;
88
89
90
91
92
93
94
95
96
97
    /**
     * This is called whenever a new OpenMMContext is created.  It gives the Platform a chance to initialize
     * the context and store platform-specific data in it.
     */
    virtual void contextCreated(OpenMMContextImpl& context) const;
    /**
     * This is called whenever an OpenMMContext is deleted.  It gives the Platform a chance to clean up
     * any platform-specific data that was stored in it.
     */
    virtual void contextDestroyed(OpenMMContextImpl& context) const;
98
99
    /**
     * Register a KernelFactory which should be used to create Kernels with a particular name.
100
101
     * The Platform takes over ownership of the factory, and will delete it when the Platform itself
     * is deleted.
102
103
104
105
106
107
108
     * 
     * @param name     the kernel name for which the factory should be used
     * @param factory  the factory to use for creating Kernels with the specified name
     */
    void registerKernelFactory(std::string name, KernelFactory* factory);
    /**
     * Register a StreamFactory which should be used to create Streams with a particular name.
109
110
     * The Platform takes over ownership of the factory, and will delete it when the Platform itself
     * is deleted.
111
112
113
114
115
116
117
118
119
120
121
122
123
124
     * 
     * @param name     the stream name for which the factory should be used
     * @param factory  the factory to use for creating Streams with the specified name
     */
    void registerStreamFactory(std::string name, StreamFactory* factory);
    /**
     * Determine whether this Platforms provides implementations of a set of kernels.
     * 
     * @param kernelNames the names of the kernels of interests
     * @return true if this Platform provides implementations of all the kernels in the list,
     * false if there are any which it does not support
     */
    bool supportsKernels(std::vector<std::string> kernelNames) const ;
    /**
125
     * Create a Kernel object.  If you call this method multiple times for different contexts with the same name,
126
127
128
129
130
131
     * the returned Kernels are independent and do not interact with each other.  This means
     * that it is possible to have multiple simulations in progress at one time without them
     * interfering.
     * 
     * If no KernelFactory has been registered for the specified name, this will throw an exception.
     * 
132
133
     * @param name the name of the Kernel to get
     * @param context the context for which to create a Kernel
134
135
     * @return a newly created Kernel object
     */
136
    Kernel createKernel(std::string name, OpenMMContextImpl& context) const;
137
    /**
138
     * Create a Stream object.  If you call this method multiple times for different contexts with the same name,
139
140
141
142
143
144
145
     * the returned Streams are independent and do not interact with each other.  This means
     * that it is possible to have multiple simulations in progress at one time without them
     * interfering.
     * 
     * If a StreamFactory has been registered for the specified name, it will be used to create
     * the Stream.  Otherwise, the default StreamFactory will be used.
     * 
146
147
     * @param name the name of the Stream to get
     * @param context the context for which to create a Stream
148
149
     * @return a newly created Stream object
     */
150
    Stream createStream(std::string name, int size, Stream::DataType type, OpenMMContextImpl& context) const;
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
    /**
     * Register a new Platform.
     */
    static void registerPlatform(Platform* platform);
    /**
     * Get the number of Platforms that have been registered.
     */
    static int getNumPlatforms();
    /**
     * Get a registered Platform by index.
     */
    static Platform& getPlatform(int index);
    /**
     * Find a Platform which can be used to perform a calculation.
     * 
     * @param kernelNames the names of all kernels which will be needed for the calculation
     * @return the fastest registered Platform which supports all of the requested kernels.  If no
     * Platform exists which supports all of them, this will throw an exception.
     */
    static Platform& findPlatform(std::vector<std::string> kernelNames);
private:
172
173
174
175
176
177
178
179
180

// Retarded visual studio compiler complains about being unable to 
// export private stl class members.
// This stanza explains that it should temporarily shut up.
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable:4251)
#endif

181
182
183
    std::map<std::string, KernelFactory*> kernelFactories;
    std::map<std::string, StreamFactory*> streamFactories;
    static std::vector<Platform*> platforms;
184
185
186
187
188

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

189
190
191
192
193
};

} // namespace OpenMM

#endif /*OPENMM_PLATFORM_H_*/