2010-10-08 43 views
0

我在MSVC 9 SP1下使用OpenMP v2时遇到了一个有趣的问题。当从主执行线程中调用omp_set_num_threads,然后使用omp_get_num_threads检查设置的金额时,所有工作都正常并检出。从WinAPI线程调用omp_set_num_threads的问题

但是,在一个GUI应用程序中,我调用相同的东西,但它自己的线程(使用CreateThread创建),以防止UI变得无法响应,看起来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); 
//.. 

回答

0

什么编译器选项(OpenMP的)?请检查此功能代码:

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