2016-08-25 59 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擴展。

感謝您嘗試解決問題,並讓我知道您是否遇到其他問題。 - 墊子