Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 并行reduce算法的实现_Objective C_Multithreading_Parallel Processing_Grand Central Dispatch_Objective C Blocks - Fatal编程技术网

Objective c 并行reduce算法的实现

Objective c 并行reduce算法的实现,objective-c,multithreading,parallel-processing,grand-central-dispatch,objective-c-blocks,Objective C,Multithreading,Parallel Processing,Grand Central Dispatch,Objective C Blocks,我一直在研究使用块在Objective-C中实现reduce[inject,fold,随便你怎么称呼它]函数,我想知道在应用的函数是关联的(例如整数集合的和)的情况下,是否有任何并行计算的技术 i、 e.是否可以在NSArray上对类似的内容进行并行化或改进: - (id)reduceWithBlock:(id (^)(id memo, id obj))block andAccumulator:(id)accumulator { id acc = [[accumulator copy] au

我一直在研究使用块在Objective-C中实现reduce[inject,fold,随便你怎么称呼它]函数,我想知道在应用的函数是关联的(例如整数集合的和)的情况下,是否有任何并行计算的技术

i、 e.是否可以在NSArray上对类似的内容进行并行化或改进:

- (id)reduceWithBlock:(id (^)(id memo, id obj))block andAccumulator:(id)accumulator
{
  id acc = [[accumulator copy] autorelease];

  for (id obj in self) {
    acc = block(acc, obj);
  }
  return acc;
}
使用大中央调度

编辑:我做了第二次尝试,将数组划分为更小的块,并将它们减少到单独的调度队列中,但在我的测试中没有明显的性能提升:

您可以使用调度全局队列来并行化它,但您的代码似乎在并行工作中效率不高。因为累加器对象需要独占访问,并且它被块紧密使用,因此它将导致累加器对象被巨锁

例如,此代码几乎是非并发工作,即使使用dispatch_apply和dispatch Global Queue

dispatch_semaphore_t sema = dispatch_semaphore_create(1);
dispatch_queue_t queue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply([array count], queue, ^(size_t index) {
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    acc = block(acc, [array objectAtIndex:index]);
    dispatch_semaphore_signal(sema);
});
dispatch_release(sema);
您需要拆分块和累加器实现以实现高效的并行化

编辑:

(我还没有检查代码的算法。)

您正在使用串行队列。串行队列一次执行一个块。因此,它可能是

dispatch_queue_t result_queue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


我实现了一个并行分治算法,该算法与关联函数一起工作。不幸的是,我无法从中获得任何明显的加速,所以我现在坚持使用一个简单的串行版本。我相信我的基本情况需要优化——我在某个地方读到,不等式
n>=p^2
应该成立,其中n是作业数,p是处理器数


显然,在数组拆分和递归上浪费了很多时间,如果有人提出建议,我们将不胜感激。

谢谢,我已经在做了。当我重新分配acc的值时,dispatch_apply似乎不喜欢它,而信号量只是减慢了整个过程。我上面的一般模式可以在Github上的几个库中找到。我想知道是否有任何已知的算法(在任何语言中)可以并行执行此操作。感谢关于DISPATCH\u QUEUE\u CONCURRENT常量的提示,我还没有阅读Lion中libdispatch的更新,我得到了大约45%的加速,这似乎是合理的。好家伙!这是我在这里找到的关于并行性的最佳答案。
dispatch_queue_t result_queue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t result_queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
/* DISPATCH_QUEUE_CONCURRENT is only available OS X 10.7/iOS 4.3 or later. */