openmp编程问题!!(关于parallel中return语句)

zzxiaohua 2009-02-25 09:43:47
我在这段parallel中使用了return语句,在编译时出错。是不是parallel中不能使用return语句呢?我看的书上说parallel for中不能使用return。如果不能使用return,如果malloc不成功怎么跳出并行体返回呢?
#pragma omp parallel private(threadid,numthreads,prj,slc,n)
{
threadid=omp_get_thread_num();
numthreads=omp_get_num_threads();
if((prj=(Proj *)malloc(sizeof(Proj)*vol.X*AngN))==NULL)

{

printf("Error with Function 'ATOM()'!Can't malloc memery for 'prj' !");

return FALSE;

}



if((slc=(Slice *)malloc(sizeof(Slice)))==NULL)

{

printf("Error with Function 'ATOM()'!Can't malloc memery for 'slc'!");

return FALSE;

}
if((slc->data=(float *)malloc(sizeof(float)*slid->X*slid->Z))==NULL)

{

printf("Error with Function 'ATOM()'!Can't malloc memery for slc->data !");

return FALSE;

}
#pragma omp for
for(j=0;j<vol.Y;j++)

{
...全文
961 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yasaka 2011-11-19
  • 打赏
  • 举报
回复
用if...else怎么解决啊?
zzxiaohua 2009-06-23
  • 打赏
  • 举报
回复
的确好久才来看帖子了,我也是用if-else解决了,实在想不到其他更好的办法了。不知道楼上的从何处下手对OpenMP进行改进的。
fanbin23 2009-06-06
  • 打赏
  • 举报
回复
虽然楼主可能不会回来看了,但还是要说这真是个很好的问题。OpenMP一个重要的缺陷是error handling,目前也正在着手改进,特别是C++版本中还要加入对exception的支持。

从parallel region中return是肯定不对的。3.0规范p34: A program that branches into or out of a parallel region is non-conforming. 所以1楼的goto似乎也不能直接跳出去……。if-else是个可行的方法。

从parallel region中alloc内存的扩展性也是问题
Intel_CG 2009-05-18
  • 打赏
  • 举报
回复
用intel Parallel studio中的Intel编译器,加上/Qdiag-enable:openmp /Qopenmp 或 /Qdiag-enable:sc3 /Qopenmp后会报告这类错误。

test1.cc(11): error: "goto" branches to or from an OpenMP structured block are illegal
goto aaa;


命令行: icl /Qdiag-enable:openmp /Qopenmp your_app.cpp

#include <stdio.h>
#include <omp.h>
main()
{
int i,sum = 0;
int a[1000];
#pragma omp parallel for reduction(+:sum)
for (i=1; i<999; i++) {
a[i] = i;
sum = sum + a[i + 1];
goto aaa;
}
aaa: i=0;
}
qgdbr08 2009-05-11
  • 打赏
  • 举报
回复
顶楼上....
光宇广贞 2009-04-30
  • 打赏
  • 举报
回复
你从共享代码区内return是不可能的。
一个好方法是用IF-ELSE嵌套,使代码在FALSE的时候可以顺利退出该共享代码区,或者干脆点直接用GOTO指令。
请记住,从循环体内在未continue 或break时强行return 和在共享区内妄图return 的尝试,能否成功先放一边,程序首先就会崩溃掉……这种操作是非法的。

567

社区成员

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

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