2#ifndef STORMM_NONBONDED_WORKUNIT_H
3#define STORMM_NONBONDED_WORKUNIT_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"
16using card::GpuDetails;
17using energy::StaticExclusionMask;
18using energy::tile_length;
19using energy::tile_lengths_per_supertile;
23constexpr int small_block_max_atoms = 320;
26constexpr int small_block_max_imports = small_block_max_atoms / tile_length;
29constexpr int small_block_tile_width = 8;
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;
40constexpr int huge_nbwu_tiles = tile_lengths_per_supertile * tile_lengths_per_supertile;
43constexpr int tile_groups_wu_abstract_length = 64;
46constexpr int supertile_wu_abstract_length = 8;
117 const std::vector<int3> &tile_list);
191 std::vector<int>
getAbstract(
int instruction_start = 0)
const;
224 int init_accumulation;
232 int refresh_atom_start;
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;
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);
293void setPropertyInitializationMasks(std::vector<NonbondedWorkUnit> *all_wu, NbwuKind kind);
300int nonbondedWorkUnitInitCode(
const InitializationTask init_request,
const int cache_depth);
315void distributeInitializationRanges(std::vector<NonbondedWorkUnit> *result,
int natom,
316 int init_code,
const GpuDetails &gpu = null_gpu);
340std::vector<NonbondedWorkUnit>
342 InitializationTask init_request = InitializationTask::NONE,
343 int random_cache_depth = 0,
const GpuDetails &gpu = null_gpu);
345std::vector<NonbondedWorkUnit>
347 InitializationTask init_request = InitializationTask::NONE,
348 int random_cache_depth = 0);
354#include "nonbonded_workunit.tpp"
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