C Openmp没有加速并行循环

C Openmp没有加速并行循环,c,multithreading,performance,parallel-processing,openmp,C,Multithreading,Performance,Parallel Processing,Openmp,我有以下令人尴尬的并行循环 //#pragma omp parallel for for(i=0; i<tot; i++) pointer[i] = val; /#pragma omp parallel for 对于(i=0;i),在共享内存环境中使用多个线程实现性能通常取决于: 任务粒度 并行任务之间的负载平衡 并行任务的数量/使用的核心数量 并行任务之间的同步量 算法的界的类型 机器架构 我将简要概述上述各点 您需要检查并行任务的粒度是否足以克服并行化的开销(例如线程创建和同

我有以下令人尴尬的并行循环

//#pragma omp parallel for
for(i=0; i<tot; i++)
    pointer[i] = val;
/#pragma omp parallel for

对于(i=0;i),在共享内存环境中使用多个线程实现性能通常取决于:

  • 任务粒度
  • 并行任务之间的负载平衡
  • 并行任务的数量/使用的核心数量
  • 并行任务之间的同步量
  • 算法的界的类型
  • 机器架构
  • 我将简要概述上述各点

  • 您需要检查并行任务的粒度是否足以克服并行化的开销(例如线程创建和同步)。可能是循环的迭代次数,以及计算
    指针[i]=val;
    不足以证明线程创建的开销;但是,值得注意的是,任务粒度过大也会导致问题,例如负载不平衡

  • 您必须测试负载平衡(每个线程的工作量)。理想情况下,每个线程应该计算相同的工作量。在您的代码示例中,这没有问题

  • 您使用的是超线程吗?!您使用的线程是否多于内核?!因为,如果您使用超线程,线程将开始争夺资源,这可能导致性能下降

  • 通常,人们希望减少线程之间的同步量。因此,有时人们会使用更精细的同步机制,甚至数据冗余(以及其他方法)来实现这一点。您的代码没有这个问题

  • 在尝试并行化代码之前,您应该分析它是否是内存限制、CPU限制等。如果是内存限制,在处理并行化之前,您可以从提高缓存使用率开始。对于此任务,强烈建议使用探查器

  • 为了最大限度地利用底层架构,多线程方法需要解决该架构的约束。例如,在
    SMP
    架构中实现高效的多线程方法与在
    NUMA
    架构中实现不同对于后者,必须考虑记忆亲和力

  • 编辑:来自@Hristo lliev的建议

  • 线程亲缘关系:“将线程绑定到内核总体上提高了性能,在NUMA系统上甚至更高,因为它改进了数据局部性。”
  • 顺便说一句,我建议你读一下