0

我正在尝试通过使用 Grand Central Dispatch 的 dispatch_apply 方法来并行执行多个独立任务来加速我的 iOS 应用程序。但是,这些任务共享一个只读资源(一个大的 uint8_t 数组),该资源通过只读的非原子对象属性进行访问。由于它是只读资源,因此不需要同步访问。然而,共享只读数组使执行变得非常缓慢。它甚至比所有任务的串行执行还要慢。但是,如果我为每个线程制作一个数组的本地副本,则任务执行得非常快。

我不明白为什么我必须为每个线程创建一个副本以在只读资源的情况下从 GCD 中受益。是否有任何自动内部同步会减慢执行时间,因为 GCD 不知道它是只读资源?是否可以在不为每个线程创建资源的本地副本的情况下以某种方式防止速度变慢?

非常感谢您!

4

1 回答 1

3

您可能会看到处理器之间的缓存行争用。您没有展示您的使用方式,但您可以尝试按照手册页dispatch_apply中的说明实施跨步策略。dispatch_apply消除任何缓存行争用的关键是确保调度工作线程不会尝试访问共享数组中占用同一缓存行的元素。

如果数组是动态分配的,它将从一个适当对齐的地址开始,因此您可以简单地选择一个跨度宽度,它是缓存行大小的倍数。您可以放心地假设处理器的缓存线大小是 64 字节的小倍数,因此 128、256、512 或 1024 的步幅宽度是合理的。

于 2013-02-28T14:21:16.923 回答