【问题标题】:How does GPU parallelize different tasks?GPU 如何并行化不同的任务?
【发布时间】:2020-08-22 09:06:25
【问题描述】:

我真的很想了解 GPU 如何并行处理不同的任务,例如实时渲染和训练神经网络。我知道并行化背后的数学原理,但我很想知道 GPU 的实际工作原理。实时渲染和训练神经网络确实不同。 GPU 如何有效地并行化这两个任务?

【问题讨论】:

标签: gpu


【解决方案1】:

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;
}

几个例子:

对于实时渲染,GPU 可以通过使用单独的 GPU 核心绘制每个三角形来渲染曲面细分。 https://youtu.be/1ww8qRCMc4s

神经网络可以归结为大型矩阵乘法,并且在一个矩阵内,可以同时独立地并行计算各个列或图块。例如,向量加法在尽可能多的向量分量中并行化,每个 GPU 内核只计算一个向量分量。

基于晶格的流体模拟(例如 LBM)在 3D 晶格上工作,例如 256x256x256 晶格点。对于这 16777216 个格点中的每一个,计算都是相同的,并且它们可以同时完成,因为它们彼此独立。因此,模拟在 GPU 上被拆分为 16777216 个线程,每个格点一个。如果 GPU 有 4096 个内核,它可以同时计算其中的 4096 个。可以想象,这比在 CPU 上运行此类任务要快几个数量级。 https://youtu.be/a1u2g9ahIDk

粒子模拟可以在单独的 GPU 内核上计算每个粒子。只要粒子大部分是独立的,这就会起作用。 https://youtu.be/8Szib8Km5Mo

为了获得良好的饱和度,以达到最大效率,线程数应远大于可用的 GPU 内核数。例如,分支也会影响性能,因为在 32 个 GPU 内核的组中,如果一个是 true 分支,而所有其他都在 false 分支中,则两个分支都必须由组内的所有内核计算。 在镶嵌曲面渲染示例中,如果三角形的大小差异很大,则性能会因类似原因而受到影响:整个组必须等待具有最大三角形的一个 GPU 核心完成。但是,如果所有三角形的大小大致相同,则性能非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多