Graphics 性能与并行图形

Graphics 性能与并行图形,graphics,parallel-processing,Graphics,Parallel Processing,这个问题更多的是寻求关于这个主题的一般知识,而不是一个具体的问题 我一直在阅读有关图形管道的书籍,并找到了一些关于管道如何工作的很好的解释。例如,我发现这个网站用非常简单但有力的术语来解释它: 但说到并行性,我就被难倒了。我发现了几个与冻伤发动机相关的动力点,但仅此而已。我在这里寻找原因和方法 为什么它会提高性能?它是如何做到的?有关并行处理的概述,请参阅Andres评论中的链接 以下是我对GPU并行化的看法: 想象一个简单的场景,你想把屏幕上的每个像素都染成蓝色。如果您在假设的1024x10

这个问题更多的是寻求关于这个主题的一般知识,而不是一个具体的问题

我一直在阅读有关图形管道的书籍,并找到了一些关于管道如何工作的很好的解释。例如,我发现这个网站用非常简单但有力的术语来解释它:

但说到并行性,我就被难倒了。我发现了几个与冻伤发动机相关的动力点,但仅此而已。我在这里寻找原因和方法


为什么它会提高性能?它是如何做到的?

有关并行处理的概述,请参阅Andres评论中的链接

以下是我对GPU并行化的看法:

想象一个简单的场景,你想把屏幕上的每个像素都染成蓝色。如果您在假设的1024x1024像素显示器上的CPU上以单个线程执行所有这些操作,您可能会编写类似的代码

/// increase the blue component of an individual pixel
RGB32 TintPixelBlue(RGB32 inputPixel)
{
  /// increase the blue component by a max of 10, but don't overflow the byte by going over
  /// 0xFF
  inputPixel.Blue += Math.Min(10,0xFF-inputPixel.Blue)

  return inputPixel;
}

void DrawImageToScreen(Image image)
{
  for(int y=0;y<pixels.Height;y++)
    for(int x=0;x<pixels.Width;x++)
        image[x,y]=TintPixelBlue(image[x,y]);

  DrawMyImageToScreen(image);
}
使用单核、多核GPU(NVidia Fermi和Tesla卡上最多512核),您可以使用着色器语言编写
TintPixelBlue()
函数,该语言可编译为GPU的本机指令集。然后将图像对象传递给GPU,并告诉它在每个像素上运行
TintPixelBlue()
。然后,GPU可以并行使用所有512个内核,这有效地将所需时间除以内核数(减去开销和其他一些我们在这里不会涉及的内容)

CPU上的迭代次数不是2^20=1048576次,而是1048576/512次,或者2^11=2048次。这(显然)使性能提高了500倍左右

这里的关键是每个输入都是独立的:您不需要一个像素的输出来影响另一个像素,因此任何空闲内核都可以处理任何挂起的输入,而无需与其他内核同步

当你在系统中放置多个GPU时,真正的乐趣就开始了。阵列的速度非常快,而且。考虑到它们比同等的传统CPU阵列要便宜得多(相比5121.3GHz CPU、RAM、机架空间等的成本和3000美元的特斯拉卡),它们在科学界的核心数字处理领域变得非常流行


希望能有所帮助。

有关串行与并行图形渲染的生动有趣的演示,请参阅以下视频:

流言终结者以最清晰的方式呈现

RGB32 TintPixelBlue(RGB32 inputPixel)
{
  /// increase the blue component by a max of 10, but don't overflow the byte by going over
  /// 0xFF
  inputPixel.Blue += Math.Min(10,0xFF-inputPixel.Blue)

  return inputPixel;
}

void DrawImageToScreen(Image image)
{
  GPU.SetImage(image);
  GPU.SetPixelShader(TintPixelBlue);
  Draw();
}