【问题标题】:Threads automatically utilizing multiple CPU cores?线程自动使用多个 CPU 内核?
【发布时间】:2013-06-23 10:00:11
【问题描述】:

假设我的应用程序运行 2 个线程(例如一个渲染线程和一个游戏更新线程)。如果它在具有多核 CPU(现在很常见)的移动设备上运行,我是否可以期望线程在可能的情况下自动分配给不同的内核?

我知道底层操作系统内核(Android linux 内核)决定调度。我的问题是我是否需要做任何额外的操作来启用多核使用,还是自动和透明的?

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    你需要做的是让两个线程尽可能独立运行。如果您有两个始终相互等待的线程,它们可能会在同一个内核上运行以节省电力。 (因为它可能看起来没有通过使用核心来获得)

    情况如下:第一个线程解码一个位图,而渲染器将前一个位图的纹理上传到GPU。如果无事可做,第一个线程进入睡眠状态;如果需要再次解码位图,则唤醒。

    我怀疑这是一个很好的例子,两个线程无济于事,因为解码位图应该比“上传”更快这意味着你有两种情况

    T1: decoding bit map, 
    T2: waiting for a bit map.
    

    T1: sleeping
    T2: uploading a bit map.
    

    T1: sleeping
    T2: waiting for a bitmap.
    

    你能看到没有两个线程都需要运行(或者可能很少)的情况吗?这可能不会比这样做更快,甚至更慢

    T1: decodes bitmap.
        uploads bitmap.
        waiting for a bitmap.
    

    【讨论】:

    • 系统是否以某种方式监视我的应用程序的这种行为,并根据一些启发式方法做出决定?这个决定有多“永久”(如果你有这样的信息)?顺便说一句,情况如下:第一个线程解码位图,而渲染器将 previous 位图的纹理上传到 GPU。如果无事可做,第一个线程进入睡眠状态;然后在需要再次解码位图时唤醒。
    • @ThomasCalc 系统不需要监控自己,因为它是自己做的。如果您在任何时候只有一个可运行线程,它可以使用一个核心。 (即使有数百个等待的内核)如果有两个可运行的线程在任意时间长度内(因为它们不相互等待)它们可以同时运行。
    • 关于您的评论:谢谢,现在更清楚了。关于您更新的帖子:您确定要解码吗? 1024x512 png(包括从外部存储读取)比将位图上传到纹理内存更快?是的,我不清楚;通过解码,我还指从磁盘读取它的时间(来自资产的 BitmapFactory.decodeStream)。
    • 您仍然可以在后台工作,即使这意味着需要更长的时间,因为您希望保持与 UI 的交互性。这也可能不会使用两个内核,除非您尝试同时使用 UI。使用所有内核并不是系统的目标,但良好的交互性会更好,这应该是您的首要任务。
    • 您可以使用“systrace”工具准确了解发生了什么以及何时发生。 Android 4.3 (API 18) 还引入了向应用程序添加标签的功能。请参阅developer.android.com/tools/debugging/systrace.html(请注意当前文档反映的是 4.3 之前的用法)。
    猜你喜欢
    • 2011-08-03
    • 2016-05-08
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多