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