Android上的CPU和GPU是共享内存,为什么有的手机从GPU读取数据还是很慢?

Refrence

  1. https://www.zhihu.com/question/398806158
  2. https://docs.aws.amazon.com/zh_cn/lumberyard/latest/userguide/ios-android-performance-guidelines.html

Q:

读取方式:双pbo读取 openGLES3
读取格式:1920*1080的RGBA数据
测试结果(每帧拷贝平均耗时):
魅蓝note3(Helio P10):140ms
华为mate30(麒麟990):13ms
三星s10+(骁龙855):2ms

A:

  1. 目前移动GPU架构通常也有GMEM(GPU 内存),虽然很小,只有1M,而且通常是复杂的场景中才会调用,简单场景下是不走GMEM的,即大部分场景下是共享RAM。

  2. CPU与GPU共用RAM,但不总是共用Buffer。如果调用Map函数,此时才会GPU与CPU共用Buffer,map函数是很快的,远小于1ms。

  3. 尽管共用RAM,但仍然存在2次传输。也会受限于CPU频率与AXI总线带宽。

    • CPU->GPU: GPU通过AXI bus读取textures(比如这个1080P的buffer),shaders等;
    • GPU->CPU: GPU渲染后直接写回DDR,这个buffer称为FrameBuffer;
  4. glTexImage2D上传纹理和CPU频率关系较大。我在865平台验证glTexImage2D时,频率调高与正常模式下差距非常大,720P的时间分别为3ms与40ms。glTexImage2D ( GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, buf_y );

  5. 可以将CPU频率调高验证一下,但题主使用了PBO,可能一定程度上减小了CPU频率的影响。

拓展:

GPU 内存 (GMEM)

GPU 内存 (GMEM) 是一种优化,它在 GPU 上使用本地内存来减少 CPU 和 GPU 之间大型纹理的传输。GMEM 可以在以下模式下运行(具体取决于移动设备支持的模式):

  • 256 位模式 — 引擎可以将 3 个 GBuffer 渲染目标和深度或模具存储在本地 GPU 像素内存中,同时执行初步 Z 通道、生成 GBuffer、延迟贴花以及延迟雨和雪通道。此模式还在渲染器的延迟着色通道期间将漫反射和高光累积纹理存储在本地 GPU 像素内存中。
  • 128 位模式 — 此模式在渲染器的延迟着色通道期间将漫反射和高光累积纹理存储在本地 GPU 像素内存中。与 256 位模式相比,128 位模式提供的性能提升更少。但是,利用 128 位模式,您可以启用在使用 256 位模式时不可用的特定渲染功能。
  • 禁用 — 此模式表示 GMEM 不受支持或已在配置文件中禁用。

渲染器使用以下两个 OpenGL 扩展来确定 Android 设备支持哪个 GMEM 模式:

  • Framebuffer fetch(256 位模式)
  • Pixel Local Storage(128 位模式)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Linux 系统中,可以通过在命令行中使用 NVIDIA 驱动程序提供的 nvidia-smi 工具来分配 GPU 内存。可以使用以下命令: ``` nvidia-smi --query-gpu=memory.total,memory.free,memory.used --format=csv ``` 此命令会显示 GPU内存,可用内存和已使用内存的数量。 还可以在执行 GPU 应用程序时指定要分配给它的内存量。例如,使用 CUDA 编程的 GPU 应用程序可以使用 CUDA 的 cudaMallocManaged 函数分配托管内存,该内存将由 GPUCPU 共享,并由系统自动管理。 ### 回答2: Linux系统中对于GPU内存的分配是通过驱动程序来管理的。具体的分配方式取决于所使用的显卡和驱动程序版本。 在Linux系统中,首先需要安装适当的显卡驱动程序,以便系统能够正确识别和连接到GPU。驱动程序通常会提供一些配置选项,可以通过修改相应的配置文件来分配GPU内存。 通常情况下,GPU内存的分配是动态的。这意味着当有需要时,系统会自动分配足够的GPU内存给正在运行的应用程序。这样可以确保应用程序能够充分利用GPU资源,而不会出现内存不足的情况。 一些显卡驱动程序也提供了手动配置选项,允许用户手动分配GPU内存。这些选项通常可以在配置文件中找到,并允许用户设置总的GPU内存大小以及每个应用程序可以使用的最大GPU内存。这种手动配置可以更精确地控制GPU内存的分配,但需要谨慎操作,以避免系统出现问题。 总之,Linux系统通过显卡驱动程序来管理GPU内存的分配,可以根据需要自动分配,也可以通过手动配置来进行分配。正确的GPU内存分配可以确保应用程序能够充分利用GPU资源,并提高系统的性能。 ### 回答3: 在Linux中,分配GPU内存主要通过显卡驱动程序来进行管理。常见的显卡驱动有NVIDIA的官方驱动和AMD的闭源驱动。 对于NVIDIA显卡,可以使用NVIDIA官方提供的NVIDIA驱动来管理GPU内存。在安装驱动后,可以通过命令行工具`nvidia-smi`来查看和管理GPU内存的分配情况。通过该工具,可以查看当前正在使用的GPU内存、空闲的GPU内存以及已经分配给进程的GPU内存等信息。 另外,NVIDIA也提供了CUDA工具包,其中包含了一些API,可以通过编程的方式来分配和管理GPU内存。通过CUDA,可以在代码中调用相关的API函数来申请和释放GPU内存。 对于AMD显卡,可以安装官方提供的闭源驱动,如AMDGPU-PRO。该驱动也提供了命令行工具`rocm-smi`来查看和管理GPU内存的使用情况。 与NVIDIA不同的是,对于AMD显卡,可以使用开源的ROCm(Radeon Open Compute)平台来进行GPU内存的分配和管理。ROCm提供了一系列的API函数,可以通过编程的方式来对GPU内存进行申请、释放和管理。 总结来说,Linux下的GPU内存分配主要通过显卡驱动程序来进行管理,常见的方式是使用对应的命令行工具或者通过编程调用相关的API函数来实现。无论是NVIDIA显卡还是AMD显卡,都提供了相应的工具和接口来满足GPU内存的分配需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值