2015-06-18 3 views
3

Возможно ли сделать параллель для цикла, индекс которого не является целым? Я использую bigIntegers (новый объект).OpenMP, параллельный для цикла, bigIntegers

+0

Только встроенные целыми типов и итераторы произвольного доступа может быть использованы в качестве переменного цикла. –

+0

большое спасибо за ваш ответ – cppkhb

ответ

2

Спецификация OpenMP 4.0 была finalised and published год назад. Он предусматривает, что переменная параллельных циклов должна быть целочисленного типа с подписью или без знака или типа итератора произвольного доступа или типа указателя (§2.6, с.51).

Итак, в принципе нет, невозможно создать параллельные петли с любым типом переменной.

+0

большое спасибо за ваш ответ – cppkhb

1

Вы можете реализовать планирование самостоятельно. Ниже приведен пример использования эквивалента schedule(static) с встроенными 128-битными целями GCC.

#pragma omp parallel 
{ 
    __int128 start = omp_get_thread_num()*N/omp_get_num_threads(); 
    __int128 finish = (omp_get_thread_num()+1)*N/omp_get_num_threads(); 
    for(__int128 i=start; i<finish; i++) foo(i); 
} 

Если вы хотите эквивалент schedule(dynamic) вы можете сделать

__int128 cnt = 0; 
#pragma omp parallel 
for(__int128 i=0;;) { 
    #pragma omp atomic capture 
    i = cnt++; 
    if(i>=N) break; 
    foo(i);          
} 
Смежные вопросы