【发布时间】: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,由于 共享变量 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++;
}
所以,问题是: 如何将私有变量(尤其是数组)连接到全局变量? 我搜索了很多,但没有找到任何正确的答案。提前致谢,对于这个大问题,我们深表歉意。
【问题讨论】:
标签: arrays c concatenation openmp