|
我在尝试做一个四维矩阵运算,维度为num。矩阵用一维数组存储, 主要代码如下tmp=0.0
do d = 1, num
do c = 1, num
do b = 1, c-1
do a = 1, b-1
idx1 = (d-1)*num**3+(c-1)*num**2+(b-1)*num+a
idx2 = (d-1)*num**3+(a-1)*num**2+(c-1)*num+b
idx3 = (d-1)*num**3+(b-1)*num**2+(a-1)*num+c
tmp=tmp+matrix(idx1)+matrix(idx2)+matrix(idx3)
enddo
enddo
enddo
enddo
-----
这里的循环里b依赖于c,a依赖于b。我尝试利用omp并行,可以得到和串行一样的结果,并行代码如下
!$omp parallel do reduction(+:tmpe)
do……
enddo……
!$omp end parallel do
但是如果用openacc在gpu下并行则不行(已经将matrix,copy到GPU上新开的matrix_device中),代码如下
!$acc parallel loop reduction(+:tmpe)
do……
enddo……
!$acc end parallel loop
然后进一步发现如果b和a的循环次数都是“1,num”, 没有依次和c,b相关联,则能够计算出正确的tmpe。
由于矩阵具有对称性,如果将b和a都按照num来进行循环,则会比源代码中计算量多六倍。
求大神指导在open acc的情况下,这一段代码应该如何写才能够得到足够快的运行速度。
====================
|
|