Использование общей памяти с OpenACC

Я пытаюсь использовать общую память для кэширования вещей с помощью OpenACC.

В основном я работаю над умножением матриц, и вот что у меня есть:

typedef float ff; 

// Multiplies two square row-major matrices a and b, puts the result in c. 
void mmul(const restrict ff* a, 
          const restrict ff* b, 
          restrict ff* c, 
          const int n) { 
#pragma acc data copyin(a[0:n*n], b[0:n*n]) copy(c[0:n*n]) 
{ 

#pragma acc region 
{ 

#pragma acc loop independent vector(16) 
  for (int i = 0; i < n; ++i) { 
#pragma acc loop independent vector(16) 
    for (int j = 0; j < n; ++j) { 
      ff sum = 0; 
      for (int k = 0; k < n; ++k) { 
        sum += a[i + n * k] * b[k + n * j]; 
      } 
      c[i + n * j] = sum; 
    } 
  } 

} 
}
}

Я хотел бы использовать общую память для кэширования фрагментов матриц 'a' и 'b' для использования при вычислении 'c' аналогично алгоритму mmul CUDA. делает.

В основном на CUDA я бы знал точный размер своих блоков и мог бы:

  • объявить разделяемую память размером блока
  • скопируйте "соответствующую" часть данных в блок
  • использовать эти данные

Я понимаю, что могу использовать

#pragma acc cached

и что я могу указать размеры блоков с помощью параметров vector и gang, но у меня возникли некоторые проблемы с пониманием того, как это будет отображаться в архитектуре CUDA.

Есть ли способ добиться чего-то подобного с OpenACC? Есть ли хороший учебник / ресурс по использованию директивы cached или о том, как сопоставить некоторые возможности общей памяти от CUDA до OpenACC?


person leo    schedule 17.10.2012    source источник
comment
Компилятор ускорителя PGI может уже использовать разделяемую память. Вы проверяли вывод с помощью переключателя -Minfo? Это руководство может представлять интерес.   -  person Robert Crovella    schedule 17.10.2012
comment
Да, но переключатель Minfo только говорит мне, КАК много разделяемой памяти использует моя реализация. Хотя это полезно, меня больше интересовало, есть ли способ явного управления такой памятью. Тем не менее, очень полезно иметь возможность видеть сгенерированный cuda высокого уровня.   -  person leo    schedule 17.10.2012
comment
@leo ты нашел ответ на свой вопрос? Удалось ли вам явно определить разделяемую память в OpenACC?   -  person Millad    schedule 09.05.2017


Ответы (1)


Если вы используете PGI Accelerator Compiler, вы можете выгрузить сгенерированный файл PTX и посмотреть, что происходит в подчинении исполнения:

pgcc -acc -fast -Minfo -ta=nvidia,cc13,keepptx matrixMult.c -o matrixMult

Сгенерированный PTX будет сохранен в текущем каталоге.

РЕДАКТИРОВАТЬ: вы можете предпочесть увидеть высокоуровневый код (CUDA для C или Fortran). Так что используйте следующий -ta=nvidia,cc13,keepptx,keepgpu.

person lashgar    schedule 17.10.2012