CudaKernelFactory.cpp 8.84 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
//    if (name == CalcCustomBondForceKernel::Name())
82
//        return new CudaCalcCustomBondForceKernel(name, platform, cu, context.getSystem());
83
84
    if (name == CalcHarmonicAngleForceKernel::Name())
        return new CudaCalcHarmonicAngleForceKernel(name, platform, cu, context.getSystem());
85
//    if (name == CalcCustomAngleForceKernel::Name())
86
//        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
//    if (name == CalcCustomTorsionForceKernel::Name())
94
//        return new CudaCalcCustomTorsionForceKernel(name, platform, cu, context.getSystem());
95
//    if (name == CalcNonbondedForceKernel::Name())
96
//        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
//    if (name == CalcCustomExternalForceKernel::Name())
104
//        return new CudaCalcCustomExternalForceKernel(name, platform, cu, context.getSystem());
105
//    if (name == CalcCustomHbondForceKernel::Name())
106
//        return new CudaCalcCustomHbondForceKernel(name, platform, cu, context.getSystem());
107
//    if (name == CalcCustomCompoundBondForceKernel::Name())
108
109
110
//        return new CudaCalcCustomCompoundBondForceKernel(name, platform, cu, context.getSystem());
    if (name == IntegrateVerletStepKernel::Name())
        return new CudaIntegrateVerletStepKernel(name, platform, cu);
111
//    if (name == IntegrateLangevinStepKernel::Name())
112
//        return new CudaIntegrateLangevinStepKernel(name, platform, cu);
113
//    if (name == IntegrateBrownianStepKernel::Name())
114
//        return new CudaIntegrateBrownianStepKernel(name, platform, cu);
115
//    if (name == IntegrateVariableVerletStepKernel::Name())
116
//        return new CudaIntegrateVariableVerletStepKernel(name, platform, cu);
117
//    if (name == IntegrateVariableLangevinStepKernel::Name())
118
//        return new CudaIntegrateVariableLangevinStepKernel(name, platform, cu);
119
//    if (name == IntegrateCustomStepKernel::Name())
120
//        return new CudaIntegrateCustomStepKernel(name, platform, cu);
121
//    if (name == ApplyAndersenThermostatKernel::Name())
122
//        return new CudaApplyAndersenThermostatKernel(name, platform, cu);
123
//    if (name == ApplyMonteCarloBarostatKernel::Name())
124
125
126
//        return new CudaApplyMonteCarloBarostatKernel(name, platform, cu);
    if (name == CalcKineticEnergyKernel::Name())
        return new CudaCalcKineticEnergyKernel(name, platform, cu);
127
//    if (name == RemoveCMMotionKernel::Name())
128
//        return new CudaRemoveCMMotionKernel(name, platform, cu);
129
130
    throw OpenMMException((std::string("Tried to create kernel with illegal kernel name '")+name+"'").c_str());
}