实施 DSI 时域映射 Class 中未解决的调用 'init'
unresolved call 'init' in Domain Map Class when implementing DSI
(chpl 版本 1.16.0.e43acc7)
我开始学习 DSI interface 并且 运行 在从 Distribution class 中的 dsiNewRectangularDom 函数构造域 class 时遇到了一个令人困惑的问题:
class MyDist : BaseDist {
proc MyDist( fold_dimensions ...?dims ){ }
proc dsiNewRectangularDom(param rank: int, type idxType, param stridable: bool, inds) {
var dom = new MyDom( rank=rank, idxType=idxType, stridable=stridable, dist=this);
return dom;
}
}
class MyDom : BaseRectangularDom { }
class MyArr : BaseArr { }
config const n = 4;
config const m = 8;
const base_domain = {1..#n,1..#m};
const mapped_domain = base_domain dmapped MyDist( 1 );
(这是非常基础的代码,我不希望它能完全编译,但我卡在了这部分。)
这会产生编译错误:
file.chpl:5: In function 'dsiNewRectangularDom':
file.chpl:6: error: unresolved call 'MyDom.init(rank=2, idxType=type int(64), stridable=0, dist=MyDist)'
file.chpl:11: note: candidates are: MyDom.init(_arrs, _arrs_containing_dom: int(64), _arrsLock: atomicbool, _free_when_no_arrs: bool, pid: int(64), param rank: int(64), type idxType, param stridable: bool)
(参见 this TIO instance)
我对这个 init 函数的来源有点困惑。
我正在关注 Block、BlockDist 和 BlockDom 的行为(特别是 BlockDist.chpl:533
其中 Block.dsiNewRectangularDom 调用 BlockDom 的构造函数。
由于MyDom 继承自BaseRectangularDom,我(1)不需要声明rank、idxType 等成员变量,并且(2)不需要定义MyDom(rank, idxType, ...) 构造函数。
我也没有看到可以学习的 BlockDom.init 函数。
我错过了什么?
您最直接的问题是 BaseRectangularDom
(因此 MyDom
)没有名为 'dist' 的字段。像 BlockDom
,您需要添加一个 'dist' 字段,可能像:
var dist : MyDist;
修复该问题后,您将遇到下一个错误(未实现 dsiAssignDomain)。
错误消息可能提到 'init' 作为从构造函数到 initializers 的持续转换的副作用。
(chpl 版本 1.16.0.e43acc7)
我开始学习 DSI interface 并且 运行 在从 Distribution class 中的 dsiNewRectangularDom 函数构造域 class 时遇到了一个令人困惑的问题:
class MyDist : BaseDist {
proc MyDist( fold_dimensions ...?dims ){ }
proc dsiNewRectangularDom(param rank: int, type idxType, param stridable: bool, inds) {
var dom = new MyDom( rank=rank, idxType=idxType, stridable=stridable, dist=this);
return dom;
}
}
class MyDom : BaseRectangularDom { }
class MyArr : BaseArr { }
config const n = 4;
config const m = 8;
const base_domain = {1..#n,1..#m};
const mapped_domain = base_domain dmapped MyDist( 1 );
(这是非常基础的代码,我不希望它能完全编译,但我卡在了这部分。)
这会产生编译错误:
file.chpl:5: In function 'dsiNewRectangularDom':
file.chpl:6: error: unresolved call 'MyDom.init(rank=2, idxType=type int(64), stridable=0, dist=MyDist)'
file.chpl:11: note: candidates are: MyDom.init(_arrs, _arrs_containing_dom: int(64), _arrsLock: atomicbool, _free_when_no_arrs: bool, pid: int(64), param rank: int(64), type idxType, param stridable: bool)
(参见 this TIO instance)
我对这个 init 函数的来源有点困惑。 我正在关注 Block、BlockDist 和 BlockDom 的行为(特别是 BlockDist.chpl:533 其中 Block.dsiNewRectangularDom 调用 BlockDom 的构造函数。 由于MyDom 继承自BaseRectangularDom,我(1)不需要声明rank、idxType 等成员变量,并且(2)不需要定义MyDom(rank, idxType, ...) 构造函数。 我也没有看到可以学习的 BlockDom.init 函数。
我错过了什么?
您最直接的问题是 BaseRectangularDom
(因此 MyDom
)没有名为 'dist' 的字段。像 BlockDom
,您需要添加一个 'dist' 字段,可能像:
var dist : MyDist;
修复该问题后,您将遇到下一个错误(未实现 dsiAssignDomain)。
错误消息可能提到 'init' 作为从构造函数到 initializers 的持续转换的副作用。