gpt4 book ai didi

c - 如何在没有相等迭代次数的while循环上使用omp barrier

转载 作者:行者123 更新时间:2023-12-03 12:53:23 24 4
gpt4 key购买 nike

我正在尝试使用omp来实现listranking问题(也称为快捷方式),以使数组W的和为前缀。
我不知道我是否正确使用了冲洗编译指示。
而且我在编译时发出警告:“障碍区域可能不会紧密嵌套在工作共享,关键,有序,主要或明确的任务区域内”

#include <stdio.h> 
#include <stdlib.h>
#include <math.h>
#include <omp.h>

main(int argc, char *argv[])
{
int Q[9]={1,2,3,4,5,6,7,8,0};
int W[8]={1,2,3,4,5,6,7,8};
int i,j=6,id;

printf("Before:\n");
for(j=0;j<8;j++)
printf("%d",W[j]);
printf("\n");
#pragma omp parallel for shared(Q,W) private(id) num_threads(7)
for (i=6; i>=0; i--)
{
id= omp_get_thread_num();
while((Q[i] !=0)&& (Q[Q[i]] !=0))
{
#pragma omp flush(W)

W[i]=W[i]+W[Q[i]];

#pragma omp flush(W)

printf("Am %d \t W[%d]= %d",id,i,W[i]);

#pragma omp barrier
#pragma omp flush(Q)
Q[i]=Q[Q[i]];
#pragma omp flush(Q)
printf("Am %d \n Q[%d]= %d",id,i,Q[i]);
};
}
printf("Result:\n");
for(j=0; j<8; j++)
printf("%d \t",W[j]);
printf("\n");

}

PLEAAAAAAAAAAAASE帮助!

最佳答案

您不能在omp并行区域内使用屏障,而只能在omp并行区域内使用屏障。

这样做的原因是因为如果您的循环是从1到N,则内部的屏障将有效地创建N个线程,如果N大,则会对性能产生负面影响。

我没有在这里查找算法,但是有两个合理的选择是重构使用2个并行的for循环,一个接一个地设置障碍,或者重构您的算法以使用#pragma并行区域。

我查看了列表排名算法,可以很好地找到前缀和的实现,或者扫描是否必须使用openmp。

-里克

关于c - 如何在没有相等迭代次数的while循环上使用omp barrier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1959777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com