gpt4 book ai didi

c++ - OpenMP 多线程建议

转载 作者:行者123 更新时间:2023-11-28 05:27:32 25 4
gpt4 key购买 nike

我在 OpenGL 中制作一个二维牛顿重力模拟,其中有很多粒子跟随鼠标,在一个循环中改变速度,循环遍历所有粒子。

它工作正常,但性能不是很好,使用 200 万粒子(我有 i7 6700k 和 gtx 970)平均只能获得 60 fps。所以我认为多线程是改进它的最佳方式。为此,我使用了 OpenMP 2.0(我在 Visual Studio 上)。然后更新循环变为:

#pragma omp parallel for
for (int i = 0; i < count; i++)
{
float vertX = WIDTH/2 * (vertices[i*2]+1);
float vertY = -HEIGHT/2*(vertices[i *2+ 1]+1)+HEIGHT;

float fact = (mouseX - vertX)*(mouseX - vertX) + (mouseY - vertY)*(mouseY - vertY) + 120;
glm::vec2 acc = 3.f / fact*(glm::vec2(mouseX, mouseY) - glm::vec2(vertX, vertY)) * (float)bPressed;
acc.y *= -1;

speed[i*2] += acc.x - speed[i*2]/200;
speed[i *2+ 1] += acc.y - speed[i *2+ 1] / 200;

vertices[i*2] += speed[i*2]*dt;
vertices[i *2+ 1] += speed[i*2+1]*dt;

}

性能提高了很多(现在我得到了 130 fps),但并不像预期的那样,实际上有 8 个线程(4 个内核和英特尔超线程),我预计它会比以前好 8 倍;但它只好 3 倍。我是不是在使用 openMP 时做错了什么,或者我根本无法获得更好的性能?

最佳答案

你的代码看起来不错,没有什么可以立即改进的地方,但你的期望太高了。

  1. 对于许多代码,超线程不会提供好处。如果此代码受计算限制,您的预期性能增益为 4 倍。超线程只会在您受延迟限制时给您带来好处(即您的处理器正在等待内存,但内存带宽未饱和)。即便如此,您通常也只能获得略高于 4 倍的加速。
  2. 您的加速可能会受到整个代码的非并行化部分的限制。显然,在影响 FPS 的并行循环之外还有一大堆其他代码。这由 Ahmdal's law 解释.
  3. 您的处理器使用 Turbo 频率,当只有一个内核处于事件状态时,它会以更高的速度运行。
  4. 您可能会部分受到内存或共享缓存的限制,尽管您的加速表明它并不完全受内存带宽限制。

任何额外的优化都将在很大程度上取决于 count 和其余代码。如果您需要具体的建议,则必须以提炼 [mcve] 的形式提供代码。

关于c++ - OpenMP 多线程建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40240643/

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