微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用OpenACC加速不完整的LDL ^ T预调节器

如何解决使用OpenACC加速不完整的LDL ^ T预调节器

原始问题:

我对OpenACC相对较新,但是到目前为止,我已经成功地使我的迭代Fortran求解器套件(基于CG)取得了相对成功,并且在我的Nvidia RTX GeForce卡上的速度提高了大约7倍。如果不使用任何预处理,或者使用对角预处理,则所有方法都可以正常工作。但是,如果我想加快稍微复杂一些的预处理器的速度,问题就开始了-渐进式LDL ^ T是我的最爱。

执行不完整的LDL ^ T因式分解的代码如下:

20   do i = 1,n                        ! browse through rows
21     sum1 = a % val(a % dia(i))       ! take diagonal entry
22     do j = a % row(i),a % dia(i)-1  ! browse only lower triangular part
23       k = a % col(j)                 ! fetch the column
24       sum1 = sum1 - f % val(f % dia(k)) * a % val(j) * a % val(j)
25     end do
26
27     ! Keep only the diagonal from LDL decomposition
28     f % val(f % dia(i)) = 1.0 / sum1
29   end do

这段代码本质上是顺序的。在浏览各行时,我使用在前几行中执行的因式分解,因此从一开始就不应该很容易并行化。我设法找到通过OpenACC指令对其进行编译的唯一方法,并牢记其顺序性质,是:

20   !$acc  parallel loop seq                               &
21   !$acc& present(a,a % row,a % col,a % dia,a % val)  &
22   !$acc& present(f,f % row,f % col,f % dia,f % val)
23   do i = 1,n                        ! browse through rows
24     sum1 = a % val(a % dia(i))       ! take diagonal entry
25     !$acc loop vector reduction(+:sum1)
26     do j = a % row(i),a % dia(i)-1  ! browse only lower traingular part
27       k = a % col(j)                 ! fetch the colummn
28       sum1 = sum1 - f % val(f % dia(k)) * a % val(j) * a % val(j)
29     end do 
30
31     ! Keep only the diagonal from LDL decomposition
32     f % val(f % dia(i)) = 1.0 / sum1
33   end do

尽管这些OpenACC指令可以在GPU上进行计算,并且得到与非GPU变体相同的结果,但是比我更有经验的人已经在这里看到了很多并行性和加速性。外循环(i,通过行)是顺序的,内循环(jk)仅浏览几个元素。

总的来说,不完整的LDL ^ T预处理CG解算器的GPU变体比非GPU版本慢几倍。

有人知道如何解决此问题吗?我知道这可能不容易,但也许我已经不知道这个问题已经做过一些工作,或者也许有使用OpenACC的更好方法

几天后更新

我做了作业,在Nvidia网站及其他地方阅读了一些文章,是的,因式分解算法确实是顺序的,如何在GPU上实现它似乎是一个悬而未决的问题。在最近的博客中:https://docs.nvidia.com/cuda/incomplete-lu-cholesky/index.html,作者正在将cuBLAS和cuSPARSE用于CG,但仍在cpu上进行分解。他报告的平均提速约为2,我敢说这有点让人难以接受。

因此,我决定通过矩阵行着色来进行解决,并按颜色执行重新分解颜色,如下所示:

21   n_colors = 8
22
23   do color = 1,n_colors
24
25     c_low = (color-1) * n / n_colors + 1  ! color's upper bound
26     c_upp =  color    * n / n_colors      ! color's lower bound
27
28     do i = c_low,c_upp                ! browse your color band
29       sum1 = a % val(a % dia(i))       ! take diagonal entry
30       do j = a % row(i),a % dia(i)-1  ! only lower traingular
31         k = a % col(j)
32         if(k >= c_low) then            ! limit entries to your color
33           sum1 = sum1 - f % val(f % dia(k)) * a % val(j) * a % val(j)
34         end if
35       end do
36
37       ! This is only the diagonal from LDL decomposition
38       f % val(f % dia(i)) = 1.0 / sum1
39     end do
40   end do    ! colors

在第32行中,我仅将矩阵项限制为属于其循环的 color 。显然,由于因式分解矩阵的不完全性更加明显(忽略了更多的条目),因此收敛性较差,但仍然比简单对角线前置条件更好。

我对OpenACC进行了以下操作:

21   n_colors = 8
22
23   !$acc  parallel loop num_gangs(8) tile(8)  ! do each tile in its own color
24   !$acc& present(a,a % val)  &
25   !$acc& present(f,f % val)
26   do color = 1,n_colors
27
28     c_low = (color-1) * n / n_colors + 1  ! color's upper bound
29     c_upp =  color    * n / n_colors      ! color's lower bound
30
31     !$acc loop seq                     ! inherently sequential
32     do i = c_low,c_upp                ! browse your color band
33       sum1 = a % val(a % dia(i))       ! take diagonal entry
34       !$acc loop vector reduction(+:sum1)
35       do j = a % row(i),a % dia(i)-1  ! only lower traingular
36         k = a % col(j)
37         if(k >= c_low) then            ! limit entries to your color
38           sum1 = sum1 - f % val(f % dia(k)) * a % val(j) * a % val(j)
39         end if
40       end do
41
42       ! This is only the diagonal from LDL decomposition
43       f % val(f % dia(i)) = 1.0 / sum1
44     end do 
45   end do    ! colors

我从OpenACC变体中获得的结果与仅从cpu中获得的结果相同,只是GPU上的性能仍然慢得多。但是,似乎tile指令按我的预期工作,每个帮派似乎都在按自己的颜色工作,因为从GPU获得的结果是相同的。

关于如何提高性能的任何建议?我在上面的代码中做一些愚蠢的事情吗? (探查器显示,由于整个系统都在GPU上,因此计算受GPU约束,但是性能确实很差。)

最诚挚的问候

解决方法

不确定这是否有帮助,但是本文介绍了一种用于在GPU上解决CG的方法。它使用cuSPARSE和CUDA进行实现,但是您可能能够获得可以应用于代码的想法。

https://www.dcs.warwick.ac.uk/pmbs/pmbs14/PMBS14/Workshop_Schedule_files/8-CUDAHPCG.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。