如何使用 GCD(grand central Dispatch)使用 "loop" 并行处理

How to use "loop" parallel processing by using GCD (grand central Dispatch )

我在 visual studio 环境下编写了 C++。在那里做并行处理我使用 openMP 但 OS X 不支持 openMP 所以我想移动 GCD Apple 。通过使用 GCD 我如何优化以下循环(在这里我想做 openMP 通过使用苹果 GCD 所做的事情)请帮助我做到这一点。谢谢你的任何进步。

#pragma omp parallel for private(j)
                    for(i = 1; i <= I; i++){
                        for(j = 1; j <= J; j++){
                            if(max(1, m-Alpha+i0) <= i && i <= min(m+Alpha+i0, I) && max(1, n-Alpha+j0) <= j && j <= min(n+Alpha+j0, J)){
                            //  cout << i << ", " << j << endl;
                                _AccmCalc(i, j, m, n);
                            }
                        }  

您可以 post 多个相互独立且不影响其结果的函数,它们按执行顺序进入 GCD 调度并异步执行。这是一个示例代码,这是优化执行 do_work 'count' 次的 for 循环的方法之一:

dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
 results[i] = do_work(data, i);
});

来源:http://en.wikipedia.org/wiki/Grand_Central_Dispatch

我试图找到解决这个问题的方法,这是出现的第一个搜索结果,我最终弄明白了,我在这里发布代码以帮助其他可能偶然发现这个问题的人。

使用 GCD 和使用 OpenMP 一样,您可以并行化外循环,虽然这里的外循环变成了对 dispatch_apply 的调用,但请参阅 Apple 文档了解详细信息。

dispatch_queue_t c_queue = dispatch_queue_create("myConcurrentQueue",
                                               DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(I, c_queue, ^(size_t i){
    size_t i2 = i + 1; // because in GCD i is [0, I) and we need [1, I]
    for(j = 1; j <= J; j++){
        if(max(1, m-Alpha+i0) <= i2 && i2 <= min(m+Alpha+i0, I) && max(1, n-Alpha+j0) <= j && j <= min(n+Alpha+j0, J)){
             //  cout << i2 << ", " << j << endl;
            _AccmCalc(i2, j, m, n);
        }
    }
});