Lattice Microbes 2.5
This is for whole cell modeling
Loading...
Searching...
No Matches
MPIMpdRdmeSolver.h
Go to the documentation of this file.
1/*
2 * University of Illinois Open Source License
3 * Copyright 2008-2018 Luthey-Schulten Group,
4 * Copyright 2012 Roberts Group,
5 * All rights reserved.
6 *
7 * Developed by: Luthey-Schulten Group
8 * University of Illinois at Urbana-Champaign
9 * http://www.scs.uiuc.edu/~schulten
10 *
11 * Developed by: Roberts Group
12 * Johns Hopkins University
13 * http://biophysics.jhu.edu/roberts/
14 *
15 * Permission is hereby granted, free of charge, to any person obtaining a copy of
16 * this software and associated documentation files (the Software), to deal with
17 * the Software without restriction, including without limitation the rights to
18 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
19 * of the Software, and to permit persons to whom the Software is furnished to
20 * do so, subject to the following conditions:
21 *
22 * - Redistributions of source code must retain the above copyright notice,
23 * this list of conditions and the following disclaimers.
24 *
25 * - Redistributions in binary form must reproduce the above copyright notice,
26 * this list of conditions and the following disclaimers in the documentation
27 * and/or other materials provided with the distribution.
28 *
29 * - Neither the names of the Luthey-Schulten Group, University of Illinois at
30 * Urbana-Champaign, the Roberts Group, Johns Hopkins University, nor the names
31 * of its contributors may be used to endorse or promote products derived from
32 * this Software without specific prior written permission.
33 *
34 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
37 * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
38 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
39 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
40 * OTHER DEALINGS WITH THE SOFTWARE.
41 *
42 * Author(s): Mike Hallock
43 */
44
45#ifndef LM_RDME_MPIMPDRDMESOLVER_H_
46#define LM_RDME_MPIMPDRDMESOLVER_H_
47
48#include "cuda/lm_cuda.h"
49
51#include "rdme/RDMESolver.h"
52#include "rdme/ByteLattice.h"
55
56#if defined(MACOSX)
58#endif
59
63
64namespace lm {
65
66namespace io{
67class Lattice;
68class SpeciesCounts;
69}
70namespace rdme {
71
73{
74public:
77 virtual void initialize(unsigned int replicate, map<string,string> * parameters, ResourceAllocator::ComputeResources * resources);
78 virtual bool needsReactionModel() {return true;}
79 virtual bool needsDiffusionModel() {return true;}
80 virtual void buildModel(const uint numberSpeciesA, const uint numberReactionsA, const uint * initialSpeciesCountsA, const uint * reactionTypeA, const double * kA, const int * SA, const uint * DA, const uint kCols=1);
81 virtual void buildDiffusionModel(const uint numberSiteTypesA, const double * DFA, const uint * RLA, lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing, const uint8_t * latticeData, const uint8_t * latticeSitesData, bool rowMajorData=true);
82 virtual void generateTrajectory();
83
84protected:
85 virtual void allocateLattice(lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing);
86 virtual void writeLatticeData(double time, ByteLattice * lattice, lm::io::Lattice * latticeDataSet);
87 virtual void recordSpeciesCounts(double time, ByteLattice * lattice, lm::io::SpeciesCounts * speciesCountsDataSet);
88 virtual void writeSpeciesCounts(lm::io::SpeciesCounts * speciesCountsDataSet);
89 virtual int run_next_timestep(uint32_t timestep);
90 virtual uint64_t getTimestepSeed(uint32_t timestep, uint32_t substep);
91 virtual void copyModelsToDevice();
93
94 virtual void prepare_gpu();
95
96
97 virtual void calculateXLaunchParameters(dim3 * gridSize, dim3 * threadBlockSize, const unsigned int maxXBlockSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize);
98 virtual void calculateYLaunchParameters(dim3 * gridSize, dim3 * threadBlockSize, const unsigned int blockXSize, const unsigned int blockYSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize);
99 virtual void calculateZLaunchParameters(dim3 * gridSize, dim3 * threadBlockSize, const unsigned int blockXSize, const unsigned int blockZSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize);
100 virtual void calculateReactionLaunchParameters(dim3 * gridSize, dim3 * threadBlockSize, const unsigned int blockXSize, const unsigned int blockYSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize);
101
102protected:
103 uint32_t seed;
105 double tau;
108
109 // Stored model parameters for const memory
110 unsigned int* model_reactionOrders;
111 unsigned int* model_reactionSites;
112 unsigned int* model_D1;
113 unsigned int* model_D2;
114 int8_t* model_S;
115 float* model_T;
116 uint8_t* model_RL;
118
120
121#ifdef MPD_GLOBAL_S_MATRIX
122 uint8_t *RLG; // Device global memory pointer for RL matrix
123 int8_t *SG; // Device global memory pointer for S matrix
124#endif
125
126#ifdef MPD_GLOBAL_T_MATRIX
127 float *TG;
128#endif
129
132
135
136 int gpu;
137 int ngpus;
139
140 // cuda objects
141 unsigned int *dLattice, *dLatticeTmp;
142 uint8_t *dSites;
143 cudaStream_t stream1, stream2;
145 unsigned int *h_overflows, *d_overflows;
146
147 // kernel launch params
150
151 // lattice segment geometry provided by the mapper
153};
154
155__device__ inline size_t local_to_global(unsigned int x, unsigned int y, unsigned int z);
156__device__ inline size_t local_index(unsigned int x, unsigned int y, unsigned int z);
157__global__ void MPI_x_kernel(const unsigned int* inLattice, const uint8_t * inSites, unsigned int* outLattice, const unsigned int z_start, const unsigned long long timestepHash, unsigned int* siteOverflowList);
158__global__ void MPI_y_kernel(const unsigned int* inLattice, const uint8_t * inSites, unsigned int* outLattice, const unsigned long long timestepHash, unsigned int* siteOverflowList);
159__global__ void MPI_z_kernel(const unsigned int* inLattice, const uint8_t * inSites, unsigned int* outLattice, const unsigned long long timestepHash, unsigned int* siteOverflowList, const unsigned int z_start);
160#ifdef MPD_GLOBAL_S_MATRIX
161__global__ void MPI_reaction_kernel(const unsigned int* inLattice, const uint8_t * inSites, unsigned int* outLattice, const unsigned long long timestepHash, unsigned int* siteOverflowList, const unsigned int z_start, const __restrict__ int8_t *SG, const __restrict__ uint8_t *RLG);
162#else
163__global__ void MPI_reaction_kernel(const unsigned int* inLattice, const uint8_t * inSites, unsigned int* outLattice, const unsigned long long timestepHash, unsigned int* siteOverflowList, const unsigned int z_start);
164#endif
165__global__ void mpi_correct_overflows(unsigned int* inLattice, unsigned int* siteOverflowList);
166
167}
168}
169
170#endif
uint32_t site_size_t
Definition ByteLatticeExtended.h:23
uint32_t lattice_size_t
Definition Lattice.h:55
struct segmentDescriptor SegmentDescriptor_s
Definition SegmentDescriptor.h:57
double si_dist_t
Definition Types.h:63
unsigned int uint
Definition Types.h:52
A representation for the resources for a given node.
Definition ResourceAllocator.h:62
Definition ZDivMPIGPUMapper.h:59
map< string, string > * parameters
Definition CMESolver.h:266
unsigned int replicate
Definition CMESolver.h:265
An object that tracks the available resources for the main simulation runner.
Definition ResourceAllocator.h:57
A Lattice that is based on packed bytes of memory, i.e. one byte per lattice site to hold particles.
Definition ByteLattice.h:53
Base class for lattice type objects.
Definition Lattice.h:132
uint32_t seed
Definition MPIMpdRdmeSolver.h:103
virtual void calculateReactionLaunchParameters(dim3 *gridSize, dim3 *threadBlockSize, const unsigned int blockXSize, const unsigned int blockYSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
uint32_t absolute_timestep
Definition MPIMpdRdmeSolver.h:134
virtual void initialize(unsigned int replicate, map< string, string > *parameters, ResourceAllocator::ComputeResources *resources)
Initialize the simulation.
virtual void allocateLattice(lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing)
virtual bool needsDiffusionModel()
Tells whether the solver needs a reaction model.
Definition MPIMpdRdmeSolver.h:79
virtual void prepare_gpu()
cudaEvent_t x_finish
Definition MPIMpdRdmeSolver.h:144
uint32_t overflowTimesteps
Definition MPIMpdRdmeSolver.h:106
int ngpus
Definition MPIMpdRdmeSolver.h:137
virtual void recordSpeciesCounts(double time, ByteLattice *lattice, lm::io::SpeciesCounts *speciesCountsDataSet)
virtual void buildDiffusionModel(const uint numberSiteTypesA, const double *DFA, const uint *RLA, lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing, const uint8_t *latticeData, const uint8_t *latticeSitesData, bool rowMajorData=true)
unsigned int * h_overflows
Definition MPIMpdRdmeSolver.h:145
cudaEvent_t rx_finish
Definition MPIMpdRdmeSolver.h:144
virtual void buildModel(const uint numberSpeciesA, const uint numberReactionsA, const uint *initialSpeciesCountsA, const uint *reactionTypeA, const double *kA, const int *SA, const uint *DA, const uint kCols=1)
virtual void writeLatticeData(double time, ByteLattice *lattice, lm::io::Lattice *latticeDataSet)
double tau
Definition MPIMpdRdmeSolver.h:105
dim3 threads_z
Definition MPIMpdRdmeSolver.h:149
dim3 grid_r
Definition MPIMpdRdmeSolver.h:148
virtual void initialize_decomposition()
int gpu
Definition MPIMpdRdmeSolver.h:136
uint8_t * dSites
Definition MPIMpdRdmeSolver.h:142
cudaStream_t stream1
Definition MPIMpdRdmeSolver.h:143
dim3 grid_y
Definition MPIMpdRdmeSolver.h:148
virtual void copyModelsToDevice()
virtual void calculateXLaunchParameters(dim3 *gridSize, dim3 *threadBlockSize, const unsigned int maxXBlockSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
int8_t * model_S
Definition MPIMpdRdmeSolver.h:114
virtual bool needsReactionModel()
Tells whether the solver needs a reaction model.
Definition MPIMpdRdmeSolver.h:78
dim3 grid_x
Definition MPIMpdRdmeSolver.h:148
dim3 threads_x
Definition MPIMpdRdmeSolver.h:149
unsigned int * model_reactionOrders
Definition MPIMpdRdmeSolver.h:110
virtual void calculateZLaunchParameters(dim3 *gridSize, dim3 *threadBlockSize, const unsigned int blockXSize, const unsigned int blockZSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
unsigned int * model_D1
Definition MPIMpdRdmeSolver.h:112
int timesteps_to_run
Definition MPIMpdRdmeSolver.h:133
unsigned int * model_reactionSites
Definition MPIMpdRdmeSolver.h:111
dim3 grid_z
Definition MPIMpdRdmeSolver.h:148
unsigned int * model_D2
Definition MPIMpdRdmeSolver.h:113
float * model_reactionRates
Definition MPIMpdRdmeSolver.h:117
uint8_t * model_RL
Definition MPIMpdRdmeSolver.h:116
virtual uint64_t getTimestepSeed(uint32_t timestep, uint32_t substep)
cudaEvent_t diffusion_finished
Definition MPIMpdRdmeSolver.h:144
dim3 threads_y
Definition MPIMpdRdmeSolver.h:149
ResourceAllocator::ComputeResources * resources
Definition MPIMpdRdmeSolver.h:131
ZDivMPIGPUMapper * mapper
Definition MPIMpdRdmeSolver.h:130
bool lattice_synched
Definition MPIMpdRdmeSolver.h:138
void * cudaOverflowList
Definition MPIMpdRdmeSolver.h:104
uint32_t overflowListUses
Definition MPIMpdRdmeSolver.h:107
float * model_T
Definition MPIMpdRdmeSolver.h:115
unsigned int * d_overflows
Definition MPIMpdRdmeSolver.h:145
virtual void writeSpeciesCounts(lm::io::SpeciesCounts *speciesCountsDataSet)
cudaStream_t stream2
Definition MPIMpdRdmeSolver.h:143
virtual void calculateYLaunchParameters(dim3 *gridSize, dim3 *threadBlockSize, const unsigned int blockXSize, const unsigned int blockYSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
unsigned int * dLattice
Definition MPIMpdRdmeSolver.h:141
virtual int run_next_timestep(uint32_t timestep)
int rank
Definition MPIMpdRdmeSolver.h:119
SegmentDescriptor_s * segment
Definition MPIMpdRdmeSolver.h:152
virtual void generateTrajectory()
Actually run the simulation.
dim3 threads_r
Definition MPIMpdRdmeSolver.h:149
int world_size
Definition MPIMpdRdmeSolver.h:119
unsigned int * dLatticeTmp
Definition MPIMpdRdmeSolver.h:141
Definition RDMESolver.h:55
Lattice * lattice
Definition RDMESolver.h:73
RDMESolver(RandomGenerator::Distributions neededDists)
Definition RDMESolver.cpp:58
Definition LatticeBuilder.h:56
Definition LatticeBuilder.h:60
__global__ void mpi_correct_overflows(unsigned int *inLattice, unsigned int *siteOverflowList)
__global__ void MPI_y_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned long long timestepHash, unsigned int *siteOverflowList)
__global__ void MPI_x_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned int z_start, const unsigned long long timestepHash, unsigned int *siteOverflowList)
__global__ void MPI_reaction_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned long long timestepHash, unsigned int *siteOverflowList, const unsigned int z_start)
__device__ size_t local_index(unsigned int x, unsigned int y, unsigned int z)
__global__ void MPI_z_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned long long timestepHash, unsigned int *siteOverflowList, const unsigned int z_start)
__device__ size_t local_to_global(unsigned int x, unsigned int y, unsigned int z)
Definition Capsule.cpp:46