gpt4 book ai didi

swift - 使用 GCD 并行处理数组

转载 作者:IT王子 更新时间:2023-10-29 05:27:06 27 4
gpt4 key购买 nike

我有一个大数组,我想通过将它的切片交给几个异步任务来处理它。作为概念证明,我编写了以下代码:

class TestParallelArrayProcessing {
let array: [Int]
var summary: [Int]

init() {
array = Array<Int>(count: 500000, repeatedValue: 0)
for i in 0 ..< 500000 {
array[i] = Int(arc4random_uniform(10))
}
summary = Array<Int>(count: 10, repeatedValue: 0)
}

func calcSummary() {
let group = dispatch_group_create()
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)

for i in 0 ..< 10 {
dispatch_group_async(group, queue, {
let base = i * 50000
for x in base ..< base + 50000 {
self.summary[i] += self.array[x]
}
})
}
dispatch_group_notify(group, queue, {
println(self.summary)
})
}
}

init() 之后,array 将被初始化为 0 到 9 之间的随机整数。

calcSummary 函数分派(dispatch) 10 个任务,这些任务从 array 中取出 50000 个项目的不相交 block ,并使用它们在 summary 中各自的插槽将它们相加作为累加器。

此程序在 self.summary[i] += self.array[x] 行崩溃。错误是:

 EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP).

我可以看到,在调试器中,它在崩溃前成功迭代了几次,并且在崩溃时变量的值在正确的范围内。

我已经读到 EXC_I386_INVOP 可能会在尝试访问已释放的对象时发生。我想知道这是否与 Swift 在修改数组时复制数组有关,如果是,如何避免它。

最佳答案

这与@Eduardo 的回答中的方法略有不同,使用 Array类型的 withUnsafeMutableBufferPointer<R>(body: (inout UnsafeMutableBufferPointer<T>) -> R) -> R方法。 That method's documentation states :

Call body(p), where p is a pointer to the Array's mutable contiguous storage. If no such storage exists, it is first created.

Often, the optimizer can eliminate bounds- and uniqueness-checks within an array algorithm, but when that fails, invoking the same algorithm on body's argument lets you trade safety for speed.

第二段似乎正是这里发生的事情,所以使用这种方法在 Swift 中可能更“惯用”,无论那是什么意思:

func calcSummary() {
let group = dispatch_group_create()
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)

self.summary.withUnsafeMutableBufferPointer {
summaryMem -> Void in
for i in 0 ..< 10 {
dispatch_group_async(group, queue, {
let base = i * 50000
for x in base ..< base + 50000 {
summaryMem[i] += self.array[x]
}
})
}
}

dispatch_group_notify(group, queue, {
println(self.summary)
})
}

关于swift - 使用 GCD 并行处理数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26693838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com