Как GPU распараллеливает разные задачи? - PullRequest
0 голосов
/ 07 мая 2020

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

1 Ответ

1 голос
/ 07 мая 2020

Распараллеливание GPU требует, чтобы задача была разделена на как можно больше независимых равных вычислений (SIMD). То, что в C ++ выглядит как

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

в OpenCL C, выглядит так:

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

Несколько примеров:

Для рендеринга в реальном времени тесселированный поверхность может отображаться графическим процессором путем рисования каждого треугольника с использованием отдельного ядра графического процессора. https://youtu.be/1ww8qRCMc4s

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

Моделирование жидкости на основе решетки, такое как LBM, работает на 3D-решетке, скажем, 256x256x256 точек решетки. Для каждой из этих 16777216 точек решетки вычисления одинаковы, и их можно выполнять одновременно, поскольку они не зависят друг от друга. Таким образом, симуляция разбивается на 16777216 потоков на GPU, по одному на каждую точку решетки. Если графический процессор имеет 4096 ядер, он может одновременно вычислить 4096 из них. Как вы понимаете, это на порядки быстрее, чем запуск таких задач на процессорах. https://youtu.be/a1u2g9ahIDk

Моделирование частиц может вычислять каждую частицу на отдельном ядре графического процессора. Это работает, пока частицы в основном независимы. https://youtu.be/8Szib8Km5Mo

Для хорошего насыщения и достижения максимальной эффективности количество потоков должно быть намного больше, чем количество доступных ядер графического процессора. Также ветвление, например, снижает производительность, потому что в группах из 32 ядер графического процессора, если одно является ветвью true, а все остальные - ветвью false, обе ветви должны вычисляться всеми ядрами в группе. В примере рендеринга мозаичной поверхности, если треугольники имеют совершенно разные размеры, производительность снижается по той же причине: вся группа должна ждать, пока одно ядро ​​графического процессора с самым большим треугольником достигнет fini sh. Однако, если все треугольники примерно одинакового размера, производительность будет очень хорошей.

...