考虑以下教堂功能:
proc myfunc(arr : []?T) {}
我想保证数组(在编译时)是
做这件事最好的方法是什么?
可能的应用程序是在myfunc
中调用C函数的情况。如果满足1&2,在编译时作为约束执行此操作可能允许重载myfunc
以采取快速路径。
发布于 2020-06-08 18:46:37
不幸的是,没有正式的面向用户的方式来进行这样的查询,从Chapel 1.22开始,尽管在教堂堂的GitHub问题页面上提交特性请求请求这样的功能是合理的。在这样做时,请注意,知道数组是否存储在单个连续块中与存储在单个区域设置上的数组与存储在本地的数组(例如,数组可以存储在单独的连续块中,而区域设置与查询的位置是不同的/远程的)之间存在细微差别。Chapel编译器通常可以静态地回答前两个查询,但是第三个查询只能动态地回答,因为通常不可能在编译时对存储变量的区域设置进行推理。
内部/面向开发人员的查询可能同时用作权宜之计,这就是.isDefaultRectangular()
查询,它是为域和数组实现的,并依赖于在实现中进行此类查询。它指示是否使用矩形域和数组的默认域映射来实现域或数组。从本质上说,这个域映射是不分布的,并且是连续存储的.下面的示例显示它的行为(TIO):
use CyclicDist;
// declare a local / non-distributed domain and array
var Dloc = {1..3, 1..3};
var Aloc: [Dloc] real;
// declare a cyclically-distributed domain and array
var Ddist = {1..3, 1..3} dmapped Cyclic((1,1));
var Adist: [Ddist] real;
// generic function that queries whether or not its argument uses the
// default rectangular domain map
proc testit(name, X) {
writeln(name, ".isDefaultRectangular() = ", X.isDefaultRectangular());
}
// various calls to the generic function
testit("Dloc", Dloc);
testit("Aloc", Aloc);
testit("Ddist", Ddist);
testit("Adist", Adist);
testit("slice", Aloc[2..3, 2..3]);
产出如下:
Dloc.isDefaultRectangular() = true
Aloc.isDefaultRectangular() = true
Ddist.isDefaultRectangular() = false
Adist.isDefaultRectangular() = false
slice.isDefaultRectangular() = false
此查询返回一个param
结果,指示其结果在编译时已知。因此,当它返回true
时,它指示数组存储在单个区域设置上的单个块中,但并没有说明是否是运行查询的区域设置。为此,需要使用执行时X.locale == here
检查。
另外,请注意,对于本地数组的片的情况,它返回false。这可能是您想要的,也可能不是您想要的,因为虽然基础数组仍然是连续的和本地的,但是切片所描述的元素可能并不一定是这样。
https://stackoverflow.com/questions/62267144
复制相似问题