使用GCD并行处理阵列

爱德华多

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

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函数array使用它们各自的插槽summary作为累加器分派10个任务,这些任务从50000个项目的不相交的块中将它们相加并相加

该程序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方法方法稍有不同该方法的文档指出

Call body(p),其中p是指向Array的可变连续存储的指针如果不存在此类存储,则会首先创建它。

优化程序通常可以消除数组算法中的边界检查和唯一性检查,但是当失败时,在body的参数上调用相同的算法可以使您以安全为代价。

第二段似乎正是这里发生的情况,因此在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)
    })
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过使用GCD(大型中央调度)来使用“循环”并行处理

来自分类Dev

使用python并行处理函数

来自分类Dev

使用Spark并行处理集合

来自分类Dev

使用LINQ的并行csv处理

来自分类Dev

使用并行处理的SQL连接

来自分类Dev

使用xargs进行并行处理

来自分类Dev

使用多处理池的并行处理循环

来自分类Dev

使用“并行”包在R中进行并行处理

来自分类Dev

如何使用PLINQ并行处理周期?

来自分类Dev

R:使用doParallel并行处理几行

来自分类Dev

在R中使用雪进行并行处理

来自分类Dev

使用openMP并行处理主要查找器

来自分类Dev

在Java中使用线程进行并行处理

来自分类Dev

使用Azure-SB的并行消息处理

来自分类Dev

在python中使用Pygame进行并行处理

来自分类Dev

在Java中使用线程进行并行处理

来自分类Dev

如何使用PLINQ并行处理周期?

来自分类Dev

如何使用openMP并行处理内部循环?

来自分类Dev

使用 Python 类对象并行处理

来自分类Dev

使用 R 并行处理 XML 节点

来自分类Dev

在 Julia 中使用 DataFrames 进行并行处理

来自分类Dev

与CUDA并行传输阵列

来自分类Dev

与CUDA并行传输阵列

来自分类Dev

如何使用WebGL处理和更新大型阵列?

来自分类Dev

使用C ++ AMP处理大型阵列(65536+个元素)

来自分类Dev

使用MP Connect进行SAS并行处理入门

来自分类Dev

如何使用异步/并行处理迭代执行深度优先搜索?

来自分类Dev

使用TPL批处理/解并行化单独的调用

来自分类Dev

使用CUDA在GPU上并行处理简单算法