【问题标题】:Convert a 'ref dataType' argument to a 'ptr(dataType)' in Chapel将“ref dataType”参数转换为 Chapel 中的“ptr(dataType)”
【发布时间】:2018-03-08 15:17:10
【问题描述】:

是否有官方方法可以将通过引用传递的参数转换为完全相同类型的指针?我知道在编译的 CodeGen 阶段,ref int 变成了int *,而且我知道你可以使用extern 来实现 C 互操作性,但是为了编写 Chapel 抽象又如何呢?此外,宽引用和宽指针的情况如何?你会如何处理这样的事情。

对于那些好奇的人,我正在尝试一些 PGAS-STM(分区全局地址空间 - 软件事务内存),我需要做的一件事是允许语义如下...

使用 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

【问题讨论】:

    标签: stm chapel transactional-memory


    【解决方案1】:

    是否有官方方法可以将通过引用传递的参数转换为完全相同类型的指针?

    我不知道“官方”,但我的直觉是尝试如下使用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
    

    为了写 Chapel 抽象怎么办?

    我认为c_ptr() 类型实际上只用于与 C 的互操作性,而不是作为在 Chapel 本身中编写基于指针的抽象的一种方式。

    另外,宽引用和宽指针的情况呢?

    这些是在语言级别向最终用户公开的实现概念而不是抽象,因此我不确定在 Chapel 中是否有规定的用户级方式来处理这些类型。

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 2019-07-27
      • 2012-06-05
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2013-10-17
      • 2022-10-17
      • 2018-06-24
      相关资源
      最近更新 更多