В чем проблема с этой реализацией задач OpenMP c ++ - PullRequest
0 голосов
/ 15 апреля 2020

Я написал последовательный код для решения игры «Футошики». Сейчас я пытаюсь распараллелить его с задачами, но натолкнулся на ошибку, которую не могу исправить. Код запускается правильно, когда я запускаю вызовы задачи. Поэтому я думаю, что ошибка связана именно с этим разделом, но я не могу ее выяснить.

Ниже фрагмент кода является частью функцииimum_remaining_max_effect и выполняет рекурсивный вызывает до тех пор, пока не заполнит каждый индекс матрицы. Затем он вызывает «matrixCallback», как я храню матрицу решения. Переменная count - это количество слоев рекурсивных задач, которые я создаю, поэтому при значении 0 код выполняется последовательно. Когда я последовательно запускаю код, он работает нормально и дает правильный вывод, но когда я увеличиваю счетчик и, следовательно, распараллеливаю его, матрица решения имеет некоторые незаполненные значения. Я не могу понять это. Пожалуйста, помогите. Я также могу опубликовать весь код, если требуется, но его около 400 строк, поэтому расшифровать его будет сложно.

          if(!anyEmptyDomain){

            if(count)
            {
                int newCount=count-1;
                int newDomainRange=domainRange;
                int newEmptyGridCount=emptyGridCount;
                std::vector<std::vector< Grid >>  newGridMap=gridMap;

                std::vector<std::pair<int,int>> newEmptyGrids=emptyGrids;
                bool newAnyEmptyDomain=anyEmptyDomain;
                #pragma omp task  firstprivate(newCount,newDomainRange,newEmptyGridCount,newGridMap,newEmptyGrids,newAnyEmptyDomain,matrix)
                {

                    if(minimum_remaining_max_effect(newCount, newDomainRange, newEmptyGridCount, newGridMap, newEmptyGrids, newAnyEmptyDomain,matrix))
                    {


                        if(!printed)
                        matrixCallback(matrix,newDomainRange,newEmptyGridCount,newGridMap,newEmptyGrids,newAnyEmptyDomain);
                    }
                }
            }
            else{
                if(minimum_remaining_max_effect(count, domainRange, emptyGridCount, gridMap, emptyGrids, anyEmptyDomain,matrix ))
                {

                    if(!printed){
                    std::cout<<"BROO";
                    matrixCallback(matrix,domainRange,emptyGridCount,gridMap,emptyGrids,anyEmptyDomain);
                    }
                    return true;
                }
            }
...