Ошибка сегментации OpenMP при распараллеливании простого цикла - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть функция, которая принимает массив и обновляет массив в для l oop примерно так:

void compute(double values[], int num_points, double ders[]){
    for(int i = 0; i < num_points; ++i)
    {
        double a = values[i* 3 + 0 ];
        double b = values[i* 2 + 1 ];
        ders[i*4 + 0] = a * b;
        ders[i*4 + 1] = a * a;
        ders[i*4 + 2] = b * b;
        ders[i*4 + 3] = b * a * a;
   }
}

Все это хорошо, но затем я обновляю код, чтобы попробовать делать что-то параллельно с OpenMP, как

void compute(double values[], int num_points, double ders[]){
   omp_set_dynamic(0);
   omp_set_num_threads(2);
   #pragma omp parallel for
    for(int i = 0; i < num_points; ++i)
    {
        double a = values[i* 3 + 0 ];
        double b = values[i* 2 + 1 ];
        ders[i*4 + 0] = a * b;
        ders[i*4 + 1] = a * a;
        ders[i*4 + 2] = b * b;
        ders[i*4 + 3] = b * a * a;
   }
}

И теперь я получаю ошибки сегментации.

Мне кажется, что я должен перезаписать какое-то значение в двух потоках - но все в ders и значения индексируются в соответствии с 'i', поэтому кажется, что распараллеливание должно быть тривиальным.

Что я здесь не так делаю?

...