gpt4 book ai didi

c++ - openMP 如何并行化这些循环?

转载 作者:行者123 更新时间:2023-11-28 06:16:52 41 4
gpt4 key购买 nike

假设我有这些循环:

#pragma omp parallel for
for(int i=0;i<100;++i)
{
// some big code here
#pragma omp parallel for
for(int j=0;j<200;j++)
{
// some small code here
}
}

哪个循环并行运行?哪个最好并行运行?

这里的重点是:

1- 如果 i-loop 并行运行,因为那里有一些大代码,CPU 缓存很有可能在循环的每次迭代中命中。

2- 如果 j-loop 并行运行,因为那里没有太多代码,它可能不会命中 CPU 缓存,但我正在并行运行大代码。

我不知道 openMP 如何并行运行这些 for 循环以便优化它们?

我的代码应该在 Windows (visual studio) 和 ARM Linux 上运行。

最佳答案

如果不启用嵌套(环境变量 OMP_NESTED=true),只有外层循环会并行运行。

如果启用嵌套,两个循环将并行运行,但您可能会创建太多线程。

您可以在外循环上使用 omp parallel 并在内循环中使用任务对多次迭代进行分组,例如:

#pragma omp parallel for
for (int i = 0; i<100; i++) {
//big code here

blocksize = 200/omp_get_num_threads();
int j = 0;
while(j < 200) {
int mystart = j; int myend = j+(blocksize-1);
#pragma omp task firstprivate(mystart,myend)
{
//small code here
}
if (j + blocksize >= 200) j = 200 - blocksize;
else (j+=blocksize);
}
#pragma omp taskwait
}

如果您考虑在内部循环中使用 SIMD,那么它的编写方式与您所拥有的非常相似:

#pragma omp parallel for
for (int i = 0; i<100; i++) {
//big code here
#pragma omp simd
for (int j = 0; j<200; j++) {
//small code here
}
}

但是这个最新的选项非常具体。基本上强制编译器对循环进行矢量化。

有关该主题的更多信息。在 https://software.intel.com/en-us/articles/enabling-simd-in-program-using-openmp40您会找到一个示例,其中他们使用 #pragma omp parallel for simd。这意味着并行化循环,每个线程将运行其迭代空间并应用矢量化。这仍然需要启用并行区域的嵌套 (OMP_NESTED),并且根据运行时实现,它可以生成多个线程组,每个外循环线程最多一个。

关于c++ - openMP 如何并行化这些循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30101319/

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