在 Chapel 中将 'ref dataType' 参数转换为 'ptr(dataType)'
Convert a 'ref dataType' argument to a 'ptr(dataType)' in Chapel
是否有官方方法可以将通过引用传递的参数转换为指向完全相同类型的指针?我知道在编译的 CodeGen 阶段 ref int
变为 int *
,并且我知道为了 C 互操作性,您可以使用 extern 这样做,但是为了编写 Chapel 呢?抽象?此外,宽引用和宽指针的情况又如何呢?你会如何处理这样的事情。
对于那些好奇的人,我正在试验一些 PGAS-STM(分区全局地址 Space - 软件事务内存),我需要做的一件事是允许语义如下......
使用 STM 预先列出:
// Global variables
var head : node(eltType);
// Local variables
var newHead = new node(eltType);
var retry = false;
var stm = manager.getDescriptor();
do {
retry = false;
try! {
stm.begin();
// Takes pointer of 'head' via its reference...
// What happens if its a wide reference???
var h = stm.read(head);
newHead.next = h;
stm.write(head, nextHead);
stm.commit();
} catch retry : STMRetry {
retry = true;
}
} while retry;
是的,它目前很难看,但它是一个非常早期的原型。
编辑: 将 STMBegin
的命名更改为 begin
Is there an official way to convert an argument passed by reference to a pointer to the exact same type?
我不知道 "official",但我的直觉是尝试按如下方式使用 c_ptrTo
,从 Chapel 1.16 开始似乎可以使用。给定这些文件:
testit.chpl:
extern proc bar(x: c_ptr(int));
require "testit.h";
var i = 42;
foo(i);
writeln("after foo, i is: ", i);
proc foo(ref x: int) {
var c_ptr_to_x: c_ptr(int) = c_ptrTo(x);
bar(c_ptr_to_x);
writeln("after bar, x is: ", x);
x = 22;
}
testit.h:
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
static void bar(int64_t* x) {
printf("bar got: %"PRId64"\n", *x);
*x = 32;
}
结果似乎如我所愿:
$ chpl testit.chpl
$ ./testit
bar got: 42
after bar, x is: 32
after foo, i is: 22
what about for the sake of writing Chapel abstractions?
我认为 c_ptr()
类型实际上仅用于与 C 的互操作性,而不是作为在 Chapel 本身中编写 pointer-based 抽象的一种方式。
Furthermore, what about the case of wide references and wide pointers?
这些是实现概念,而不是在语言级别公开给 end-users 的抽象,因此我不确定在 Chapel 中是否有规定的 user-level 方法来处理这些类型。
是否有官方方法可以将通过引用传递的参数转换为指向完全相同类型的指针?我知道在编译的 CodeGen 阶段 ref int
变为 int *
,并且我知道为了 C 互操作性,您可以使用 extern 这样做,但是为了编写 Chapel 呢?抽象?此外,宽引用和宽指针的情况又如何呢?你会如何处理这样的事情。
对于那些好奇的人,我正在试验一些 PGAS-STM(分区全局地址 Space - 软件事务内存),我需要做的一件事是允许语义如下......
使用 STM 预先列出:
// Global variables
var head : node(eltType);
// Local variables
var newHead = new node(eltType);
var retry = false;
var stm = manager.getDescriptor();
do {
retry = false;
try! {
stm.begin();
// Takes pointer of 'head' via its reference...
// What happens if its a wide reference???
var h = stm.read(head);
newHead.next = h;
stm.write(head, nextHead);
stm.commit();
} catch retry : STMRetry {
retry = true;
}
} while retry;
是的,它目前很难看,但它是一个非常早期的原型。
编辑: 将 STMBegin
的命名更改为 begin
Is there an official way to convert an argument passed by reference to a pointer to the exact same type?
我不知道 "official",但我的直觉是尝试按如下方式使用 c_ptrTo
,从 Chapel 1.16 开始似乎可以使用。给定这些文件:
testit.chpl:
extern proc bar(x: c_ptr(int));
require "testit.h";
var i = 42;
foo(i);
writeln("after foo, i is: ", i);
proc foo(ref x: int) {
var c_ptr_to_x: c_ptr(int) = c_ptrTo(x);
bar(c_ptr_to_x);
writeln("after bar, x is: ", x);
x = 22;
}
testit.h:
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
static void bar(int64_t* x) {
printf("bar got: %"PRId64"\n", *x);
*x = 32;
}
结果似乎如我所愿:
$ chpl testit.chpl
$ ./testit
bar got: 42
after bar, x is: 32
after foo, i is: 22
what about for the sake of writing Chapel abstractions?
我认为 c_ptr()
类型实际上仅用于与 C 的互操作性,而不是作为在 Chapel 本身中编写 pointer-based 抽象的一种方式。
Furthermore, what about the case of wide references and wide pointers?
这些是实现概念,而不是在语言级别公开给 end-users 的抽象,因此我不确定在 Chapel 中是否有规定的 user-level 方法来处理这些类型。