single的用法。
parallel的目的就是能够让多个CPU协调处理问题,从而提高运行性能。例如,如下的代码,各个CPU都会执行一次。
#pragma omp parallel
{
printf("test OpenMP/n");
}
更多的时候,我们可能希望这种代码只要在一个CPU上执行就行了,以便减少CPU的功耗。这时可以使用single。
测试代码如下:
void testSingle()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP/n");
#pragma omp single
{
printf("test OpenMP single/n");
printf("execute thread ID is %d/n", omp_get_thread_num());
}
}
}
一个运行结果如下:
test OpenMP
test OpenMP
test OpenMP
test OpenMP
test OpenMP single
execute thread ID is 0
另外一个运行结果:
test OpenMP
test OpenMP single
execute thread ID is 1
test OpenMP
test OpenMP
test OpenMP
可以看出,在一个parallel region内,single代码块始终只会被执行一次。
不加single的一个运行结果为:
test OpenMP
test OpenMP single
execute thread ID is 0
test OpenMP
test OpenMP single
execute thread ID is 2
test OpenMP
test OpenMP single
execute thread ID is 1
test OpenMP
test OpenMP single
execute thread ID is 3
其实,"test OpenMP"被输出多次,这个是比较难理解的。因为一个CPU已经处理过了,就不应该由别的
CPU再去处理。可能是OpenMP的最初模型就是如此,或者这个本身就是OpenMP的设计缺陷,所以增加
single directive来回避这一点。如果用户只希望一段代码由一个CPU来处理,就使用single ,
毕竟这是一个崇尚低功耗的年代。
single代码段可以由任何一个CPU或者thread执行,如果想让固定的CPU或者thread运行一段代码,可以使用
master。master的局限性就在于只能由ID为0的thread执行该代码段。测试代码:
void testMaster()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP/n");
#pragma omp master
{
printf("test OpenMP master/n");
printf("execute thread ID is %d/n", omp_get_thread_num());
}
}
}
运行结果为:
test OpenMP
test OpenMP master
execute thread ID is 0
test OpenMP
test OpenMP
test OpenMP
运行N次,"execute thread ID is 0"总是被输出。master到底有何用处,能够解决什么实际问题,我还不能理解。
需要继续深入学习。