社区
英特尔边缘计算技术
帖子详情
OpenMP 执行时间为零
wenrihui
2009-05-04 04:26:42
#pragma omp parallel
{
#pragma omp for
for(i=0;i<3000000000;i++);
}
小弟初学OpenMP,就这么一个简单的程序,当循环次数在3000000000与4000000000左右时,执行时间为零,压根就不执行。可在2000000000和5000000000等次数时,执行时间有两秒或一秒,看了很多资料,想不通为什么?
请各位高手赐教!十分感谢!
...全文
181
17
打赏
收藏
OpenMP 执行时间为零
#pragma omp parallel { #pragma omp for for(i=0;i<3000000000;i++); } 小弟初学OpenMP,就这么一个简单的程序,当循环次数在3000000000与4000000000左右时,执行时间为零,压根就不执行。可在2000000000和5000000000等次数时,执行时间有两秒或一秒,看了很多资料,想不通为什么? 请各位高手赐教!十分感谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wenrihui
2009-06-10
打赏
举报
回复
刚学会加分,只能加一百,给两位一人五十分吧。
wenrihui
2009-06-10
打赏
举报
回复
非常汗颜,我一直以为long是64位的,今天早晨试了一下,long果然是32位的。
我将long改为fanbin23所用到的long long型,一切都正常了,正如intel_www说的一样,确实是溢出了。各位在上面都提到了这个问题,却没引起我的重视,惭愧惭愧!
谢谢大家的帮助,尤其是intel_www和fanbin23,谢谢。
fanbin23
2009-06-09
打赏
举报
回复
上面说的不对,都应该是支持long long的
fanbin23
2009-06-09
打赏
举报
回复
[Quote=引用 11 楼 wenrihui 的回复:]
首先谢谢大家帮助,作为一个新手感动得热泪纵横,CSDN里面好人多啊!
这个问题主要在于,当循环次数为3000000000附近时,for循环中的程序段根本就不执行。我在for循环中加了一条printf语句,当循环次数在2000000000或5000000000附近时,会打出满屏的performed,说明语句执行了。但改在3000000000左右时,什么也没有,这充分说明了for中的语句未执行。怪就怪在这里。(大家有兴趣可以试试)
另外,long型为8个字节,算一下,它…
[/Quote]
注意我用的是long long……
long的话用-m32(或者类似的编译选项)时仍然是32位的,另外OpenMP对于loop index的类型说的很暧昧,明确说的就是int和unsigned int,所有有些编译器也可能不支持long long
wenrihui
2009-06-09
打赏
举报
回复
我用的编译器是VC2005.
wenrihui
2009-06-09
打赏
举报
回复
首先谢谢大家帮助,作为一个新手感动得热泪纵横,CSDN里面好人多啊!
这个问题主要在于,当循环次数为3000000000附近时,for循环中的程序段根本就不执行。我在for循环中加了一条printf语句,当循环次数在2000000000或5000000000附近时,会打出满屏的performed,说明语句执行了。但改在3000000000左右时,什么也没有,这充分说明了for中的语句未执行。怪就怪在这里。(大家有兴趣可以试试)
另外,long型为8个字节,算一下,它的正数范围为2的63次方, 9.22337204 × 10的18次方,远大于几十亿,所以不存在溢出的问题。
#include "stdafx.h"
#include "stdlib.h"
#include "omp.h"
#include <time.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long i=0,temp;
clock_t before;
double elapsed = 0.0;
before = clock();
#pragma omp parallel
{
#pragma omp for
for(i=0;i <3000000000;i++)
{
printf("performed");
temp+=(i*-1);
}
}
elapsed = clock()-before;
printf("function used %.3f seconds\n", elapsed/CLOCKS_PER_SEC);
system("pause");
return 0;
}
十楼的大侠说在linux下正常,我是在windows下编译的,莫非是编译器的问题?
intel_www
2009-06-09
打赏
举报
回复
Windows中long是32位,不是64位。
wenrihui
2009-06-08
打赏
举报
回复
#include "stdafx.h"
#include "stdlib.h"
#include "omp.h"
#include <time.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long i=0,temp;
clock_t before;
double elapsed = 0.0;
before = clock();
#pragma omp parallel
{
#pragma omp for
for(i=0;i <3000000000;i++)
{
temp+=(i*-1);
}
}
elapsed = clock()-before;
printf("function used %.3f seconds\n", elapsed/CLOCKS_PER_SEC);
system("pause");
return 0;
}
这是我实测的程序,可以运行,若有兴趣可以把3000000000改成2000000000或其它数字试试。
wenrihui
2009-06-08
打赏
举报
回复
先谢谢各位,我上面写错了,我在程序实际运行的时候,i被声明为long型。
四楼说的对,VC2005在release中确能优化掉这种空循环,我这是写了个简单的,示例一下。如果加上一些实际的运算的话,和我提到的现象是一样的,执行时间依然为0.
问题主要在于,在一些值上执行时间为0(例如3000000000),但在另一些值,比他大或小,就会有正常的执行时间。而且上述值是固定的,不会随机变化。
qgdbr08
2009-06-08
打赏
举报
回复
32位的int型 范围为:-2^31~2^31-1
fanbin23
2009-06-08
打赏
举报
回复
把你的code稍微改了改:
#include "omp.h"
#include <stdio.h>
int main()
{
long long i=0,temp;
double before, elapsed;
before = omp_get_wtime();
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp for
for(i=0;i <3000000000;i++)
{
temp+=(i*-1);
}
}
elapsed = omp_get_wtime()-before;
printf("function used %f seconds\n", elapsed);
return 0;
}
使用Sun Studio C/C++ compiler在linux上是正常的
fanbin23
2009-06-08
打赏
举报
回复
[Quote=引用 7 楼 wenrihui 的回复:]
#include "stdafx.h"
#include "stdlib.h"
#include "omp.h"
#include <time.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long i=0,temp;
clock_t before;
double elapsed = 0.0;
before = clock();
#pragma omp parallel
{
#pragma omp for
for(i=0;i <3000000000;i++)
{
temp+=(i*-1);
}
}
elapsed = …
[/Quote]
检查一下输出变量有没有问题?
或者换用规范里的omp_get_wtime()试试
intel_www
2009-06-08
打赏
举报
回复
3000000000已经溢出了有符号长整型的上界,编译器直接将其处理为负数,所以循环根本就不会执行。如果该成2000000000循环就会被执行。
还有,这个例子中的2000000000(20亿)次循环根本就不是什么很大的计算量,即使串行执行也不会消耗很多时间(在我的机器上只要0.343s)。建议换个更好的例子作测试。
fanbin23
2009-06-06
打赏
举报
回复
有两个问题需要注意:
1. int的上界是2*10^10左右,你用的上界已经超过了int的上界,所以这个并行循环本身的行为是undefined的
2. 牛一些的编译器有把你的空循环优化掉的可能
wenrihui
2009-06-06
打赏
举报
回复
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
clock_t before;
double elapsed = 0.0;
before = clock();
#pragma omp parallel
{
#pragma omp for
for(i=0;i <3000000000;i++);
}
elapsed = clock()-before;
printf("function used %.3f seconds\n", elapsed/CLOCKS_PER_SEC);
system("pause");
return 0;
}
不好意思,我以为没人回,好久没来看,这就是源代码。
intel_iclifort
2009-05-06
打赏
举报
回复
请给出一个完整可以编译的代码, 否则无法调查问题, 或者复现错误
wenrihui
2009-05-05
打赏
举报
回复
请高手们赐教啊
openmp
编程指南.pdf
多核并行编程中,
openmp
作为一个不错的选择,此文档对
openmp
的特点,编程特性跟据例子进行讲解,有助于快速掌握
openmp
的编程
OpenMP
并行计算程序设计基础
OpenMP
是由The Board of the
OpenMP
Architecture Review Board(ARB)提出的一套用于共享内存并行系统的多线程程序设计标准。目前,
OpenMP
仅支持C、C++和Fortran语言。由于
OpenMP
是一种共享存储的标准,所以在非共享存储系统上不能使用,如集群(Cluster)(目前在非共享存储系统上并行主要采用MPI)。简而言之,
OpenMP
就是一种多线程程序设计的标准,适合在个人计算机上进行并行计算。它提供了对并行算法的抽象描述,程序员只需在源代码中加入专用的pragma来指明,编译器将自动将程序进行并行。 主要内容: 一、一个简单的
OpenMP
例子 1 二、
OpenMP
概述 5 三、并行数目与并形体对运行效率的影响 8 四、求π例子 13 五、循环结构的并行 17 1、范围条件 17 2、shedule条件 22 3、threadprivate指令 24 六、分段并行 25 七、嵌套并行 29 八、
OpenMP
中的常用函数 33 1、设置线程数目 33 2、获取线程数目 33 3、获取最多线程数目 33 4、返回线程ID 33 5、获取程序可用的处理器数目 33 6、获取
时间
34 7、是否处于并行中 34 九、同步 35 1、互斥同步 39 2、事件同步 42
openmp
入门简介
openmp
入门简介 一些
openMP
的简单小知识
OpenMP
多线程比较
vs 2008 中
openmp
并行技术的测试分析
openmp
简单易学易用
在这个学习中,您能了解
openmp
具体在linux下的操作,简单实习
openmp
,对它有一个清晰的了解,和简单的性能比较!
英特尔边缘计算技术
567
社区成员
7,024
社区内容
发帖
与我相关
我的任务
英特尔边缘计算技术
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
复制链接
扫一扫
分享
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章