用OpenMP老出错

UlTMa 2011-03-03 04:27:17
没有任何出错信息,直接退出(控制台程序)。请高手帮忙看看有没有什么问题。使用omp的代码如下(概化):

// 定义的类成员变量
int **lue; // 循环外赋值
double **de; // 循环外赋值
double **EA;
double **RD;
double **SW;
int NODATA; // 循环外赋值
double la, lb; // 循环外赋值
struct DTA dta; // 循环外赋值

void func()
{
// 这是几个局部变量
int i, j;
CCell cell; // class
CCV cv; // struct

#pragma omp prarallel for private (cell, cv)
for (i=0; i<Rows; i++)
{
for (j=0; j<Cols; j++)
{
if (lue[i][j] != NODATA)
{
double lt = la+i*(lb-la)/Rows;
cell.setprams(de, lue, lt, SW[i][j]);
dosomeother(j, i, cv);

cell.setotherparams(cv,dta);
EA[i][j] = cell.calcea();
RD[i][j] = cell.calcrd();
SW[i][j] = cell.calcsw();
}
}
}
}
...全文
192 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
intel_iclifort 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ultma 的回复:]

多谢,应该有些操作的变量才需要private吧?
[/Quote]

如果只有读操作,不需要保护。

如果会有读和写操作,那么先读后写,和先写后读,顺序不同,产生的结果可能完全不同。所以必须保护。这一点容易被遗漏

写写操作,当然要保护了
intel_iclifort 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ultma 的回复:]

引用 1 楼 intel_iclifort 的回复:

多谢,应该有些操作的变量才需要private吧?而且像EA[i][j],RD[i][j]这些变量有些操作也许要private么?
[/Quote]

如果你能保证每一个EA[i][j],只会发生一次写操作,没有其他的读/写操作,就不需要。

中间变量就申明为循环体内的局部变量
UlTMa 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 intel_iclifort 的回复:]

除了外层循环变量i,其它的变量在并行区内 缺省都是共享的, 包括内层循环变量j,也需要保护的

先列个表,看看哪些非局部变量有读写,或者写写操作
[/Quote]
多谢,应该有些操作的变量才需要private吧?而且像EA[i][j],RD[i][j]这些变量有些操作也许要private么?
intel_iclifort 2011-03-03
  • 打赏
  • 举报
回复
除了外层循环变量i,其它的变量在并行区内 缺省都是共享的, 包括内层循环变量j,也需要保护的

先列个表,看看哪些非局部变量有读写,或者写写操作

566

社区成员

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

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