首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在教堂里,限制数组类型为具有连续数据的本地数组的最佳方法是什么?

在教堂里,限制数组类型为具有连续数据的本地数组的最佳方法是什么?
EN

Stack Overflow用户
提问于 2020-06-08 16:47:39
回答 1查看 58关注 0票数 4

考虑以下教堂功能:

代码语言:javascript
运行
复制
proc myfunc(arr : []?T) {}

我想保证数组(在编译时)是

  1. 本地
  2. 底层数据存储在连续内存块中。

做这件事最好的方法是什么?

可能的应用程序是在myfunc中调用C函数的情况。如果满足1&2,在编译时作为约束执行此操作可能允许重载myfunc以采取快速路径。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 18:46:37

不幸的是,没有正式的面向用户的方式来进行这样的查询,从Chapel 1.22开始,尽管在教堂堂的GitHub问题页面上提交特性请求请求这样的功能是合理的。在这样做时,请注意,知道数组是否存储在单个连续块中与存储在单个区域设置上的数组与存储在本地的数组(例如,数组可以存储在单独的连续块中,而区域设置与查询的位置是不同的/远程的)之间存在细微差别。Chapel编译器通常可以静态地回答前两个查询,但是第三个查询只能动态地回答,因为通常不可能在编译时对存储变量的区域设置进行推理。

内部/面向开发人员的查询可能同时用作权宜之计,这就是.isDefaultRectangular()查询,它是为域和数组实现的,并依赖于在实现中进行此类查询。它指示是否使用矩形域和数组的默认域映射来实现域或数组。从本质上说,这个域映射是不分布的,并且是连续存储的.下面的示例显示它的行为(TIO):

代码语言:javascript
运行
复制
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]);

产出如下:

代码语言:javascript
运行
复制
Dloc.isDefaultRectangular() = true
Aloc.isDefaultRectangular() = true
Ddist.isDefaultRectangular() = false
Adist.isDefaultRectangular() = false
slice.isDefaultRectangular() = false

此查询返回一个param结果,指示其结果在编译时已知。因此,当它返回true时,它指示数组存储在单个区域设置上的单个块中,但并没有说明是否是运行查询的区域设置。为此,需要使用执行时X.locale == here检查。

另外,请注意,对于本地数组的片的情况,它返回false。这可能是您想要的,也可能不是您想要的,因为虽然基础数组仍然是连续的和本地的,但是切片所描述的元素可能并不一定是这样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62267144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档