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

Method MultTransAdd

ngscuda/cuda_linalg.cpp:538–600  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

536
537
538 void DevConstantElementByElementMatrix ::
539 MultTransAdd (double s, const BaseVector & x, BaseVector & y) const
540 {
541 static Timer t("DevConstantEBEMatrix::MultTransAdd"); RegionTimer reg(t);
542
543 UnifiedVectorWrapper ux(x);
544 UnifiedVectorWrapper uy(y);
545
546 ux.UpdateDevice();
547 uy.UpdateDevice();
548
549 auto hm = devmat.Height();
550 auto wm = devmat.Width();
551 // if (disjoint_rows)
552 if (true)
553 {
554 DevStackArray<double> dev_hx(numblocks*hm);
555 DevStackArray<double> dev_hy(numblocks*wm);
556
557 // ConstEBEKernelCopyIn (numblocks, hm, coldnums.DevData(), (double*)ux.DevData(), dev_hx.DevData());
558 DeviceParallelFor
559 (numblocks*hm,
560 [locx=dev_hx.DevData(), globx=ux.DevData(), idx=coldnums.DevData()] DEVICE_LAMBDA (auto tid)
561 {
562 locx[tid] = globx[idx[tid]];
563 });
564
565 // dev_hy = dev_hx * mat
566
567 FlatMatrix<Dev<double>> matx(numblocks, hm, dev_hx.Data());
568 FlatMatrix<Dev<double>> maty(numblocks, wm, dev_hy.Data());
569 MultMatMat (matx, devmat, maty, s, 0);
570
571 // ConstEBEKernelCopyOut (numblocks, wm, rowdnums.DevData(), dev_hy.DevData(), (double*)uy.DevData());
572 DeviceParallelFor
573 (numblocks*wm,
574 [globy=uy.DevData(), locy=dev_hy.DevData(), idx=rowdnums.DevData()] DEVICE_LAMBDA (auto tid)
575 {
576 atomicAdd((double*)globy+idx[tid], locy[tid]);
577 });
578
579 }
580 else
581 {
582 for (auto c : row_coloring)
583 {
584 DevStackArray<double> dev_hx(c.Size()*hm);
585 DevStackArray<double> dev_hy(c.Size()*wm);
586
587 ConstEBEKernelCopyInIdx (c.Size(), (int*)c.Data(), hm, coldnums.DevData(), (double*)ux.DevData(), dev_hx.DevData());
588 // dev_hy = dev_hx * mat
589
590 FlatMatrix<Dev<double>> matx(c.Size(), hm, dev_hx.Data());
591 FlatMatrix<Dev<double>> maty(c.Size(), wm, dev_hy.Data());
592 MultMatMat (matx, devmat, maty, s, 0);
593
594 ConstEBEKernelCopyOutIdx (c.Size(), (int*)c.Data(), wm, rowdnums.DevData(), dev_hy.DevData(), (double*)uy.DevData());
595 }

Callers

nothing calls this directly

Calls 9

DeviceParallelForFunction · 0.85
atomicAddFunction · 0.85
InvalidateHostMethod · 0.80
MultMatMatFunction · 0.70
HeightMethod · 0.45
WidthMethod · 0.45
DevDataMethod · 0.45
DataMethod · 0.45
SizeMethod · 0.45

Tested by

no test coverage detected