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

Method Mult

ngscuda/cuda_linalg.cpp:384–448  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

382
383
384 void DevConstantElementByElementMatrix ::
385 Mult (const BaseVector & x, BaseVector & y) const
386 {
387 static Timer t("DevConstantEBEMatrix::Mult"); RegionTimer reg(t);
388 static Timer tmult("DevConstantEBEMatrix::Mult - mult");
389 static Timer tcopyin("DevConstantEBEMatrix::Mult - copyin");
390 static Timer tcopyout("DevConstantEBEMatrix::Mult - copyout");
391
392 UnifiedVectorWrapper ux(x);
393 UnifiedVectorWrapper uy(y);
394
395 ux.UpdateDevice();
396 uy.UpdateDevice();
397
398 if (synckernels) cudaDeviceSynchronize();
399
400
401 if (!output_onto)
402 {
403 uy = 0.0;
404 MultAdd (1, x, y);
405 return;
406 }
407
408
409 {
410 DevStackArray<double> dev_hx(numblocks*devmat.Width());
411 DevStackArray<double> dev_hy(numblocks*devmat.Height());
412
413 tcopyin.Start();
414 // ConstEBEKernelCopyIn (numblocks, devmat.Width(), rowdnums.DevData(), ux.DevData(), dev_hx.DevData());
415 DeviceParallelFor
416 (numblocks*devmat.Width(),
417 [locx=dev_hx.DevData(), globx=ux.DevData(), idx=rowdnums.DevData()] DEVICE_LAMBDA (auto tid)
418 {
419 locx[tid] = globx[idx[tid]];
420 });
421 if (synckernels) cudaDeviceSynchronize();
422 tcopyin.Stop();
423
424 // dev_hy = dev_hx * Trans(mat)
425 tmult.Start();
426 FlatMatrix<Dev<double>> matx(numblocks, devmat.Width(), dev_hx.Data());
427 FlatMatrix<Dev<double>> maty(numblocks, devmat.Height(), dev_hy.Data());
428 // MultMatMat (matx, Trans(devmat), maty, s, 0);
429 maty = matx * Trans(devmat);
430 if (synckernels) cudaDeviceSynchronize();
431 tmult.Stop();
432
433 tcopyout.Start();
434 // ConstEBEKernelCopyOut (numblocks, devmat.Height(), coldnums.DevData(), dev_hy.DevData(), uy.DevData());
435 DeviceParallelFor
436 (numblocks*devmat.Height(),
437 [globy=uy.DevData(), locy=dev_hy.DevData(), idx=coldnums.DevData() ] DEVICE_LAMBDA (auto tid)
438 {
439 // atomicAdd((double*)globy+idx[tid], locy[tid]);
440 globy[idx[tid]] = locy[tid];
441 });

Callers

nothing calls this directly

Calls 9

DeviceParallelForFunction · 0.85
StopMethod · 0.80
InvalidateHostMethod · 0.80
MultAddFunction · 0.50
TransFunction · 0.50
WidthMethod · 0.45
HeightMethod · 0.45
DevDataMethod · 0.45
DataMethod · 0.45

Tested by

no test coverage detected