Матрица доступа CUDA хранится в оперативной памяти и возможность реализации

Недавно я начал заниматься численными вычислениями и решать математические задачи численно, программируя на C++ с OpenMP. Но теперь моя проблема слишком велика, и на ее решение даже распараллеленных уходит несколько дней. Итак, я думаю начать изучать CUDA, чтобы сократить время, но у меня есть некоторые сомнения.

Сердцем моего кода является следующая функция. Записи представляют собой два указателя на вектор. N_mesh_points_x,y,z — предопределенные целые числа, weights_x,y,z — матрицы-столбцы, kern_1 — экспоненциальная функция, а table_kernel — функция, которая обращается к матрице размером 50 Гб, хранящейся в ОЗУ и предварительно рассчитанной.

void Kernel::paralel_iterate(std::vector<double>* K1, std::vector<double>* K2 )
{
  double r, sum_1 = 0 , sum_2 = 0;
  double phir;

    for (int l = 0; l < N_mesh_points_x; l++){
      for (int m = 0; m < N_mesh_points_y; m++){
        for (int p = 0; p < N_mesh_points_z; p++){
        sum_1 = 0;
        sum_2 = 0;

        #pragma omp parallel for schedule(dynamic) private(phir) reduction(+: sum_1,sum_2)
        for (int i = 0; i < N_mesh_points_x; i++){
          for (int j = 0; j < N_mesh_points_y; j++){
            for (int k = 0; k < N_mesh_points_z; k++){
               
               if (!(i==l) || !(j==m) || !(k==p)){
               phir = weights_x[i]*weights_y[j]*weights_z[k]*kern_1(i,j,k,l,m,p);
               sum_1 += phir * (*K1)[position(i,j,k)];
               sum_2 += phir;
              }

             }
           }
         }
        (*K2)[ position(l,m,p)] = sum_1 + (table_kernel[position(l,m,p)] - sum_2) * (*K1)[position (l,m,p)];
    }
  }
}

return;
}

Мои вопросы:

  • Могу ли я запрограммировать хотя бы центральную часть этой функции на CUDA? Я распараллелил с OpenMP только внутренние циклы, потому что давал неправильный ответ, когда распараллеливал все циклы.
  • Функция table_kernel при доступе к большой матрице, матрица слишком велика для хранения в памяти моей видеокарты, поэтому файл останется в ОЗУ. Это проблема? Может ли CUDA легко получить доступ к файлам в оперативной памяти? Или это нельзя сделать и все файлы нужно хранить внутри видеокарты?

person Guus    schedule 24.11.2020    source источник


Ответы (1)


Могу ли я запрограммировать хотя бы центральную часть этой функции на CUDA? Я распараллелил с OpenMP только внутренние циклы, потому что давал неправильный ответ, когда распараллеливал все циклы.

Да, вы должны быть в состоянии запрограммировать ту часть, которая у вас сейчас есть в области OpenMP, как ядро ​​CUDA.

Функция table_kernel, которая обращается к большой матрице, матрица слишком велика для хранения в памяти моей видеокарты, поэтому файл останется в ОЗУ. Это проблема? CUDA может легко получить доступ к файлам в ОЗУ? Или это нельзя сделать и все файлы нужно хранить внутри видеокарты?

Поскольку вы получаете доступ к этому только вне области действия OpenMP, если вы используете ядро ​​CUDA только для работы, которую вы в настоящее время выполняете с OpenMP, нет необходимости обращаться к table_kernel из графического процессора, и поэтому это не должно быть проблемой. Если вы попытаетесь добавить дополнительные циклы для распараллеливания на GPU, это может стать проблемой. Поскольку доступ будет относительно нечастым (по сравнению с обработкой, происходящей во внутренних циклах), если вы хотите продолжить, вы можете попробовать сделать данные table_kernel доступными для GPU через cudaHostAlloc - в основном отображая память хоста в адресном пространстве GPU. . Обычно это представляет серьезную угрозу производительности, но если вы нечасто обращаетесь к нему, как уже упоминалось, это может быть серьезной проблемой производительности, а может и не быть.

Обратите внимание, что вы не сможете использовать или получить доступ к std::vector в коде устройства, поэтому эти типы контейнеров данных, вероятно, должны быть реализованы как обычные массивы double.

person Robert Crovella    schedule 24.11.2020
comment
Спасибо, я создам отдельную функцию с тремя циклами и запрограммирую только эту функцию для запуска в графическом процессоре. В настоящее время я читаю страницу NVIDIA для разработчиков и зону для разработчиков, порекомендуете ли вы другой материал? - person Guus; 24.11.2020
comment
Если вам нужно 5-минутное введение в CUDA, вот это . Документация по CUDA находится здесь. Руководство по программированию там довольно полное. Подробное упорядоченное описание программирования CUDA можно найти здесь. - person Robert Crovella; 24.11.2020