多核处理器的多线程技术

3

我有一部三星Galaxy S3手机,其使用的是自己的Exynos 4 Quad处理器。

因此,我想要优化我的应用程序,使其能够利用处理器的全部四个核心。

于是我进行了一些测试:

  1. Run task in one thread. Processing time - 8 seconds.

  2. Run task in four threads. Processing time - still 8 sec.

     new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
    new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
    new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
    new Thread() {
        public void run() {
                        // do 1/4 of task
        }
    }.start();
    
  3. Run task in ExecutorService. And processing time - still 8 sec.

    ExecutorService threadPool = null;
    threadPool = Executors.newFixedThreadPool(4);
    
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
             // do 1/4 of task
                          }});
    

看起来所有的工作都是同步完成的。为什么不并行呢?


2
没有真正的项目,只有像这样不完整的示例,无法告诉你。也许这四个都在竞争某些资源,如进行磁盘I/O,使CPU并行性不太有效。 - CommonsWare
1个回答

3

您可以尝试我的测试,使用C或Java语言:

http://bigflake.com/cpu-spinner.c.txt
http://bigflake.com/MultiCore.java.txt

在Nexus 4上运行MultiCore.java时,我看到:

Thread 1 finished in 1516ms (1267234688)
Thread 3 finished in 1494ms (1519485328)
Thread 0 finished in 1530ms (51099776)
Thread 2 finished in 1543ms (-1106614992)
All threads finished in 1550ms

更新: 观察使用systrace测试非常有用。作为回答类似问题的一部分,我设置了一个页面,展示了此测试的systrace输出。您可以看到线程如何调度,并观察其他两个核心的运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接