Multithreading 多线程光线跟踪器在Mavericks下的速度明显快于Yosemite

Multithreading 多线程光线跟踪器在Mavericks下的速度明显快于Yosemite,multithreading,swift,grand-central-dispatch,raytracing,Multithreading,Swift,Grand Central Dispatch,Raytracing,我正在写一个路径跟踪器(光线跟踪器)来教自己快速编程。光线跟踪非常适合并行化,因为可以独立渲染每个像素。下面是我如何设置我的主循环,它允许8个线程 var group:dispatch_group_t = dispatch_group_create() var queue:dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) let lockQueue:dispatch_queue_t = di

我正在写一个路径跟踪器(光线跟踪器)来教自己快速编程。光线跟踪非常适合并行化,因为可以独立渲染每个像素。下面是我如何设置我的主循环,它允许8个线程

var group:dispatch_group_t = dispatch_group_create()
var queue:dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
let lockQueue:dispatch_queue_t = dispatch_queue_create("lockQueue", nil)
var semaphore:dispatch_semaphore_t = dispatch_semaphore_create(8)

for every_pixel {
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_group_enter(group)
    dispatch_group_async(group, queue) { () -> Void in

    let pixelColor = castRayAndIntersectObjects()

    dispatch_sync(lockQueue, { () -> Void in
        PutPixelOnBitmap(pixelColor);
    })                

    dispatch_group_leave(group)
    dispatch_semaphore_signal(semaphore);
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
安装OS X Yosemite后,我注意到性能大幅下降。过去在Mavericks下渲染需要28秒,现在在我的四核MacBookPro上需要70秒。活动监视器显示,Mavericks使用了我的750%的CPU,而Yosemite只使用了200%的CPU。就好像优胜美地一次只能运行两个线程

我对swift使用-O(最快)优化级别,并且在两个操作系统上运行完全相同的swift可执行文件

如果将代码修改为单线程应用程序,则在两个操作系统中获得相同的渲染时间。所以这似乎是一个线程问题

我是否正确设置了多线程?我想知道是我做错了什么,还是我发现了约塞米蒂的问题

更多信息(2014年11月16日):

当我运行探查器时,我看到线程锁定在某个东西上,这就是大部分时间花在Yosemite上的地方


在Mavericks上,探查器不显示uu psynch_mutexwait和u psynch_mutexdrop,这就是它运行速度显著更快的原因。所以问题是,为什么某些东西会锁定Yosemite,为什么它不会锁定Mavericks?

通过使用GCD,您将线程创建和控制交给GCD,允许它创建它认为合适的线程数量,然后(使用您的信号量)人为限制在任何给定时间将多少任务放入队列。要更精确地控制线程创建,您可能需要查看
NSOperation
NSThread
。谢谢!我肯定要试一试,我很好奇这是否能解决问题。如果你去掉信号灯会发生什么?有了这些,您正在做一些GCD的主要“专业领域”之一的事情(即,知道在资源可用的情况下安排任务的最佳方式等)。我重写了代码,以便它使用NSOperationQueue()。没有信号灯了。每个线程只渲染屏幕的1/8,共有8个线程。约塞米蒂问题仍然存在。这很有趣。