2011-09-14 33 views
11

我使用OpenMP来提高循环中的程序效率。OpenMP:有条件地使用#pragma

但最近我发现,在小循环中使用这个库降低了性能,并且使用正常的方式更好。

其实,我想使用的OpenMP只有当条件满足时,我的代码是

#pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

但我想要做的是禁用的#pragma如果大小足够小即:

if (size > OMP_MIN_VALUE) 
    #pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
do_some_stuff(); 

但不工作,更好的方法是编写循环两次,但我不想做这样...

if (size > OMP_MIN_VALUE) 
{ 
    #pragma omp parallel for 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 
else 
{ 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 

有什么更好的方法来做到这一点?

回答

7

我想你应该能够在您的parallel for指令使用可选schedule clause实现你要找的效果:

#pragma omp parallel for schedule(static, OMP_MIN_VALUE) 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

您可能要与不同类型的调度,但并不同各地发挥块大小,以查看最适合您的库例程的最合适的块大小。

+11

我用#pragma omp parallel for if(size> = OMP_MIN_VALUE) – Arthur