Как использовать & quot; цикл & quot; параллельная обработка с использованием GCD (Grand Central Dispatch)

Я запрограммировал C++ под визуальную студийную среду. там для параллельной обработки я использовал openMP, но OS X не поддерживает openMP, поэтому мне нравится перемещать GCD Apple. Используя GCD, как мне оптимизировать следующий цикл (здесь я хочу сделать то, что делает openMP с помощью Apple 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);
}
}

0

Решение

Вы можете опубликовать несколько функций, которые не зависят друг от друга и не влияют на их результат в том порядке, в котором они выполняются в диспетчере GCD и выполняют его асинхронно. Вот пример кода, это один из способов оптимизации цикла for, который выполняет do_work ‘count’ количество раз:

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

2

Другие решения

Я пытался найти решение для этого, и это первый результат поиска, который я в конечном итоге выяснил, и я публикую здесь код, чтобы помочь другим, кто может наткнуться на этот вопрос.

В 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);
}
}
});
1

По вопросам рекламы [email protected]