我试图弄清楚如何在 OpenMP 中并行化一段代码,其中 for 循环的内部独立于其余部分。
基本上该项目正在处理粒子系统,但我认为这与代码的并行化无关。 for循环划分线程的方式导致粒子没有以有效的方式缓存在每个核心中,这是否是一个缓存问题?
编辑:正如下面的答案所提到的,我想知道为什么我没有得到加速。
#pragma omp parallel for
for (unsigned i = 0; i < psize-n_dead; ++i)
{
s->particles[i].pos = s->particles[i].pos + dt * s->particles[i].vel;
s->particles[i].vel = (1 - dt*.1) * s->particles[i].vel + dt*s->force;
// printf("%d", omp_get_thread_num());
}
最佳答案
如果您询问它是否并行化正确,它看起来很好。我没有看到任何可能破坏它的数据争用或循环依赖性。
但我认为您想知道为什么并行性没有获得任何加速。
既然您提到了行程计数,psize-n_dead
将约为 4000
。我想说,考虑到循环中的工作量,这实际上相当小。
换句话说,您没有太多的总工作值得并行化。因此,线程开销可能会消耗掉您应该获得的任何加速。如果可能,您应该尝试更高级别的并行化。
编辑:您更新了评论,最多包含 200000 条评论。
对于较大的值,您可能会以某种方式受到内存限制。您的循环仅迭代所有数据,几乎不做任何工作。因此,使用更多线程可能不会有太大帮助(如果有的话)。
关于c - 使用 OpenMP 可能会出现哪些问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9234077/