приложение преждевременно завершает работу с OpenMp с кодом ошибки: Fatal User Error 1002: не все конструкции совместного использования выполняются всеми потоками - PullRequest
1 голос
/ 09 января 2010

Я добавил код openMp к некоторому последовательному коду в приложении симулятора, когда я запускаю программу, которая использует это приложение, программа неожиданно завершает работу с выводом «Поток« Win32 Thread »(0x1828) завершился с кодом 1 (0x1)» "Это происходит в параллельной области, где я добавил код OpenMp, Вот пример кода:

#pragma omp parallel for private (curr_proc_info, current_writer, method_h) shared (exceptionOccured) schedule(dynamic, 1) 
    for (i = 0 ; i < method_process_num ; i++)
    {
         current_writer = 0;
        // we need to add protection before we can dequeue a method from the methods queue,

        #pragma omp critical(dequeueMethod)  
        method_h = pop_runnable_method(curr_proc_info, current_writer);

        if(method_h !=0 && exceptionOccured == false){
            try {
            method_h->semantics();
            }
            catch( const sc_report& ex ) {
                ::std::cout << "\n" << ex.what() << ::std::endl;
                m_error = true;
                exceptionOccured = true;  // we cannot jump outside the loop, so instead of return we use a flag and return somewhere else
            }

        }
    }

Планирование было статическим до того, как я сделал его динамическим, после того как я добавил динамический с размером фрагмента 1, приложение продолжало работать немного дальше, прежде чем завершилось, может ли это быть показателем того, что происходит внутри параллельной области? спасибо

1 Ответ

0 голосов
/ 10 января 2010

Пока я читаю это, и я больше программист на Фортране, чем на C / C ++, ваша личная переменная curr_proc_info не объявлена ​​(или не определена?) До того, как впервые появится в вызове pop_runnable_method. Но частные переменные не определены при входе в параллельную область.

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

Приветствия

Mark

...