




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.运行OpenMP程序时新建OMP_NUM_THREADS系统变量,但不管将其值怎么改变,程序运行出来的结果都是4个线程。(我的是双核电脑),这是为什么啊?2.两个简单简单的FOR语句输出问题:代码:(OMP_NUM_THREADS=4)#include using namespace std;#include omp.hvoid main()int i,j; for(i=1;i4;i+)#pragma omp parallel forfor(j=1;j4;j+) couti,jendl;出来的结果是:111,231222,213333,213问题:为什么出来的不是内层FOR循环的并行,而是这样的的结果啊?#include using namespace std; #include omp.h void main() int i,j; for(i=1;i 4;i+) #pragma omp parallel for for(j=1;j 4;j+) cout i , j endl; 1.运行OpenMP程序时新建OMP_NUM_THREADS系统变量,但不管将其值怎么改变,程序运行出来的结果都是4个线程。(我的是双核电脑),这是为什么啊?-用 omp_set_num_threads(int)2.两个简单简单的FOR语句输出问题:代码:(OMP_NUM_THREADS=4)#include using namespace std;#include omp.hvoid main()int i,j;for(i=1;i 4;i+)#pragma omp parallel forfor(j=1;j 4;j+)cout i , j endl;出来的结果是:111,231222,213333,213问题:为什么出来的不是内层FOR循环的并行,而是这样的的结果啊? -这其实很正常,三个人几乎同一时间说一句话,当然是杂乱的。放在内层循环时用的输出是C语言的printf语句,用C+的cout输出的话线程好像会被打断(我也不清楚,猜的),所以才会出现连续的数字和“,”而不是a,b的形式,现在正确的结果是:1,21,31,12,12,32,23,13,23,3等,那个新问题(10楼)就请各位帮忙解决一下吧,顺便介绍两本比较好的学OPENMP的书。谢谢了1.运行OpenMP程序时新建OMP_NUM_THREADS系统变量,但不管将其值怎么改变,程序运行出来的结果都是4个线程。(我的是双核电脑),这是为什么啊? - 用 omp_set_num_threads(int) 2.两个简单简单的FOR语句输出问题: 代码:(OMP_NUM_THREADS=4) #include using namespace std; #include omp.h void main() int i,j; for(i=1;i 4;i+) #pragma omp parallel for for(j=1;j 4;j+) cout i , j endl; 出来的结果是: 111,231 222,213 333,213 问题:为什么出来的不是内层FOR循环的并行,而是这样的的结果啊? - 这其实很正常,三个人几乎同一时间说一句话,当然是杂乱的。为什么出来的不是内层FOR循环的并行,而是这样的的结果啊int _tmain(int argc, _TCHAR* argv)int i,j; for(i=1;i 4;i+) cout i = i endl; #pragma omp parallel for num_threads(4) for(j=1;j 4;j+) cout running in thread omp_get_thread_num() : endl; cout i , j endl; getchar(); return 0;int _tmain(int argc, _TCHAR* argv)int i,j;#pragma omp parallel for num_threads(4) for(i=1;i 4;i+) cout running in thread omp_get_thread_num() : endl; for(j=1;j 4;j+) cout i , j endl; getchar(); return 0;LZ运行下这两个可能会比较容易理解OMP_NUM_THREADS 是用来设置openmp环境中线程的数量,就算你是双核的也可以有超过2条的线程用 omp_set_num_threads(int) 可以设置所需要的进程数。OPENMP随笔2010-10-05 10:14:38|分类: 编程杂记 |标签: |字号大中小订阅 parallel和parallel for的区别在于,前者采用复制执行的方式,将代码在所有的线程内部执行一次。后者采用工作分配的方式,将循环所需的工作量按一定的方式分配到各个执行线程上。比较下面两个程序段的输出: int i;#pragma omp parallel for(i=0;i5;i+) printf(i=%dn,i); int i;#pragma omp parallel for for(int i=0;i4并退出了循环,所以就得到了上述结果。解决的方法有两个,一个是将i的定义移到循环中,即写成for(int i=0;i5;i+),另一个方法就是明确要求在线程中使用与i同名的局部变量,即写成#pragma omp parallel private(i)。备注: 在将printf(i=%dn,i)改成couti=iendl后,程序输出中有一段如下: i=i=0 0 这段输出明显是因为第一个线程输出i=后就被第二个线程打断,等第二个线程输出i=0后又继续输出的结果。很早以前就知道printf的速度比cout快很多,但是从来没有想过为什么。看了这个输出结果后,我似乎明白了一点。我的理解是couti=iendl实际上应该会被分为cout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论