gpt4 book ai didi

C 和 OpenMP : nowait for loop in a do loop

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:02 25 4
gpt4 key购买 nike

我正在尝试使用可能的参数最小化某些函数 P做粒子群优化。你需要知道的是,这个过程需要为不同的索引计算一个特定的函数(我称之为 foo ) i (每个索引都链接到一组参数 P )。 foo的时间花在每个 i是不可预测的,不同的 i 可能会有很大差异.尽快一个v[i]已经计算好了,我想开始计算另一个。此过程在一个 i 时停止优化函数(即找到对应的参数集P)。

所以我想用 OpenMP 并行计算。我做了以下事情:

unsigned int N(5); 
unsigned int last_called(0);
std::vector<double> v(N,0.0);
std::vector<bool> busy(N,false);
std::vector<unsigned int> already_ran(N,0);
std::vector<unsigned int> to_run_in_priority(N);
for(unsigned int i(0);i<N;i++){
to_run_in_priority[i]=i;
}
do{
#pramga omp parallel for nowait
for(unsigned int i=0;i<N;i++){
if(!busy[to_run_in_priority[i]]){
busy[to_run_in_priority[i]]=true;
already_ran[to_run_in_priority[i]]++;
foo(v[to_run_in_priority[i]]);
busy[to_run_in_priority[i]]=false;
}
/*update to_run_in_priority*/
}
} while (/*condition*/)

例如,如果我有 4 个线程并且 N=5。程序会进入for循环并午餐4个线程。当第一个i已经算好了,是第5个午饭。但是接下来会发生什么?

代码是否继续,到达while条件并再次输入 for环形?如果是这样,因为所有线程都很忙,它会做什么?

如果我不清楚我想做什么,让我列出我想要的:

  • 调用foo对于每个 i在一个单独的线程上 ( thread_numbers<N )
  • 如果某个线程不再运行,再次调用foo对于一些 i (下一个应该运行的 i 必须不同于所有其他正在运行的 i,它应该是运行次数少于其他运行次数的 i
  • 对前两项进行循环,直到达到收敛标准。

如果我不够清楚,请不要犹豫,询问精度。

最佳答案

从你的代码中抽象一些你似乎想写一些类似的东西

#pramga omp parallel for
for(unsigned int i=0;i<N;i++){
v[i] = foo(i)
}

但您担心,由于调用 foo(i) 的计算量差异很大,如果每个线程仅获取 的一系列值,这种简单的方法将不平衡i 对其进行操作。

您的担心可能是对的,但我认为,如果我的诊断是正确的,那么您在平衡程序方面走错了路。您所采用的错误方法是尝试自己编写线程的工作分配。

试试这个(伪代码):

#pramga omp parallel for schedule(dynamic,10)
for(unsigned int i=0;i<N;i++){
v[i] = foo(i)
}

请注意 schedule 子句的引入,在本例中带有参数 dynamic10。这会指示运行时将 i 的值(一次 10 个元素)分发给各个线程。根据每个 i 值的运行时间分布以及 N 的大小,这可能足以平衡负载。

话又说回来,它可能不会,你可能想进一步研究 schedule 子句,特别是 dynamicguided调度。

如果这些请求都没有调查 OpenMP task 构造;我现在没有时间(老实说,也没有技能)为此提供伪代码。

最后,如果我误解了你的问题(这种情况经常发生),那么这个答案对你来说可能毫无值(value)。

关于C 和 OpenMP : nowait for loop in a do loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842786/

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