Как мне спланировать вычисление методом наименьших квадратов на графическом процессоре? - PullRequest
0 голосов
/ 14 июля 2020

Я пишу программу под названием PerfectTIN (https://github.com/phma/perfecttin), которая выполняет множество корректировок TIN методом наименьших квадратов для соответствия облаку точек. Каждая корректировка берет некоторую смежную группу треугольников и регулирует высоту до 8 точек, которые являются углами треугольников, чтобы соответствовать точкам в треугольниках. У меня он работает по SMP. В начале обработки он выполняет только одну корректировку за раз, поэтому он разбивает корректировку на задачи, каждая из которых занимает несколько точек, все из которых находятся в одном треугольнике. Каждый поток берет задачу из очереди и вычисляет небольшую квадратную матрицу и небольшой вектор-столбец. Когда все они готовы, процедура настройки складывает матрицы и векторы и завершает вычисление методом наименьших квадратов.

Я хотел бы обрабатывать задачи как на GPU, так и на CPU. Данные, необходимые для выполнения задачи:

  • Три угла треугольника (x, y, z)
  • Координаты точек (x, y, z).
    Выходные данные:
  • Матрица симметрия c с девятью ненулевыми элементами (поскольку она симметрична c, мне нужно вычислить только шесть чисел)
  • Вектор-столбец с тем же количество строк.

Количество точек кратно 1024, за исключением нескольких задач, которые я могу обрабатывать в ЦП (общее количество точек в треугольнике может быть любым неотрицательным целым числом) . Для довольно большого облака точек из 56 миллионов точек некоторые задачи имеют размер больше 131072 точек.

Вот часть результата clinfo (если вам нужны другие части, дайте мне знать):

  Platform Name                                   Clover
Number of devices                                 1
  Device Name                                     Radeon RX 590 Series (POLARIS10, DRM 3.33.0, 5.3.0-7625-generic, LLVM 9.0.0)
  Device Vendor                                   AMD
  Device Vendor ID                                0x1002
  Device Version                                  OpenCL 1.1 Mesa 19.2.8
  Driver Version                                  19.2.8
  Device OpenCL C Version                         OpenCL C 1.1 
  Device Type                                     GPU
  Device Profile                                  FULL_PROFILE
  Device Available                                Yes
  Compiler Available                              Yes
  Max compute units                               36
  Max clock frequency                             1545MHz
  Max work item dimensions                        3
  Max work item sizes                             256x256x256
  Max work group size                             256
  Preferred work group size multiple              64
  Preferred / native vector sizes                 
    char                                                16 / 16      
    short                                                8 / 8       
    int                                                  4 / 4       
    long                                                 2 / 2       
    half                                                 8 / 8        (cl_khr_fp16)
    float                                                4 / 4       
    double                                               2 / 2        (cl_khr_fp64)
  Double-precision Floating-point support         (cl_khr_fp64)
    Denormals                                     Yes
    Infinity and NANs                             Yes
    Round to nearest                              Yes
    Round to zero                                 Yes
    Round to infinity                             Yes
    IEEE754-2008 fused multiply-add               Yes
    Support is emulated in software               No

Если я правильно понимаю, если я помещу по одной точке в каждое ядро ​​графического процессора, общее количество точек, которые я могу обработать за один раз, составит 36 × 256 = 9 × 1024 = 9216. Могу я поставить четыре точки на каждом ядре, так как тогда рабочая группа будет иметь 1024 точки? В этом случае я мог обработать сразу 36864 точки. Сколько точек должно обрабатывать каждое ядро? Что, если задача больше, чем может вместить графический процессор? Что, если несколько задач (возможно, из разных треугольников) поместятся в GPU?

Конечно, я хочу, чтобы этот код работал на других графических процессорах, кроме моего. Я собираюсь использовать OpenCL для переносимости. С какими разными графическими процессорами (описание, а не название) я встречусь?

1 Ответ

0 голосов
/ 24 июля 2020

Если я правильно понимаю, если я поставлю по одной точке в каждое ядро ​​графического процессора, общее количество точек, которые я могу обработать за один раз, составит 36 × 256 = 9 × 1024 = 9216.

Не совсем. Общее количество точек не ограничено максимальным размером рабочей группы. Размер рабочей группы - это количество потоков графического процессора, работающих синхронно в группе. Внутри рабочей группы вы можете обмениваться данными через локальную память, что может быть полезно для ускорения определенных вычислений, таких как, например, умножение матриц (разбиение кеша). столько же независимых частей, сколько есть. В C ++ что-то вроде

void example(float* data, const int N) {
    for(int n=0; n<N; n++) {
        data[n] += 1.0f;
    }
}

в OpenCL становится таким

kernel void example(global float* data ) {
    const int n = get_global_id(0) ;
    data[n] += 1.0f;
}

, где глобальный диапазон ядра установлен на N.

Каждый поток графического процессора должен обрабатывать только одну точку. Количество потоков (глобальный диапазон) может и должно быть намного больше, чем количество доступных ядер графического процессора. Если вам явно не нужна локальная память (все потоки могут работать независимо), вы можете установить размер локальной рабочей группы 32, 64, 128 или 256 - это не имеет значения - но между ними может быть некоторая разница в производительности ценности. Однако глобальный диапазон (общее количество потоков / точек) должен быть кратным размеру рабочей группы.

Что, если задача больше, чем может вместить графический процессор?

Я полагаю, вы имеете в виду, когда ваш набор данных не помещается в видеопамять сразу. В этом случае вы можете выполнять вычисления несколькими партиями, поэтому замените буферы графического процессора, используя передачи P CIe. Но это приводит к значительному снижению производительности.

Конечно, я хочу, чтобы этот код работал на других графических процессорах, кроме моего. Я собираюсь использовать OpenCL для переносимости. С какими разными графическими процессорами (описание, а не название) я столкнусь?

OpenCL отлично подходит для переносимости между устройствами и операционными системами. Помимо графических процессоров и процессоров AMD, вы встретите графические процессоры Nvidia, которые поддерживают только OpenCL 1.2, а также графические процессоры и процессоры Intel. Если графические драйверы установлены, ваш код будет работать на всех без проблем. Просто имейте в виду, что объем видеопамяти может сильно отличаться.

...