53 const std::vector<CellID>& acceleratedCells,
59 phiprof::Timer verificationTimer {
"gpu ACC allocation verifications"};
60 const uint nCells = (uint)acceleratedCells.size();
62 verificationTimer.stop();
66 int intersections_id {phiprof::initializeTimer(
"cell-compute-intersections")};
67 uint gpuMaxBlockCount = 0;
70 uint threadGpuMaxBlockCount = 0;
71 #pragma omp for schedule(static)
79 const uint blockCount =
vmesh->size();
80 threadGpuMaxBlockCount = std::max(threadGpuMaxBlockCount,blockCount);
84 gpuMaxBlockCount = std::max(gpuMaxBlockCount,threadGpuMaxBlockCount);
93 std::vector<int> dimOrder(3);
108 std::cerr<<
"ERROR! Incorrect map_order "<<map_order<<
"!"<<std::endl;
116 for (
int dimIndex = 0; dimIndex<3; ++dimIndex) {
117 int dimension = dimOrder[dimIndex];
120 uint gpuMaxBlockCount = 0;
123 uint threadGpuMaxBlockCount = 0;
124 #pragma omp for schedule(static)
133 threadGpuMaxBlockCount = std::max(threadGpuMaxBlockCount,blockCount);
148 gpuMaxBlockCount = std::max(gpuMaxBlockCount,threadGpuMaxBlockCount);
152 verificationTimer.start();
155 verificationTimer.stop();
158 phiprof::Timer copyTimer {
"copy pointer addresses to device"};
164 CHK_ERR(
gpuMemcpy(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*), dev_allMaps),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*), host_allMaps), 2*nCells*
sizeof(Hashinator::Hashmap<vmesh::GlobalID,vmesh::LocalID>*),
gpuMemcpyHostToDevice) );
169 CHK_ERR(
gpuMemcpy(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), dev_lists_delete),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), host_lists_delete), nCells*
sizeof(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*),
gpuMemcpyHostToDevice) );
170 CHK_ERR(
gpuMemcpy(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), dev_lists_to_replace),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), host_lists_to_replace), nCells*
sizeof(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*),
gpuMemcpyHostToDevice) );
171 CHK_ERR(
gpuMemcpy(
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), dev_lists_with_replace_old),
GET_POINTER(
gpuMemoryManager,
SINGLE_ARG(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*), host_lists_with_replace_old), nCells*
sizeof(split::SplitVector<Hashinator::hash_pair<vmesh::GlobalID,vmesh::LocalID>>*),
gpuMemcpyHostToDevice) );
176 phiprof::Timer accTimer {profName};
179 uint block_indices_to_id[3] = {0, 0, 0};
180 uint block_indices_to_probe[3] = {0, 0, 0};
181 uint cell_indices_to_id[3] = {0, 0, 0};
184 int Dacc=0, Dother=0;
189 block_indices_to_id[0] = D0*D1;
190 block_indices_to_id[1] = D0;
191 block_indices_to_id[2] = 1;
195 block_indices_to_probe[0] = D1*D2;
196 block_indices_to_probe[1] = D2;
197 block_indices_to_probe[2] = 1;
202 cell_indices_to_id[0] =
WID2;
203 cell_indices_to_id[1] =
WID;
204 cell_indices_to_id[2] = 1;
208 block_indices_to_id[0] = 1;
209 block_indices_to_id[1] = D0*D1;
210 block_indices_to_id[2] = D0;
214 block_indices_to_probe[0] = D2;
215 block_indices_to_probe[1] = D0*D2;
216 block_indices_to_probe[2] = 1;
221 cell_indices_to_id[0] = 1;
222 cell_indices_to_id[1] =
WID2;
223 cell_indices_to_id[2] =
WID;
227 block_indices_to_id[0] = 1;
228 block_indices_to_id[1] = D0;
229 block_indices_to_id[2] = D0*D1;
233 block_indices_to_probe[0] = D1;
234 block_indices_to_probe[1] = 1;
235 block_indices_to_probe[2] = D0*D1;
240 cell_indices_to_id[0] = 1;
241 cell_indices_to_id[1] =
WID;
242 cell_indices_to_id[2] =
WID2;
245 std::cerr<<
"Invalid dimension "<<dimension<<
"!"<<std::endl;
256 #pragma omp parallel for
259 Population& pop = mpiGrid[cellID]->get_population(popID);
284 std::cerr<<
"Invalid dimension "<<dimension<<
"!"<<std::endl;
295 uint queuedCells = 0;
296 uint checkedCells = 0;
299 std::vector<CellID> launchCells;
306 if (blockCount > 0) {
308 launchCells.push_back(cid);
317 if (queuedCells == maxChunkSize || ( (
cellIndex==nCells-1) && (queuedCells > 0) )) {
319 string timerName =
"semilag-acc-dim"+std::to_string(dimension)+
"-chunk";
321 phiprof::Timer accChunkTimer {timerName};