MCPcopy Create free account
hub / github.com/NGSolve/ngsolve / DeviceSparseCholeskySolveLTransKernel

Function DeviceSparseCholeskySolveLTransKernel

ngscuda/dev_sparsecholesky.cpp:190–331  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

188
189
190 __global__ void DeviceSparseCholeskySolveLTransKernel (
191 FlatTable<int> dependency,
192 FlatArray<Dev<int>> incomingdep,
193 FlatVector<Dev<double>> hy,
194 int & cnt,
195 FlatArray<Dev<MicroTask>> microtasks,
196 FlatArray<Dev<int>> blocks,
197 FlatArray<Dev<int>> rowindex2,
198 FlatArray<Dev<size_t>> firstinrow_ri,
199 FlatArray<Dev<size_t>> firstinrow,
200 FlatArray<Dev<double>> lfact
201 )
202 {
203 __shared__ int myjobs[16]; // max blockDim.y;
204
205 while (true)
206 {
207 if (threadIdx.x == 0)
208 myjobs[threadIdx.y] = atomicAdd(&cnt, 1);
209 __syncwarp();
210
211 int myjob = dependency.Size()-1 - myjobs[threadIdx.y];
212 if (myjob < 0)
213 break;
214
215 volatile int * n_deps = (int*)&incomingdep[myjob];
216 if (threadIdx.x == 0)
217 while(*n_deps);
218 __syncwarp();
219
220 // do the work for myjob....
221
222 MicroTask task = microtasks[myjob];
223 size_t blocknr = task.blocknr;
224 auto range = T_Range<int>(blocks[blocknr], blocks[blocknr+1]);
225 auto base = firstinrow_ri[range.First()] + range.Size()-1;
226 auto ext_size = firstinrow[range.First()+1]-firstinrow[range.First()] - range.Size()+1;
227 auto extdofs = rowindex2.Range(base, base+ext_size);
228 __threadfence();
229 // TODO: needs transpose:
230 if ((task.type == MicroTask::B_BLOCK) || (task.type == MicroTask::LB_BLOCK))
231 {
232 if (extdofs.Size() != 0)
233 {
234 auto myr = Range(extdofs).Split (task.bblock, task.nbblocks);
235 auto my_extdofs = extdofs.Range(myr);
236
237 // for (auto i : range)
238 for (int i = range.First()+threadIdx.x; i < range.Next(); i += blockDim.x)
239 {
240 size_t first = firstinrow[i] + range.end()-i-1;
241 auto ext_lfact = lfact.Range(first, first+extdofs.Size());
242
243 double val = 0.0;
244 for (auto j : Range(my_extdofs))
245 val += ext_lfact[myr.begin()+j] * hy(my_extdofs[j]);
246
247 atomicAdd ((double*)(&hy(i)), -val);

Callers

nothing calls this directly

Calls 9

atomicAddFunction · 0.85
RangeFunction · 0.50
SizeMethod · 0.45
FirstMethod · 0.45
RangeMethod · 0.45
SplitMethod · 0.45
endMethod · 0.45
beginMethod · 0.45
DataMethod · 0.45

Tested by

no test coverage detected