微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在OpenMP之后连接私有阵列

如何解决在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,由于共享变量 neighborspos,我的执行速度较慢。

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++;
        }
    }
}

结果,我决定对neighborspos使用局部变量,并在计算后将私有变量连接为全局变量。但是,我对这些串联有一些麻烦。

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;
}

memcpytemp_pos数据元素(temp_pos * sizeof(int)字节)复制到neighborsneighbors + pos)中的第一个未使用位置。然后pos被增加为下一个未使用位置的索引。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。