| 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 | } |
nothing calls this directly
no test coverage detected