【问题标题】:Massive parallel computation ios海量并行计算ios
【发布时间】:2013-01-09 16:03:31
【问题描述】:

我有一种方法可以用不同的数据重复(可能数百万次)执行数学运算。在 iOs 中执行此操作的最佳方法是什么(它将在 iPad 设备上运行)?我知道performSelectorOnBackgroundThread 已被弃用...?我还需要将所有结果汇总到 NSArray 中。最好的方法似乎是:向通知中心发布通知并将该方法添加为观察者。它是否正确?我相信该数组需要被声明为原子的......另外,我需要在操作完成时显示一个进度条......我可以并行启动多少线程?我不认为在 iDevice 上启动 1.000.000 个线程是一个好主意..

提前谢谢...

【问题讨论】:

  • 您确定不希望将 IFrontEnd 连接到具有大规模并行向量功能的 (no-i) 大型计算机吗?
  • 您是否已经测试了这种简单的方法(仅在主线程上按顺序运行)并测试了需要多长时间(如果是,需要多长时间)?是否有任何计算依赖于其他计算的结果?
  • 到目前为止,所有测试都是在模拟器上完成的......这要快得多......计算不依赖于所有其他计算的任何结果......它们是独立的跨度>

标签: ios objective-c multithreading parallel-processing


【解决方案1】:

查看Grand Central Dispatch,这是在 iOS(和 Mac)上执行多线程的首选方式。

使用 GCD 的简单示例如下所示:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    //do long running task here
}

这将在主线程中异步执行一个块。 GCD 有许多其他调度任务的方式,其中一种直接取自上面列出的 Wikipedia 文章:

dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
     results[i] = do_work(data, i);
    });
total = summarize(results, count);

假设你的这个“大任务”是embarrassingly parallel,这个特定的代码示例可能正是你要找的。​​p>

【讨论】:

  • 这是一个尴尬的平行...(这是一个蒙特卡罗算法)
【解决方案2】:

虽然您可以使用 dispatch_apply() 并同时拆分所有运行,但这最终会变慢。

您希望能够同时限制运行中的运行次数,同时需要调整同时计算的次数。

我经常使用dispatch_semaphore_t 来轻松调整运行中计算的数量。

这样做的详细信息在此处的答案中:https://stackoverflow.com/a/4535110/25646

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2019-10-27
    • 2014-12-12
    相关资源
    最近更新 更多