Параллельный цикл If-else с разрывом openmp

0

Я хотел бы знать, есть ли способ распараллеливать этот фрагмент кода в openmp. Этот цикл должен найти next элемент, который должен быть проанализирован в другом алгоритме. Таким образом, этот цикл анализирует два visited и used вектора, если он находит элемент, который посещен, но не используется, next равен k и выход из настройки цикла k равен размеру + 1, если нет элементов, которые были посещены и не использовались, loop попытайтесь найти элементы, которые не были посещены и не используются, и установите next = k.

Важно, чтобы статуты внутри else if они не прерывают цикл, потому что в векторах может быть элемент, посещенный.

for (k=0;k<dimension;k++){
    if (visited[k] == 1 && used[k]==0){
        next = k;
        fail =0;
        k=dimension+1;
     }

    else if (visited[k] == 0 && used[k]==0) {
        next = k;
        fail = 1;
    }

}

Как я могу распараллелить его с помощью pragma omp?

  • 1
    "мир кода" - просто хорошая опечатка, пожалуйста, не редактируйте :)
  • 0
    Разве это не случай добавления директивы omp перед циклом for? Ссылка: ссылка
Теги:
for-loop
parallel-processing
openmp

1 ответ

0

Такой код не является тривиальным для распараллеливания.

Сначала вы должны избавиться от своего неявного break, сбросив k.

Затем вам нужно будет сделать векторы для ваших next и fail переменных и сохранить там частичные результаты.

Теперь ваш цикл может быть парализован, так как больше нет взаимозависимостей, только ваши результаты теперь являются векторами, которые вам все еще нужно анализировать.

Чтобы проанализировать векторы результатов, вам нужно было бы сделать префиксные вычисления для них, чтобы найти первый индекс i, если он есть, где fail[i] равен 0 и в качестве результата следует next[i].

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

  • 0
    Я пробовал, но нет ускорения :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню