2016-08-25 72 views
0

尝试创建一个面向对象的OpenACC实现我偶然发现了this questionOpenACCArray交换功能

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

因为我有兴趣如何使用对象来管理与OpenACC上的数据我发布another questionOpenACCArray::swap函数的易用性让我印象深刻,所以我创建了一个小例子来测试它(请参阅gist)。

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

我正在为nvidia加速器编译。

回答

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”是希望在OpenACC 3.0标准中采用的PGI扩展。

感谢您尝试解决问题,并让我知道您是否遇到其他问题。 - 垫子