并发内存访问减慢系统速度
Concurrent memory access slowing down system
我有一个需要可视化的粒子系统。但可视化实际上应该对模拟本身没有影响。目前发生这种情况的方式是让第二个线程读取粒子系统的状态,而无需任何同步。这当然会导致模拟显示一些故障,但这不是问题。
然而,似乎发生的事情是渲染渲染得越快,粒子系统变得越慢。模拟的测量时间步长出现峰值,平均几乎翻倍。我相当确定这是由于渲染器从不同的线程访问粒子系统使用的内存。
现在的问题是:是否有可能以某种方式在较小的范围内干扰粒子系统?可视化的准确性根本不是问题。从理论上讲,我可以想象某种方法来指示编译器渲染器是纯只读的和/或它不需要数据的"最新"版本。但我不知道如何处理这个问题。
语言:C++,IDE:Visual Studio
PSS。当然,由于内存访问较少,保持渲染器的低 FPS 已经有所帮助,但模拟的测量定时步长仍然会飙升并减慢速度。
您的系统速度变慢,因为当您只进行模拟时,您的数据很可能处于缓存级别 1-2 中。缓存行处于"已修改"状态,对这些缓存行的每次读取和写入都是没有总线事务(即快速)的缓存命中。
一旦运行另一个线程访问相同的数据,模拟所做的更改需要传播到一致性点,以便可视化过程(在另一个 CPU 内核上运行)可以读取它们。因此,缓存行的状态从"已修改"状态转换为"共享"状态。
然后,一旦模拟线程想要再次修改该共享数据,缓存行就会从"共享"转换回"已修改"状态并生成总线事务,因此其他缓存中的缓存行将失效。
因此,即使从另一个线程读取也会减慢模拟速度,因为缓存行在状态之间跳跃,并且许多总线事务都在下面进行。在英特尔上,高速缓存一致性协议称为MESI(F),您可以在维基百科上找到更多信息:
https://en.wikipedia.org/wiki/MESI_protocol
关于如何处理这个问题。基本上,您应该避免同时读取和写入相同的数据。这很难,但您可能需要考虑以下几点:
-
您可以尝试修改模拟,使其对两个数据库进行操作。一个库将用于模拟,而另一个库将用于可视化先前计算的数据。
-
您可以尝试在模拟循环完成后立即一次性复制可视化线程中的数据。它将修复故障,并可能提高整体性能。
要在模拟线程和可视化线程之间同步,您应该使用繁忙等待(如旋转锁),而不是内核对象,如互斥锁。
综上所述,无法保证这些技术中的任何一种都会对您有所帮助。这完全取决于您的数据,CPU,缓存大小等。
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 为什么在读取文件大小时文件IO速度会发生变化
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在C++游戏中与库存系统作斗争
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 如何制作无限制照明系统
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 并发内存访问减慢系统速度
- 减慢伊利希特粒子系统的速度
- 提升文件系统的速度慢得令人难以置信
- free() 阻塞其他线程,系统速度变慢
- 为速度关键系统设计跟踪/日志
- 执行系统命令的速度非常慢