【问题标题】:Concatenate private arrays after OpenMP在 OpenMP 之后连接私有数组
【发布时间】:2020-09-26 20:50:53
【问题描述】:

我正在使用 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++;
}

所以,问题是: 如何将私有变量(尤其是数组)连接到全局变量? 我搜索了很多,但没有找到任何正确的答案。提前致谢,对于这个大问题,我们深表歉意。

【问题讨论】:

    标签: arrays c concatenation openmp


    【解决方案1】:

    全局部分应如下所示。

    #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 增加为下一个未使用位置的索引。

    【讨论】:

    • 从一开始就拥有一个全局数组并让每个线程知道它应该使用该共享数组的哪一部分不是更容易(并且性能更高)吗?
    • @Paul 如果我们在开始循环之前知道每个线程需要多少个元素,那么全局数组肯定会更容易和更快。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多