目前,我的应用程序在 GPU CPU 数据共享方面存在主要瓶颈。
基本上我选择多个项目,每个项目成为一个缓冲区,然后成为一个 2D 纹理(相同大小),它们都在 GPU 上混合在一起。之后,我需要了解有关混合结果的各种信息。在 GPU 上作为(单通道浮动)纹理:
- 纹理中的最大值和最小值
- 平均值
- 总和值
实际上,我以非常缓慢的回合结束了
- 把数据放到 GPU * N
- 从 GPU 读取数据
- 在 CPU 上循环数据以查找值
显然,CPU 配置文件显示了写入和读取这两个主要热点。纹理是 100x100s 而不是 1000x1000s,但有很多。
我目前正在考虑三件事
- 结合所有数据并在使用 GPU 之前找出有趣的数据(将其放在 GPU 上似乎毫无意义,并且某些混合很复杂)
- 加载数据时将其全部放到 GPU 上(作为纹理级别,因此跳过项目选择的延迟以支持较慢的加载)
- 在 GPU 上计算“有趣的数据”,然后让 CPU 回读这些值
在我的机器和我使用过的数据上,将所有数据扔到 GPU 上几乎不会使用 GPU 内存。到目前为止,我看到的最高值是 9000 个 170 X 90 的条目,因为它的单通道浮点数,根据我的数学计算结果是 1/2 GB。这在我的机器上不是问题,但我可以看到它在普通笔记本电脑上是一个问题。我可以让 GPU 从 HDD 进行分页吗?这还值得追求吗?
很抱歉问了这么广泛的问题,但我正在寻找最有成效的途径去追求,每条途径对我来说都是新的领域。分析似乎强调回读是目前最大的问题。我可以通过更改 FBO/纹理设置来改善这一点吗?
目前我在 SharpGL 工作,最好坚持使用 OpenGL 3.3。但是,如果有一条通过视频内存或 GL 版本无法实现的任何特定技术的性能快速改进的途径,我可能会提出一个案例来满足软件系统要求。