我在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);
}
}
答案 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);
});
答案 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);
}
}
});