7.12 阴影宽度说明 | ![]() ![]() |
当编译最近相邻代码时,例如离散化偏微分方程和实现卷积时,一个标准的技术是在每个处理器上为本地数组区域分配存储空间,在此存储空间中包括一些额外空间,这些额外空间是为那些必须从邻近处理器移入的元素所准备的。这些额外存储被称为“阴影边”。理论上,数组的每一维有两个阴影边:一个在数组区域的低端,而另一个在数组区域的高端。
在单一一个例程中,编译器可以告诉哪一个数组需要阴影边,并相应地分配额外空间。但是,因为阴影区的宽度依赖于所使用的计算模板的大小,所以在不同的例程中同一数组可能需要不同的宽度。这样,如果没有过程间分析,则在每次过程调用时,可能需要将数组参数复制到一个具有适当阴影宽度的空间中。当从子程序返回时,将需要一个类似的数据移动,以便将数据拷回它的原始位置中。可通过允许用户在数组定义时指定所需的阴影宽度来避免这一不必要的数据移动。
定义阴影宽度的形式化语法如下所示:
H716 shadow-directive is SHADOW shadow-target shadow-attr-stuff
H717 shadow-target is object-name or component-name
H718 shadow-attr-stuff is ( shadow-spec-list )
H719 shadow-spec is width or low-width : high-width
H720 width is int-expr
H721 low-width is int-expr H722 high-width is int-expr
约束:描述width,low-width或high-width的int-expr必须是一个值大于或等于0的常数说明表达式。
约束:没有阴影指令等价于有一条每个shadow-spec都等于0的阴影指令。
约束:值为width的shadow-spec等价于一个值为width:width的shadow-spec。
这样,指令
!HPF$ DISTRIBUTE(BLOCK) :: A
!HPF$ SHADOW(w) :: A
指明数组A以BLOCK方式分配并且在两个边上都有一个宽度为w的阴影。如果A是一个哑参,则这就为编译器提供了足够的信息来在过程调用时阻止不必要的数据移动。
另外,还可以为某一维的低端和高端分别指定不同的阴影宽度。例如:
REAL, DIMENSION (1000) :: A
!HPF$ DISTRIBUTE(BLOCK), SHADOW(1:2) :: A
....
FORALL (i = 2, 998)
A(i) = 0.25* (A(i) + A(i-1) + A(i+1) + A(i+2))
指出在低端仅需要一个非本地数据而在高端需要两个。
Copyright: NPACT | ![]() ![]() |