【问题标题】:OpenACCArray swap functionOpenACCArray 交换函数
【发布时间】:2016-08-26 05:48:48
【问题描述】:

在尝试创建面向对象的 OpenACC 实现时,我偶然发现了this question

从那里我获取了@mat-colgrove 在 GTC15 上提供的代码(代码可在 http://www.pgroup.com/lit/samples/gtc15_S5233.tar 获得)。

由于我对如何通过 OpenACC 使用对象来管理数据感兴趣,所以我发布了another questionOpenACCArray::swap 函数的易用性给我留下了深刻的印象,因此我创建了一个小示例来测试它(参见 gist)。

  • 首先,我尝试只交换并希望交换主机上的指针就足够了,但这会导致致命的内存错误。 (大概是因为大小和容量成员没有在设备上更新)
  • 我认为可行的一种更安全的方法是更新主机、交换阵列和更新设备。这会运行但会产生错误的结果。

我正在为 nvidia 加速器进行编译。

【问题讨论】:

    标签: openacc


    【解决方案1】:

    看起来这是我的错,因为我没有测试交换例程。

    这里的问题是,当代码在主机上交换数据时,对象的设备副本仍然指向旧数组。解决方法是重新附加(即将对象的设备指针设置到正确的数组)列表。

        void swap(OpenACCArray<type>& x)
        {
            type* tmp_list = list;
            int tmp_size = _size;
            int tmp_capacity = _capacity;
            list = x.list;
            _size = x._size;
            _capacity = x._capacity;
            x.list = tmp_list;
            x._size = tmp_size;
            x._capacity = tmp_capacity;
    #ifdef _OPENACC
    #pragma acc update device(_size,_capacity,x._size,x._capacity)
            acc_attach((void**)&list);
            acc_attach((void**)&x.list);
    #endif
    
        }
    

    “acc_attach”是一个 PGI 扩展,有望在 OpenACC 3.0 标准中采用。

    感谢您试用,如果您遇到其他问题,请告诉我。 - 垫子

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2021-12-13
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多