小编Nik*_*han的帖子

如何在Chapel中返回对数组切片的引用?

我正在尝试返回对数组切片的引用,但是我得到了以下编译时错误(其中有问题的行在 slice

test.chpl:9:错误:ref返回非法表达式

返回完整数组工作正常,就像在主程序中引用切片一样.

有没有正确的方法将ref返回到切片?提前致谢!

record R {
  var A : [0.. #10] int;

  proc full() ref {
    return A;
  }

  proc slice() ref {
    return A[0.. #5];
  }
}

var r : R;
ref x1 = r.full();
ref x2 = r.slice();
ref x3 = x1[0.. #5];
Run Code Online (Sandbox Code Playgroud)

只是为了完整性:

chpl版本1.16.0预发布(2659cc6)

arrays slice chapel

6
推荐指数
1
解决办法
85
查看次数

Chapel域:`low/high`和`first/last`方法之间的差异

Chapel域有两组方法

domain.low, domain.high
Run Code Online (Sandbox Code Playgroud)

domain.first, domain.last
Run Code Online (Sandbox Code Playgroud)

什么是这些返回不同结果的各种情况(即什么时候domain.first != domain.lowdomain.last != domain.high

chapel

6
推荐指数
1
解决办法
62
查看次数

嵌套缩减 - 在Chapel中最常用的写法是什么?

教堂减少目前忽略变量的初始值.这意味着这段代码

var x: int;
for i in 1..3 {
  forall j in 1..10 with (+ reduce x) {
    x += 1;
  }
}

writeln(x);
Run Code Online (Sandbox Code Playgroud)

返回10而不是30,正如这位用户天真地想到的那样.虽然这种行为很好(并且它在减少条款的注释中有记载 - 我只是没有想到它),但事实证明,如果我想得到30(通过在两个循环中累积),我需要实际上是手工完成.我认为它会非常优雅和对称的for循环也reduce有意图....即我想写

var x: int;
for i in 1..3 with (+ reduce x) {
  forall j in 1..10 with (+ reduce x) {
    x += 1;
  }
}

writeln(x);
Run Code Online (Sandbox Code Playgroud)

请注意,即使在求和数字的情况下,我也需要引入一个临时变量.对于最大/最小的操作,需要更加小心.

是否有理由不支持reducefor循环中的意图?或者,有没有更惯用(Chapel-rrific)的方式来做到这一点?

更新:我越是想到这一点,我提出的代码在外部for被a替换的情况下不起作用并不明显forall.我认为问题在于变量是任务本地的而不是迭代本地的,因此减少只会发生在任务上.因此,仍然需要一个单独的内部缩减步骤.这将删除的是需要一个临时变量.

我认为更为重要的问题是,进行这些嵌套缩减的正确方法是......

chapel

5
推荐指数
1
解决办法
104
查看次数

如何将Chapel字符串传递给需要(非常量)char*的C函数?

假设我有一个Chapel字符串

var s : string;
Run Code Online (Sandbox Code Playgroud)

我如何将它发送到期望char*(自c_string假设const char *)的函数?

chapel

5
推荐指数
1
解决办法
45
查看次数

检查/确保两个数组具有相同的域和分布的最佳方法是什么?

Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么?

我能看到的最好的方法是检查D1==D2D1.dist==D2.dist,如果D1D2都是域。

特别地,请考虑以下代码:

const Dom = {1..5, 1..5};
const BDom = newBlockDom(Dom);
var x : [Dom] int;
var y : [BDom] int;

test(x,y);

proc test(a : [?Dom1] int, b : [Dom1] int) {
}
Run Code Online (Sandbox Code Playgroud)

这编译并运行得很好,如果函数声明中的查询语法只是测试域相等性,而不是分布相等性(即使Dom1也知道如何a分布),这是有道理的。在这种情况下检查分布相等的唯一方法是做a.domain.dist==b.domain.dist什么?

chapel

5
推荐指数
1
解决办法
67
查看次数

标签 统计

chapel ×5

arrays ×1

slice ×1