OpenACCArray交换功能

时间:2016-08-25 07:28:40

标签: openacc

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

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

由于我感兴趣如何使用对象来管理OpenACC上的数据,我发布了another question。 我对OpenACCArray::swap函数的易用性印象深刻,因此我创建了一个小例子来测试它(参见gist)。

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

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

1 个答案:

答案 0 :(得分: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标准中采用。

感谢您尝试解决问题,如果您遇到其他问题,请与我们联系。 - 马特