STORMM Source Documentation
Loading...
Searching...
No Matches
nonbonded_workunit.h
1// -*-c++-*-
2#ifndef STORMM_NONBONDED_WORKUNIT_H
3#define STORMM_NONBONDED_WORKUNIT_H
4
5#include "copyright.h"
6#include "Accelerator/gpu_details.h"
7#include "Math/summation.h"
8#include "Topology/atomgraph.h"
9#include "Potential/static_exclusionmask.h"
10#include "static_mask_synthesis.h"
11#include "synthesis_enumerators.h"
12
13namespace stormm {
14namespace synthesis {
15
16using card::GpuDetails;
17using energy::StaticExclusionMask;
18using energy::tile_length;
19using energy::tile_lengths_per_supertile;
20using stmath::sum;
21
23constexpr int small_block_max_atoms = 320;
24
26constexpr int small_block_max_imports = small_block_max_atoms / tile_length;
27
29constexpr int small_block_tile_width = 8;
30
33constexpr int tiny_nbwu_tiles = small_block_tile_width;
34constexpr int small_nbwu_tiles = 2 * small_block_tile_width;
35constexpr int medium_nbwu_tiles = 4 * small_block_tile_width;
36constexpr int large_nbwu_tiles = 8 * small_block_tile_width;
38
40constexpr int huge_nbwu_tiles = tile_lengths_per_supertile * tile_lengths_per_supertile;
41
43constexpr int tile_groups_wu_abstract_length = 64;
44
46constexpr int supertile_wu_abstract_length = 8;
47
53public:
54
112 NonbondedWorkUnit(const StaticExclusionMask &se, const std::vector<int3> &tile_list);
113
114 NonbondedWorkUnit(const StaticExclusionMask &se, int abscissa_start, int ordinate_start);
115
117 const std::vector<int3> &tile_list);
118
119 NonbondedWorkUnit(const StaticExclusionMaskSynthesis &se, int abscissa_start, int ordinate_start,
120 int system_index);
122
126 NonbondedWorkUnit(const NonbondedWorkUnit &original) = default;
127 NonbondedWorkUnit(NonbondedWorkUnit &&original) = default;
128 NonbondedWorkUnit& operator=(const NonbondedWorkUnit &other) = default;
129 NonbondedWorkUnit& operator=(NonbondedWorkUnit &&other) = default;
131
133 int getTileCount() const;
134
136 int getImportCount() const;
137
139 int getInitializationMask() const;
140
146 int4 getTileLimits(int index) const;
147
149 const std::vector<uint2>& getTileInstructions() const;
150
191 std::vector<int> getAbstract(int instruction_start = 0) const;
192
201 void setInitializationMask(int mask_in);
202
207 void setRefreshAtomIndex(int index_in);
208
214 void setRefreshWorkCode(int code_in);
215
216private:
217 int tile_count;
218 int import_count;
220 NbwuKind kind;
223 int score;
224 int init_accumulation;
232 int refresh_atom_start;
237 int refresh_code;
241 std::vector<int> imports;
244 std::vector<int> import_system_indices;
248 std::vector<int> import_size_keys;
250 std::vector<uint2> tile_instructions;
252
259 int getImportSystemIndex(const SeMaskSynthesisReader &ser, int atom_index);
260};
261
284bool addTileToWorkUnitList(int3* tile_list, int* import_coverage,
285 const std::vector<int> &system_tile_starts, int *import_count,
286 int *current_tile_count, const int ti, const int tj, const int sysid);
287
293void setPropertyInitializationMasks(std::vector<NonbondedWorkUnit> *all_wu, NbwuKind kind);
294
300int nonbondedWorkUnitInitCode(const InitializationTask init_request, const int cache_depth);
301
315void distributeInitializationRanges(std::vector<NonbondedWorkUnit> *result, int natom,
316 int init_code, const GpuDetails &gpu = null_gpu);
317
340std::vector<NonbondedWorkUnit>
341buildNonbondedWorkUnits(const StaticExclusionMaskSynthesis &poly_se,
342 InitializationTask init_request = InitializationTask::NONE,
343 int random_cache_depth = 0, const GpuDetails &gpu = null_gpu);
344
345std::vector<NonbondedWorkUnit>
346buildNonbondedWorkUnits(const StaticExclusionMask &se,
347 InitializationTask init_request = InitializationTask::NONE,
348 int random_cache_depth = 0);
350
351} // namespace synthesis
352} // namespace stormm
353
354#include "nonbonded_workunit.tpp"
355
356#endif
Pertinent aspects of one particular GPU. Condensing the data for each GPU in this manner helps to ens...
Definition gpu_details.h:27
A simple pair list for an all-to-all calculation with exclusion masks. The list stores masks for 16 x...
Definition static_exclusionmask.h:81
int getImportCount() const
Get the number of tile_length atom imports needed for this work units.
Definition nonbonded_workunit.cpp:350
const std::vector< uint2 > & getTileInstructions() const
Get the list of tile instructions for this work unit.
Definition nonbonded_workunit.cpp:374
int getInitializationMask() const
Get the mask for initializing per-atom properties on any of the imported atom groups.
Definition nonbonded_workunit.cpp:355
NonbondedWorkUnit(const NonbondedWorkUnit &original)=default
Take the default copy and move constructors as well as assignment operators for this object,...
NonbondedWorkUnit(const StaticExclusionMask &se, const std::vector< int3 > &tile_list)
The constructor accepts an exclusion mask and a list of nonbonded interaction tiles to compute....
Definition nonbonded_workunit.cpp:22
void setRefreshWorkCode(int code_in)
Set the accumulator refreshing instructions for this work unit, i.e. "set X force accumulators ...
Definition nonbonded_workunit.cpp:449
void setRefreshAtomIndex(int index_in)
Set the atom index at which to begin accumulator refreshing. The actual work done depends on the accu...
Definition nonbonded_workunit.cpp:444
void setInitializationMask(int mask_in)
Set the initialization mask for atomic properties that contribute once to an accumulated sum,...
Definition nonbonded_workunit.cpp:439
int4 getTileLimits(int index) const
Get the abscissa and ordinate atom limits for a tile from within this work unit. The abscissa limits ...
Definition nonbonded_workunit.cpp:360
int getTileCount() const
Get the tile count of this work units.
Definition nonbonded_workunit.cpp:345
std::vector< int > getAbstract(int instruction_start=0) const
Get an abstract for this work unit, layed out to work within an AtomGraphSynthesis....
Definition nonbonded_workunit.cpp:379
An exclusion mask object for a compilation of systems. All systems are represented in full detail,...
Definition static_mask_synthesis.h:54
Definition stormm_vector_types.h:27
Definition stormm_vector_types.h:33
The read-only abstract for a static exclusion mask compilation. This provides access in a similar for...
Definition static_mask_synthesis.h:20