如何使用GCD(grand central Dispatch)使用“循环”并行处理

时间:2015-02-22 11:07:44

标签: c++ grand-central-dispatch

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

#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);
                            }
                        }  

2 个答案:

答案 0 :(得分:2)

您可以发布多个彼此独立的函数,并且按照它们执行到GCD调度的顺序对它们的结果没有影响并异步执行它们。下面是一个示例代码,这是优化执行do_work'count'次数的for循环的方法之一:

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

src:http://en.wikipedia.org/wiki/Grand_Central_Dispatch

答案 1 :(得分:1)

我试图找到一个解决方案,这是第一个出现的搜索结果,我最终想出来了,我在这里发布代码,以帮助那些可能偶然发现这个问题的人。

使用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);
        }
    }
});