OpenMP多线程建议

时间:2016-10-25 12:58:51

标签: c++ multithreading opengl openmp

我在OpenGL中制作了一个2D牛顿重力模拟,其中有许多粒子跟随鼠标,在一个循环中改变速度,迭代所有粒子。

它运行良好,但性能不是那么好,我可以得到平均60 fps的2 milion粒子(我有一个i7 6700k和一个gtx 970)。 所以我认为多线程是改善它的最佳方式。 为此,我使用了OpenMP 2.0(我在Visual Studio上)。 然后更新循环变为:

   <com.mikhaellopez.circularimageview.CircularImageView
    android:id="@+id/card_thumbnail"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:background="@drawable/shape_colored_circle" //Note
    android:contentDescription="@string/card_thumbnail"
    android:src="@drawable/icon"
    app:civ_border="true"
    app:civ_border_color="@color/border_color"
    app:civ_border_width="2dp"
    app:civ_shadow="true"
    app:civ_shadow_color="@color/grey"
    app:civ_shadow_radius="10"/>`

GradientDrawable gd = (GradientDrawable) holder.thumbnail.getBackground()
if (gd != null) {
  gd.mutate();
  gd.setColor(colors[position]);
}

性能提升了很多(现在我得到130 fps),但并不像预期的那样,实际上有8个线程(4个内核采用Intel超线程),我希望它比以前好8倍;但它只是好3倍。 我在使用openMP时遇到了什么问题,或者我的性能是否会提高?

1 个答案:

答案 0 :(得分:1)

您的代码看起来很好,没有什么可以立即改进,但您的期望太高了。

  1. 对于许多代码,超线程将提供好处。如果此代码受计算限制,则您的预期性能增益为4倍。如果您受延迟限制(即您的处理器正在等待内存,但内存带宽未饱和),超线程只会给您带来好处。即便如此,你通常只能略微超过4倍的加速。
  2. 您的加速可能会受到整个代码的非并行化部分的限制。显然,你在并行循环之外有一大堆其他代码确实影响了FPS。这由Ahmdal's law解释。
  3. 您的处理器使用Turbo频率,当只有一个核心处于活动状态时,它会以更高的速度运行。
  4. 您可能会受到内存或共享缓存的部分限制,尽管您的加速表明它并非完全受内存带宽限制。
  5. 任何其他优化都将在很大程度上取决于count和其余代码。如果您需要具体建议,则必须将代码作为提取的[mcve]。

    提供