iOS:如何在单个应用程序中使用多个处理器内核?

时间:2015-05-06 21:02:02

标签: ios multithreading grand-central-dispatch

我有一个计算密集型应用程序,并试图通过使用并行处理减少计算时间。我从GDC开始,但没有减少计算时间。实际上,串行和并发队列产生的性能完全相同。我用NSThreads试了一下,但仍无济于事。 就好像应用程序只使用1个核心。我很感激任何在使用多线程提高计算吞吐量方面取得积极成果的人的回复。

该算法采用纯C语言,可以很好地进行分区 - 无需使用或使用互斥锁。

以下是我原来的GCD代码。结果与2或3个线程相同。我仔细检查了块没有串行执行 - 所以它们运行得更慢:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{
    doStuff1();
});

dispatch_group_async(group, queue, ^{
    doStuff2();
});

dispatch_group_async(group, queue, ^{
    doStuff3();
});

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

非常感谢!

1 个答案:

答案 0 :(得分:0)

我确实看到并发处理在iOS设备上产生接近最佳的结果,即在两个内核上执行时单核时间的55%。这是可能的。魔鬼在细节中,并没有足够的细节在这里任何人都知道你为什么没有看到这样的结果。您的工作负载可以通过多种方式进行互锁。它们可以以您尚未解释的方式明确地互锁,或者它们可以隐含地互锁。例如,即使有多个内核,仍然只有一个"硬盘驱动器"所以,如果所有的任务都在不断地颠覆"磁盘"它们可以有效地联锁起来。即使闪存盘是固态的,它们也不一定能够同时进行多次写入。我的期望是磁盘I / O可以在一个或另一个层次上有效地串行化。