OpenACCArray 交换函数

OpenACCArray swap function

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

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

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

我正在为 nvidia 加速器编译。

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

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

    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 标准采用。

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