2016-08-25 1 views
0

при попытке создать объектно-ориентированную реализацию OpenACC Я наткнулся на this question.Функция OpenACCArray swap

Оттуда я взял код, предоставленный @ mat-colgrove на GTC15 (код доступен по адресу http://www.pgroup.com/lit/samples/gtc15_S5233.tar).

Поскольку мне интересно, как использовать объекты для управления данными с помощью OpenACC, я опубликовал another question. Я был очень впечатлен легкостью функции OpenACCArray::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" является расширение PGI, что мы надеемся, будет принят в стандарте OpenACC 3.0.

Благодарим вас за то, что вы пытаетесь выяснить и узнаете, если вы столкнулись с другими проблемами. - Коврик