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