CudaKernelFactory.cpp 8.79 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
/* -------------------------------------------------------------------------- *
 *                                   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-2012 Stanford University and the Authors.      *
 * Authors: Peter Eastman                                                     *
 * Contributors:                                                              *
 *                                                                            *
 * This program is free software: you can redistribute it and/or modify       *
 * it under the terms of the GNU Lesser General Public License as published   *
 * by the Free Software Foundation, either version 3 of the License, or       *
 * (at your option) any later version.                                        *
 *                                                                            *
 * This program is distributed in the hope that it will be useful,            *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
 * GNU Lesser General Public License for more details.                        *
 *                                                                            *
 * You should have received a copy of the GNU Lesser General Public License   *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.      *
 * -------------------------------------------------------------------------- */

#include "CudaKernelFactory.h"
28
#include "CudaKernels.h"
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//#include "CudaParallelKernels.h"
#include "CudaPlatform.h"
#include "openmm/internal/ContextImpl.h"
#include "openmm/OpenMMException.h"

using namespace OpenMM;

KernelImpl* CudaKernelFactory::createKernelImpl(std::string name, const Platform& platform, ContextImpl& context) const {
    CudaPlatform::PlatformData& data = *static_cast<CudaPlatform::PlatformData*>(context.getPlatformData());
//    if (data.contexts.size() > 1) {
//        // We are running in parallel on multiple devices, so we may want to create a parallel kernel.
//        
//        if (name == CalcForcesAndEnergyKernel::Name())
//            return new CudaParallelCalcForcesAndEnergyKernel(name, platform, data);
//        if (name == CalcHarmonicBondForceKernel::Name())
//            return new CudaParallelCalcHarmonicBondForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomBondForceKernel::Name())
//            return new CudaParallelCalcCustomBondForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcHarmonicAngleForceKernel::Name())
//            return new CudaParallelCalcHarmonicAngleForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomAngleForceKernel::Name())
//            return new CudaParallelCalcCustomAngleForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcPeriodicTorsionForceKernel::Name())
//            return new CudaParallelCalcPeriodicTorsionForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcRBTorsionForceKernel::Name())
//            return new CudaParallelCalcRBTorsionForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCMAPTorsionForceKernel::Name())
//            return new CudaParallelCalcCMAPTorsionForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomTorsionForceKernel::Name())
//            return new CudaParallelCalcCustomTorsionForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcNonbondedForceKernel::Name())
//            return new CudaParallelCalcNonbondedForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomNonbondedForceKernel::Name())
//            return new CudaParallelCalcCustomNonbondedForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomExternalForceKernel::Name())
//            return new CudaParallelCalcCustomExternalForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomHbondForceKernel::Name())
//            return new CudaParallelCalcCustomHbondForceKernel(name, platform, data, context.getSystem());
//        if (name == CalcCustomCompoundBondForceKernel::Name())
//            return new CudaParallelCalcCustomCompoundBondForceKernel(name, platform, data, context.getSystem());
//    }
70
71
72
73
74
75
76
77
78
79
80
    CudaContext& cu = *data.contexts[0];
    if (name == CalcForcesAndEnergyKernel::Name())
        return new CudaCalcForcesAndEnergyKernel(name, platform, cu);
    if (name == UpdateStateDataKernel::Name())
        return new CudaUpdateStateDataKernel(name, platform, cu);
    if (name == ApplyConstraintsKernel::Name())
        return new CudaApplyConstraintsKernel(name, platform, cu);
    if (name == VirtualSitesKernel::Name())
        return new CudaVirtualSitesKernel(name, platform, cu);
    if (name == CalcHarmonicBondForceKernel::Name())
        return new CudaCalcHarmonicBondForceKernel(name, platform, cu, context.getSystem());
81
82
    if (name == CalcCustomBondForceKernel::Name())
        return new CudaCalcCustomBondForceKernel(name, platform, cu, context.getSystem());
83
84
    if (name == CalcHarmonicAngleForceKernel::Name())
        return new CudaCalcHarmonicAngleForceKernel(name, platform, cu, context.getSystem());
85
86
    if (name == CalcCustomAngleForceKernel::Name())
        return new CudaCalcCustomAngleForceKernel(name, platform, cu, context.getSystem());
87
88
89
90
91
92
    if (name == CalcPeriodicTorsionForceKernel::Name())
        return new CudaCalcPeriodicTorsionForceKernel(name, platform, cu, context.getSystem());
    if (name == CalcRBTorsionForceKernel::Name())
        return new CudaCalcRBTorsionForceKernel(name, platform, cu, context.getSystem());
    if (name == CalcCMAPTorsionForceKernel::Name())
        return new CudaCalcCMAPTorsionForceKernel(name, platform, cu, context.getSystem());
93
94
    if (name == CalcCustomTorsionForceKernel::Name())
        return new CudaCalcCustomTorsionForceKernel(name, platform, cu, context.getSystem());
95
96
    if (name == CalcNonbondedForceKernel::Name())
        return new CudaCalcNonbondedForceKernel(name, platform, cu, context.getSystem());
97
//    if (name == CalcCustomNonbondedForceKernel::Name())
98
//        return new CudaCalcCustomNonbondedForceKernel(name, platform, cu, context.getSystem());
99
//    if (name == CalcGBSAOBCForceKernel::Name())
100
//        return new CudaCalcGBSAOBCForceKernel(name, platform, cu);
101
//    if (name == CalcCustomGBForceKernel::Name())
102
//        return new CudaCalcCustomGBForceKernel(name, platform, cu, context.getSystem());
103
104
    if (name == CalcCustomExternalForceKernel::Name())
        return new CudaCalcCustomExternalForceKernel(name, platform, cu, context.getSystem());
105
//    if (name == CalcCustomHbondForceKernel::Name())
106
//        return new CudaCalcCustomHbondForceKernel(name, platform, cu, context.getSystem());
107
108
    if (name == CalcCustomCompoundBondForceKernel::Name())
        return new CudaCalcCustomCompoundBondForceKernel(name, platform, cu, context.getSystem());
109
110
    if (name == IntegrateVerletStepKernel::Name())
        return new CudaIntegrateVerletStepKernel(name, platform, cu);
111
112
113
114
115
116
117
118
    if (name == IntegrateLangevinStepKernel::Name())
        return new CudaIntegrateLangevinStepKernel(name, platform, cu);
    if (name == IntegrateBrownianStepKernel::Name())
        return new CudaIntegrateBrownianStepKernel(name, platform, cu);
    if (name == IntegrateVariableVerletStepKernel::Name())
        return new CudaIntegrateVariableVerletStepKernel(name, platform, cu);
    if (name == IntegrateVariableLangevinStepKernel::Name())
        return new CudaIntegrateVariableLangevinStepKernel(name, platform, cu);
119
//    if (name == IntegrateCustomStepKernel::Name())
120
//        return new CudaIntegrateCustomStepKernel(name, platform, cu);
121
122
123
124
    if (name == ApplyAndersenThermostatKernel::Name())
        return new CudaApplyAndersenThermostatKernel(name, platform, cu);
    if (name == ApplyMonteCarloBarostatKernel::Name())
        return new CudaApplyMonteCarloBarostatKernel(name, platform, cu);
125
126
    if (name == CalcKineticEnergyKernel::Name())
        return new CudaCalcKineticEnergyKernel(name, platform, cu);
127
128
    if (name == RemoveCMMotionKernel::Name())
        return new CudaRemoveCMMotionKernel(name, platform, cu);
129
130
    throw OpenMMException((std::string("Tried to create kernel with illegal kernel name '")+name+"'").c_str());
}