c - 使用 OpenMP 可能会出现哪些问题?

标签 c parallel-processing openmp

我试图弄清楚如何在 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/

相关文章:

c - 如何进行 Windows 句柄继承

c - 循环调用realloc的缺点

multithreading - OpenMP - 进入临界区时是否需要刷新共享变量?

C 代码在 Intel Xeon E5-2650 上的性能

parallel-processing - Omp 部分与 Omp 工作共享

c - "? :"发生了什么?我不知道返回类型

c - 在 3d 数组中查找重复(2d)单元格的函数

node.js - Node.js 是否支持并行性?

python - 使用 subprocess.Popen 启动子进程并在其运行时读取其输出

c - OpenMP 始终在同一线程上工作