2010-10-08 1 views
0

J'ai rencontré un problème étrange en utilisant OpenMP v2 sous MSVC 9 SP1. lorsque vous appelez omp_set_num_threads à partir du thread principal d'exécution, puis en utilisant omp_get_num_threads pour vérifier le montant fixé, tout fonctionne bien et vérifie.Problème avec omp_set_num_threads appelé à partir d'un thread WinAPI

Cependant, dans une application GUI, j'appelle la même chose, mais son propre fil (créé avec CreateThread), pour empêcher l'interface utilisateur de ne plus répondre, comment jamais, il semble que omp_set_num_threads ne fonctionne pas lorsqu'il est appelé à partir d'un fil , comme omp_get_num_threads rapporte toujours 1, et à partir des tests, je ne peux voir qu'un seul thread en fonctionnement.

En résumé: ne omp_set_num_threads ont des problèmes/restrictions lorsqu'il est appelé à partir d'un fil thats pas les processus de thread principal?

code:

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); 
//.. 

Répondre

0

Quelles sont les options compilateur sont utilisées (OpenMP)? S'il vous plaît, vérifiez ce code en fonction:

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