Как я могу распараллелить biginteger, используя openmp? - PullRequest
1 голос
/ 04 июня 2019

Мне нужно запустить некоторый код от I: biginteger := 1 до некоторого значения biginteger параллельно.Так как это большой интеграл, я не могу использовать параллель для, и кажется, что omp for не работает с циклом while.

У меня небольшая проблема с кодом, пытающимся улучшить его, работая моно ....Как только я закончу исправление, я выложу здесь обновление, объясняющее все в деталях.

1 Ответ

0 голосов
/ 04 июня 2019

Я могу только прокомментировать часть вопроса, касающуюся OpenMP, и действительно, вы можете (только) распараллеливать циклы OpenMP, которые используют обычные целые числа (int, long, ...) в качестве типа для счетчика цикла. Это для всех операторов цикла OpenMP, таких как for, taskloop и т. Д.

Одна вещь, которую вы всегда можете сделать, это такой шаблон (при условии, что большое целое число называется bigint и имеет перегруженные арифметические операторы). Ниже приведен только псевдокод для демонстрации идеи, вам придется настроить его в соответствии с тем API, который вы хотите использовать:

void process_bigint() {
    binint i;
    bigint start = some_start_value();
    binint end   = some_end_value();

    i = start;
    #pragma omp parallel
    #pragma omp single
    while(i < end) {
        #pragma omp task firstprivate(i)
        {
            process_bigint(i);
        }
    }
}

Основная идея заключается в том, что вы вручную перебираете пространство больших целых чисел, которое хотите обработать. Это делается одним потоком. Для каждого числа (или группы чисел; шаблон будет немного сложнее), вы создаете задачу OpenMP, чтобы выполнить фактическую работу над номером.

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

Надеюсь, это поможет!

...