Ошибка, когда я использую развал OpenMp в C ++ - PullRequest
0 голосов
/ 22 мая 2018

У меня ошибка, я не понимаю, почему в моем коде не работает развал.

    #pragma omp parallel num_threads(IntervalMapEstimator::m_num_thread)
    {
        std::vector<Point3D> local_relevant_points;

        #pragma omp for collapse(2)
        for(int i = first_list_index; i < last_list_index ; i++)
        {
            for (int k = 0; k < pointcloud_ff_polar_angle_lists[i].size(); k++)
            {
                if ( pointcloud_ff_polar_angle_lists[i][k].pol_sensor_rot.phi >= cell_start_angle && pointcloud_ff_polar_angle_lists[i][k].pol_sensor_rot.phi <= cell_end_angle )
                {
                    #pragma omp critical
                    {
                        relevant_points.push_back(pointcloud_ff_polar_angle_lists[i][k]);
                    }
                }
            }
        }
    }

Он не работает с коллапсом, но работает, когда я удаляю коллапс.Я не могу понять почему, кто-то видит почему?Это также работает в одном потоке.

1 Ответ

0 голосов
/ 22 мая 2018

Относительно оператора коллапса, здесь приводится хорошее объяснение: Понимание предложения коллапса в openmp .Как указано в ответе, предложение collapse будет работать только в том случае, если внутренний цикл не зависит от внешнего, который в вашем случае, по-видимому, не сохраняется, поскольку размер вектора не обязательно будет одинаковым для всех значений i.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...