我对这个并行编程很新,我正在使用OpenMP。 我对以下问题感到困惑。
说我有这个程序:
void functionX(int x){
for(int i = 0; i < x; i++)
//do some process
}
void functionY(int x, int y){
for(int i = 0; i < x; i++)
for(int j = 0; j < y; j++) {
funtionX(j);
}
}
void functionZ(int x){
for(int i = 0; i < x; i++)
functionY(i, 5);
}
int main() {
functionZ(3)
}
现在我想在这段代码上实现并行编程。因为 functionZ 调用 functionY 调用 functionX ,我认为不应该使每个函数并行,我应该只使 functionZ 并行因此 functionZ 中的每个线程都会单独调用 functionY
这就是我在functionZ中看到的代码。
void functionZ(int x){
#pragma omp parallel for
for(int i = 0; i < x; i++)
functionY(i, 5);
}
但是,我不确定我上面说的是否正确。我应该将每个功能分别并行吗?
答案 0 :(得分:2)
对我来说很好,但是如果for
内的functionZ()
循环的迭代次数的限制真的是3,那么这将极大地限制代码的预期可伸缩性。理想情况下,您希望并行化处于代码中尽可能最高级别,但需要在线程之间进行足够的工作以确保对所有可用计算资源的良好和平衡使用。
如果functionZ()
中的旅行计数确实如此之低,那么一个解决方案就是这样:
void functionY(int x, int y){
#paragma omp for collapse(2) schedule(auto)
for(int i = 0; i < x; i++)
for(int j = 0; j < y; j++) {
funtionX(j);
}
}
void functionZ(int x){
#pragma omp parallel
for(int i = 0; i < x; i++)
functionY(i, 5);
}
根据您的实际问题,您可以摆弄这种方法,为您的工作共享找到最佳位置,以及最佳时间安排。