Проблема с omp_set_num_threads, вызываемой из потока WinAPI - PullRequest
0 голосов
/ 08 октября 2010

Я столкнулся с забавной проблемой при использовании OpenMP v2 под MSVC 9 SP1.при вызове omp_set_num_threads из основного потока выполнения с использованием omp_get_num_threads для проверки установленного количества все работает хорошо и проверяется.

Однако в приложении с графическим интерфейсом я называю то же самое, но его собственный поток (созданный с помощью CreateThread), чтобы не дать интерфейсу перестать отвечать на запросы, как бы то ни было, omp_set_num_threads неработает при вызове из потока, так как omp_get_num_threads всегда сообщает 1, а из тестов я вижу только один поток в действии.

В заключение: имеет omp_set_num_threads проблемы / ограниченияпри вызове из потока, который не является основным потоком процессов?

Код:

void CalculateDivisionSeriesOMP(unsigned long dwMul, int nType, size_t nOMPThreads)
{
    omp_set_num_threads(nOMPThreads);
    if(nType == 0)
    {
        #pragma omp parallel default(shared)
        {
            #pragma omp master
            {
                Printf("Starting Search For Divisor With Constant: 0x%08X...",dwMul);
                Printf("%d Threads In Use",omp_get_num_threads());
            }

            #pragma omp for
            for(__int64 i = 2; i < 4294967295; i++)
            {
                mu U = magicu2(i);
                if(U.M == dwMul)
                    Printf("Found Unsigned Divisor: %d Series Expansion Stage(Shift): %d Add: %d",unsigned long(i),U.s,U.a);

                ms S = magic(i);
                if(S.M == dwMul)
                    Printf("Found Signed Divisor: %d Series Expansion Stage(Shift): %d",i,S.s);
            }
        }

    }
//more of the same...
}

DWORD WINAPI DivThread(void* p)
{
    //...
    CalculateDivisionSeriesOMP(dwMul,nType,nOMPThreads);
    //...
}

//...
hDivThread = CreateThread(NULL,0,DivThread,NULL,0,NULL);
//..

1 Ответ

0 голосов
/ 07 октября 2011

Какие параметры компилятора используются (openmp)?Пожалуйста, проверьте этот код в функции:

#ifndef _OPENMP
printf("No OpenMP.");
#else
printf("OpenMP OK.");
#endif
...