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 打赏 收藏 转发到动态 举报
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
  • 打赏
  • 举报
回复
请高手们赐教啊

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧