openmp中,#pragma omp parallel for private()中可以指定数组吗?

yasaka 2011-02-23 04:32:26
openmp编程中, #pragma omp parallel for private()中可以指定数组吗?
如果我指定#pragma omp parallel for private(a); a为一数组: int a[20];

如果多个进程的话,是不是需要占用多倍的a数组的内存,private只是说是变量的副本,副本的意思是不是每个进程都会有一个a数组的内存?
private的用法和在程序中定义: int a[进程数][20] 到底有什么区别?

多谢高手指点!
...全文
1739 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
runer 2011-02-25
  • 打赏
  • 举报
回复
firstprivate就可以啊
看程序

#include <stdio.h>
int main() {
int k = 20;
int j[10] = {101,102,103,104,105,106,107,108,109,110};
printf("begin k=%d\tj[0]=%d\n", k,j[0]);
#pragma omp parallel for private(k) firstprivate(j)
for ( k=0; k < 10; k++)
{
printf("j[%d]->%10d\tk->%d\t",k,j[k],k);
j[k] = k*k;
printf("j[%d]->%d\n",k,j[k]);
}
printf("end k=%d\tj[0]=%d\n", k,j[0]);

}

输出:
[runer@db ~]# ./test
begin k=20 j[0]=101
j[1]-> 102 k->1 j[1]->1
j[0]-> 101 k->0 j[0]->0
j[9]-> 110 k->9 j[9]->81
j[8]-> 109 k->8 j[8]->64
j[7]-> 108 k->7 j[7]->49
j[4]-> 105 k->4 j[4]->16
j[3]-> 104 k->3 j[3]->9
j[6]-> 107 k->6 j[6]->36
j[2]-> 103 k->2 j[2]->4
j[5]-> 106 k->5 j[5]->25
end k=20 j[0]=101
runer 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yasaka 的回复:]
楼上的朋友高手啊,可否加你QQ?
[/Quote]

兄弟,不好意思,我不咋用QQ

加了也是白加
yasaka 2011-02-25
  • 打赏
  • 举报
回复
楼上的朋友高手啊,可否加你QQ?
runer 2011-02-24
  • 打赏
  • 举报
回复
说是副本其实不是很准确,

因为private定义的变量,在并行进程执行之前都是空的

每个进程操作自己的

值是在并行线程内部定义和操作的

内存肯定会多占了

yasaka 2011-02-24
  • 打赏
  • 举报
回复
谢谢楼上的高手,我还想问个问题,在你的程序中,如果我想使数组j在不同的进程中执行以前,里面的值初始化为进入进城前的外部的值,怎么实现呢?好像用firstprivate不行啊。应该怎么做呢?
runer 2011-02-24
  • 打赏
  • 举报
回复
上面第二句话不太严密

是指数组的大小是初始定义的,内容是进程内部定义的

和普通变量没差别。
贴个小测试程序:

#include <stdio.h>
int main() {
int k = 20;
int j[10];
j[0] = 20;
#pragma omp parallel for private(k,j)
for ( k=0; k < 10; k++)
{
printf("k->%d\t", k);
j[k] = k*k;
printf("j[%d]->%d\n",k,j[k]);
}
printf("k=%d\tj[0]=%d\n", k,j[0]);

}

输出:

[runer@db ~]# ./test
k->9 j[9]->81
k->8 j[8]->64
k->4 j[4]->16
k->3 j[3]->9
k->2 j[2]->4
k->1 j[1]->1
k->5 j[5]->25
k->6 j[6]->36
k->7 j[7]->49
k->0 j[0]->0
k=20 j[0]=20
runer 2011-02-24
  • 打赏
  • 举报
回复
当然可以指定数组

不过这个数组的下标也是在进程内部定义的,初始定义不会影响到每个进程内部
yasaka 2011-02-24
  • 打赏
  • 举报
回复
楼上的兄弟,我最想知道,openmp编程中, #pragma omp parallel for private()中可以指定数组吗?

562

社区成员

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

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