【发布时间】:2010-10-08 08:04:03
【问题描述】:
我在 MSVC 9 SP1 下使用 OpenMP v2 时遇到了一个有趣的问题。当从执行的主线程调用omp_set_num_threads 然后使用omp_get_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);
//..
【问题讨论】:
标签: c++ c visual-studio-2008 winapi openmp