为什么一个omp线程完成,而另一个却不能完成
why one omp thread completes while other unable to do same?
我正在尝试执行以下代码,并期望第一个for循环被划分为两个线程,这两个线程运行良好,
第二个for循环被"整体"执行了2次,即由线程0和线程1执行,这并没有像输出所示的那样发生。
omp_set_num_threads(2);
#pragma omp parallel
{
#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);
printf("nn");
//if(omp_get_thread_num()==1) //if enalbled then prints all a->z letters
{
for(i=97;i<123;i++){
printf("%c %d",i,omp_get_thread_num());
#pragma omp flush
}
}
#pragma omp barrier
}
运行1
A B C D E F G H I J K L M N O p Q R S T U V W X Y Z
一个1b 1c 1d 1e 1f 1g 1h 1i 1j 1l 1m 1n 1o 1q 1r 1t 1u 1v 1w 1y 1z 1
a 0b 0c 0d 0e 0g 0h 0i 0j 0k 0l 0n 0o 0p 0q 0r 0t 0u 0v 0w 0x 0y 0z 0
运行2
A B C D E F G H I J K L M N O p Q R S T U V W X Y Z
a 0b 0c 0d 0e 0f 0g 0
一个1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1h 0n 0o 0p 0q 0t 0u 0v 0w 0x 0y 0z 0m 1
那么线程1没有打印所有a-z的原因是什么呢?转换可能发生,但由于"隐含"屏障存在于并行结构的末尾因此线程1和线程0必须等待彼此完成。
我尝试了8-9次运行,注意到线程1总是无法打印预期的输出!
启用if条件时,thread1在每次运行时成功打印a-z(检查了12次!!)
这应该可以随心所欲地工作:
omp_set_num_threads(2);
#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);
printf("nn");
#pragma omp parallel private(i)
{
for(i=97;i<123;i++)
printf("%c %d",i,omp_get_thread_num());
}
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 不能将方法返回的值用于另一个方法
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 类中的一个变量显示,但另一个不显示
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 两次相同的 for 循环:一个编译,另一个不编译
- 如何说一个有效或无效,即使一个是,另一个不是
- 另一个不完整的类型错误C
- 为什么其中一个模板静态函数有效,而另一个不起作用
- 两个相同的函数(一个使用模板模式,另一个不使用)
- glDrawArrays() 会自动绘制另一个不需要的对象
- RHEL 6.0两段相似的代码:一个能编译,一个不能
- 两个值的最大值,其中一个不能等于预定义值
- 从c++中另一个(不相关的!)类的基类引用派生类的对象
- 什么会导致一行代码在一个地方改变另一个不相关函数的行为
- 如何创建一个不能被其他类继承的类
- 为什么c++编译器允许将一个不能为constexpr的函数声明为constexpr ?