gpt4 book ai didi

macos - 在 Swift 中使用 Grand Central Dispatch 并行化和加速 “for"循环?

转载 作者:搜寻专家 更新时间:2023-10-30 22:13:11 26 4
gpt4 key购买 nike

我正在努力思考如何使用 GCD 来并行化和加速 Monte Carlo 模拟。大多数/所有简单示例都是为 Objective C 提供的,我真的需要一个简单的 Swift 示例,因为 Swift 是我的第一个“真正的”编程语言。

Swift 中蒙特卡洛模拟的最小工作版本应该是这样的:

import Foundation

import Cocoa
var winner = 0
var j = 0
var i = 0
var chance = 0
var points = 0
for j=1;j<1000001;++j{
var ability = 500

var player1points = 0

for i=1;i<1000;++i{
chance = Int(arc4random_uniform(1001))
if chance<(ability-points) {++points}
else{points = points - 1}
}
if points > 0{++winner}
}
println(winner)

代码直接粘贴到xcode 6.1中的命令行程序工程中

最内层的循环无法并行化,因为变量“points”的新值将在下一个循环中使用。但最外层只运行最内层的模拟 1000000 次并汇总结果,应该是并行化的理想候选者。

所以我的问题是如何使用 GCD 并行化最外层的 for 循环?

最佳答案

可以使用 dispatch_apply() 完成“多线程迭代”:

let outerCount = 100    // # of concurrent block iterations
let innerCount = 10000 // # of iterations within each block

let the_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(UInt(outerCount), the_queue) { outerIdx -> Void in
for innerIdx in 1 ... innerCount {
// ...
}
}

(你必须弄清楚外部计数和内部计数之间的最佳关系。)

有两点需要注意:

那么它大概是这样的:

let outerCount = 100     // # of concurrent block iterations
let innerCount = 10000 // # of iterations within each block

let the_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

var winners = [Int](count: outerCount, repeatedValue: 0)
winners.withUnsafeMutableBufferPointer { winnersPtr -> Void in

dispatch_apply(UInt(outerCount), the_queue) { outerIdx -> Void in
var seed = arc4random() // seed for rand_r() in this "thread"

for innerIdx in 1 ... innerCount {
var points = 0
var ability = 500

for i in 1 ... 1000 {
let chance = Int(rand_r(&seed) % 1001)
if chance < (ability-points) { ++points }
else {points = points - 1}
}
if points > 0 {
winnersPtr[Int(outerIdx)] += 1
}
}
}
}

// Add results:
let winner = reduce(winners, 0, +)
println(winner)

关于macos - 在 Swift 中使用 Grand Central Dispatch 并行化和加速 “for"循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27106039/

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