如何解决在OpenMP之后连接私有阵列
我正在使用OpenMP并行化下面的代码。
int *neighbors = malloc(num_of_neigh * sizeof(int));
int pos = 0;
for(int i=0;i<n;i++){
if(M[n*element+i]==1 && element!=i){
neighbors[pos] = i;
pos++;
}
}
下面是正常工作的代码。但是对于大量n
,由于共享变量 neighbors
和pos
,我的执行速度较慢。
int *neighbors = malloc(num_of_neigh * sizeof(int));
int pos = 0;
#pragma omp parallel for num_threads(8)
for(int i=0;i<n;i++){
if(M[n*element+i]==1 && element!=i){
#pragma omp critical
{
neighbors[pos] = i;
pos++;
}
}
}
结果,我决定对neighbors
和pos
使用局部变量,并在计算后将私有变量连接为全局变量。但是,我对这些串联有一些麻烦。
int *neighbors = malloc(num_of_neigh * sizeof(int));
int pos = 0;
#pragma omp parallel num_threads(8)
{
int *temp_neighbors = malloc(num_of_neigh * sizeof(int));
int temp_pos = 0;
#pragma omp for
for(int i=0;i<n;i++){
if(M[n*element+i]==1 && element!=i){
temp_neighbors[temp_pos] = i;
temp_pos++;
}
}
// I want here to concatenate the local variables temp_neighbors to the global one neighbors.
}
我尝试了下面的代码以实现串联,但是neighbors
仅采用temp_neighbors
的最后一个值,而其余元素为0。
#pragma omp critical
{
memcpy(neighbors+pos,temp_neighbors,num_of_neigh * sizeof(neighbors));
pos++;
}
因此,问题是: 如何将私有变量(尤其是数组)连接到全局变量? 我搜索了很多,但没有找到正确的答案。在此先感谢您,并为这个大问题感到抱歉。
解决方法
全局部分应如下所示。
#pragma omp critical
{
memcpy(neighbors + pos,temp_neighbors,temp_pos * sizeof(int));
pos += temp_pos;
}
memcpy
将temp_pos
数据元素(temp_pos * sizeof(int)
字节)复制到neighbors
(neighbors + pos
)中的第一个未使用位置。然后pos
被增加为下一个未使用位置的索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。