Я могу только прокомментировать часть вопроса, касающуюся 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, чтобы выполнить фактическую работу над номером.
Насколько хорошо это работает, зависит от того, что вы будете делать для каждого номера. Если это всего лишь несколько операций, создание задачи может быть слишком дорогостоящим, и вам нужно будет создать задачу для группы чисел.
Надеюсь, это поможет!