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 标准采用。
感谢您的尝试,如果您遇到其他问题,请告诉我。
- 垫子
在尝试创建面向对象的 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 标准采用。
感谢您的尝试,如果您遇到其他问题,请告诉我。 - 垫子