如何使用 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);
});
我试图找到解决这个问题的方法,这是出现的第一个搜索结果,我最终弄明白了,我在这里发布代码以帮助其他可能偶然发现这个问题的人。
使用 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);
}
}
});
我在 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);
});
我试图找到解决这个问题的方法,这是出现的第一个搜索结果,我最终弄明白了,我在这里发布代码以帮助其他可能偶然发现这个问题的人。
使用 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);
}
}
});