代码 execution/cpu 速度每 2 秒减慢一次
code execution/cpu speed slows down every 2 seconds
(这是一个 cros 软件-硬件主题,它最初是我的一个编程问题,但在所有故障排除之后我认为它是 可能硬件问题(也许更适合超级用户?)但我还没有解决它,所以我不确定,希望这个社区能分享一些相关的 cpu 理论。无论如何...... )
我正在编写一个实时渲染程序,并且一直被可见的帧率故障所困扰,这种故障持续每 2 秒发生一次。经过大量分析后,我确定这是影响我程序中所有代码部分(包括图形 api 调用)的性能下降,因此我认为这是一个 cpu 问题,不属于程序。
我可以在新的 Code::Blocks 项目中使用以下代码在我的机器上演示问题:
#include <cstdint>
#include <iostream>
#include <chrono>
int main(int argc, char* args[])
{
std::cout << std::fixed;
std::chrono::system_clock::time_point runStart = std::chrono::high_resolution_clock::now();
while(true)
{
uint64_t count = 0;
std::chrono::system_clock::time_point frameStart = std::chrono::high_resolution_clock::now();
{
for(uint64_t i = 0; i < 100000; ++i)
++count;
}
std::chrono::system_clock::time_point frameStop = std::chrono::high_resolution_clock::now();
double runTime = std::chrono::duration<double, std::chrono::seconds::period>(frameStop - runStart).count();
double frameTime = std::chrono::duration<double, std::chrono::seconds::period>(frameStop - frameStart).count();
if(frameTime > 0.0005)
std::cout << count << " runTime: " << runTime << " \tframeTime: " << frameTime << '\n';
}
return 0;
}
典型的输出看起来像这样,它清楚地显示了每 2 秒有一些较慢的帧:
100000 runTime: 0.000393 frameTime: 0.000393
100000 runTime: 0.000840 frameTime: 0.000393
100000 runTime: 0.001214 frameTime: 0.000369
100000 runTime: 0.002984 frameTime: 0.000389
100000 runTime: 0.003384 frameTime: 0.000395
100000 runTime: 0.003781 frameTime: 0.000393
100000 runTime: 0.004158 frameTime: 0.000371
100000 runTime: 0.005927 frameTime: 0.000386
100000 runTime: 0.006329 frameTime: 0.000398
100000 runTime: 0.006724 frameTime: 0.000390
100000 runTime: 0.007127 frameTime: 0.000398
100000 runTime: 0.007507 frameTime: 0.000375
100000 runTime: 0.994469 frameTime: 0.000511
100000 runTime: 3.042060 frameTime: 0.000465
100000 runTime: 3.077671 frameTime: 0.000405
100000 runTime: 5.093173 frameTime: 0.000496
100000 runTime: 5.128435 frameTime: 0.000366
100000 runTime: 5.488874 frameTime: 0.000391
100000 runTime: 7.135737 frameTime: 0.000367
100000 runTime: 7.152022 frameTime: 0.000484
100000 runTime: 7.457491 frameTime: 0.000360
100000 runTime: 9.179262 frameTime: 0.000478
100000 runTime: 9.211521 frameTime: 0.000368
100000 runTime: 9.226528 frameTime: 0.000353
100000 runTime: 11.217430 frameTime: 0.000391
100000 runTime: 11.262574 frameTime: 0.000352
也许其他一些机器会显示类似的输出? (根据需要调整输出阈值。)
我试过用 g++ 和 clang 编译,都产生了这个异常。 (g++ 版本整体表现更好一些。)
我突然想到,自从我组装这台电脑以来,除了我自己的项目,我还没有 运行 任何 3d 应用程序,所以我尝试了 运行 随附的全息图演示使用 LunarG Vulkan API 和一些屏幕保护程序,果然每 2 秒就有一次故障。 (它在屏幕保护程序中不太明显。)所以我很欣慰地知道至少它是系统范围的,而不是我的程序做错了什么。
系统规格:
- cpu:AMD 锐龙 7 1800X
- 主板:MSI B350 Tomahawk Arctic
- 内存:1x16GB DDR4 3200
- 显卡:GeForce GTX 1050 Ti
- psu:美洲狮 CMX 1000
- os: Linux Mint 18.1 64 位
看来我用 1000W psu 过度了,所以瓦数不足不是问题。除非 Cougar psu 有一些缺陷导致每 2 秒短暂下降一次?
知道是什么原因造成的吗?我能做些什么?
编辑:
有关我的渲染问题的更多详细信息:
我围绕 OpenGL 构建我的引擎已经有很长一段时间了,只要我一直在这台机器上工作,这个问题就一直存在。在那之前,我的旧电脑也有类似的随机跳帧,它有自己的问题(旧游戏笔记本电脑的电池寿命为 20 分钟,并且容易过热到足以触发安全关闭),所以这就是为什么我没有立即想到的原因这是一个硬件问题。我一直在计划将我的项目移植到 Vulkan,所以我不再担心跳帧问题,希望它会在我更改渲染时消失 API。但是现在我正在经历 this Vulkan tutorial 并且我已经看到在像教程中那样绘制旋转四边形时跳帧了。
我一直在尝试绕过 Vulkan 交换链,试图对此进行优化。我拥有的 most 最佳解决方案是让一个线程专用于每 1/60 秒调用一次 vkQueuePresentKHR
(using std::this_thread::sleep_until
在调用之间等待),并设置 Vulkan 存在模式VK_PRESENT_MODE_IMMEDIATE_KHR
,并用另一个线程提前绘制最多 7 个其他交换链图像,因此交换线程不必等待它们(而且我知道这可能不是最安全的方法它根据 Vulkan 规范)。使用此设置,对 vkQueuePresentKHR
的调用通常需要 0.000050 到 0.000300 秒到 return,但每 2 秒至少有 1 帧需要 > 0.01 秒,如果我是使用 VK_PRESENT_MODE_FIFO_KHR
并且调用几乎没有错过 vblank 并且不得不等待下一个,但是我正在使用 VK_PRESENT_MODE_IMMEDIATE_KHR
所以我不知道发生了什么,除了无论在引擎盖下在 vkQueuePresentKHR
中调用的代码受到我的性能异常的严重影响。
你做的测试太敏感了。
在我的电脑上,它不会每 2 秒打印一次东西。但是当我 alt-tab 到其他应用程序并做某事时,尤其是。访问一个文件系统,它会打印几行。即使我只是闲着等待,它也会每 10-30 秒随机打印一行。顺便说一句,在 Windows 10 上的 Ubuntu 中,将 clang 4.0 与 libc++ 运行ning 结合使用,Intel Xeon CPU.
现在关于您的 3D 渲染问题。
在您的 Linux PC 上,您记录的每次减速的绝对值约为 0.5-1 毫秒。如果你像我一样有一个 60 Hz 的显示器,则显示器的 1 帧 = 16.6 毫秒。就其本身而言,1 毫秒的延迟(可能由 OS 引入)不足以成为渲染跳帧的充分理由。
可能是您的代码 + 示例代码中的问题,您在其中构造交换链 and/or 并在其中展示内容。仅仅因为它们是 SDK 示例并不意味着它们可以保证在您的特定 PC 上正常工作。
可能是 Vulkan 驱动程序的问题。要对此进行测试,运行 一个 OpenGL-based 屏幕保护程序并查找这些丢失的帧。
或者可能只是与 Vulkan 无关的 GPU 驱动程序的问题。在这种情况下,您可能会看到与 OpenGL 相同的问题。
(这是一个 cros 软件-硬件主题,它最初是我的一个编程问题,但在所有故障排除之后我认为它是 可能硬件问题(也许更适合超级用户?)但我还没有解决它,所以我不确定,希望这个社区能分享一些相关的 cpu 理论。无论如何...... )
我正在编写一个实时渲染程序,并且一直被可见的帧率故障所困扰,这种故障持续每 2 秒发生一次。经过大量分析后,我确定这是影响我程序中所有代码部分(包括图形 api 调用)的性能下降,因此我认为这是一个 cpu 问题,不属于程序。
我可以在新的 Code::Blocks 项目中使用以下代码在我的机器上演示问题:
#include <cstdint>
#include <iostream>
#include <chrono>
int main(int argc, char* args[])
{
std::cout << std::fixed;
std::chrono::system_clock::time_point runStart = std::chrono::high_resolution_clock::now();
while(true)
{
uint64_t count = 0;
std::chrono::system_clock::time_point frameStart = std::chrono::high_resolution_clock::now();
{
for(uint64_t i = 0; i < 100000; ++i)
++count;
}
std::chrono::system_clock::time_point frameStop = std::chrono::high_resolution_clock::now();
double runTime = std::chrono::duration<double, std::chrono::seconds::period>(frameStop - runStart).count();
double frameTime = std::chrono::duration<double, std::chrono::seconds::period>(frameStop - frameStart).count();
if(frameTime > 0.0005)
std::cout << count << " runTime: " << runTime << " \tframeTime: " << frameTime << '\n';
}
return 0;
}
典型的输出看起来像这样,它清楚地显示了每 2 秒有一些较慢的帧:
100000 runTime: 0.000393 frameTime: 0.000393
100000 runTime: 0.000840 frameTime: 0.000393
100000 runTime: 0.001214 frameTime: 0.000369
100000 runTime: 0.002984 frameTime: 0.000389
100000 runTime: 0.003384 frameTime: 0.000395
100000 runTime: 0.003781 frameTime: 0.000393
100000 runTime: 0.004158 frameTime: 0.000371
100000 runTime: 0.005927 frameTime: 0.000386
100000 runTime: 0.006329 frameTime: 0.000398
100000 runTime: 0.006724 frameTime: 0.000390
100000 runTime: 0.007127 frameTime: 0.000398
100000 runTime: 0.007507 frameTime: 0.000375
100000 runTime: 0.994469 frameTime: 0.000511
100000 runTime: 3.042060 frameTime: 0.000465
100000 runTime: 3.077671 frameTime: 0.000405
100000 runTime: 5.093173 frameTime: 0.000496
100000 runTime: 5.128435 frameTime: 0.000366
100000 runTime: 5.488874 frameTime: 0.000391
100000 runTime: 7.135737 frameTime: 0.000367
100000 runTime: 7.152022 frameTime: 0.000484
100000 runTime: 7.457491 frameTime: 0.000360
100000 runTime: 9.179262 frameTime: 0.000478
100000 runTime: 9.211521 frameTime: 0.000368
100000 runTime: 9.226528 frameTime: 0.000353
100000 runTime: 11.217430 frameTime: 0.000391
100000 runTime: 11.262574 frameTime: 0.000352
也许其他一些机器会显示类似的输出? (根据需要调整输出阈值。)
我试过用 g++ 和 clang 编译,都产生了这个异常。 (g++ 版本整体表现更好一些。)
我突然想到,自从我组装这台电脑以来,除了我自己的项目,我还没有 运行 任何 3d 应用程序,所以我尝试了 运行 随附的全息图演示使用 LunarG Vulkan API 和一些屏幕保护程序,果然每 2 秒就有一次故障。 (它在屏幕保护程序中不太明显。)所以我很欣慰地知道至少它是系统范围的,而不是我的程序做错了什么。
系统规格:
- cpu:AMD 锐龙 7 1800X
- 主板:MSI B350 Tomahawk Arctic
- 内存:1x16GB DDR4 3200
- 显卡:GeForce GTX 1050 Ti
- psu:美洲狮 CMX 1000
- os: Linux Mint 18.1 64 位
看来我用 1000W psu 过度了,所以瓦数不足不是问题。除非 Cougar psu 有一些缺陷导致每 2 秒短暂下降一次?
知道是什么原因造成的吗?我能做些什么?
编辑: 有关我的渲染问题的更多详细信息:
我围绕 OpenGL 构建我的引擎已经有很长一段时间了,只要我一直在这台机器上工作,这个问题就一直存在。在那之前,我的旧电脑也有类似的随机跳帧,它有自己的问题(旧游戏笔记本电脑的电池寿命为 20 分钟,并且容易过热到足以触发安全关闭),所以这就是为什么我没有立即想到的原因这是一个硬件问题。我一直在计划将我的项目移植到 Vulkan,所以我不再担心跳帧问题,希望它会在我更改渲染时消失 API。但是现在我正在经历 this Vulkan tutorial 并且我已经看到在像教程中那样绘制旋转四边形时跳帧了。
我一直在尝试绕过 Vulkan 交换链,试图对此进行优化。我拥有的 most 最佳解决方案是让一个线程专用于每 1/60 秒调用一次 vkQueuePresentKHR
(using std::this_thread::sleep_until
在调用之间等待),并设置 Vulkan 存在模式VK_PRESENT_MODE_IMMEDIATE_KHR
,并用另一个线程提前绘制最多 7 个其他交换链图像,因此交换线程不必等待它们(而且我知道这可能不是最安全的方法它根据 Vulkan 规范)。使用此设置,对 vkQueuePresentKHR
的调用通常需要 0.000050 到 0.000300 秒到 return,但每 2 秒至少有 1 帧需要 > 0.01 秒,如果我是使用 VK_PRESENT_MODE_FIFO_KHR
并且调用几乎没有错过 vblank 并且不得不等待下一个,但是我正在使用 VK_PRESENT_MODE_IMMEDIATE_KHR
所以我不知道发生了什么,除了无论在引擎盖下在 vkQueuePresentKHR
中调用的代码受到我的性能异常的严重影响。
你做的测试太敏感了。
在我的电脑上,它不会每 2 秒打印一次东西。但是当我 alt-tab 到其他应用程序并做某事时,尤其是。访问一个文件系统,它会打印几行。即使我只是闲着等待,它也会每 10-30 秒随机打印一行。顺便说一句,在 Windows 10 上的 Ubuntu 中,将 clang 4.0 与 libc++ 运行ning 结合使用,Intel Xeon CPU.
现在关于您的 3D 渲染问题。
在您的 Linux PC 上,您记录的每次减速的绝对值约为 0.5-1 毫秒。如果你像我一样有一个 60 Hz 的显示器,则显示器的 1 帧 = 16.6 毫秒。就其本身而言,1 毫秒的延迟(可能由 OS 引入)不足以成为渲染跳帧的充分理由。
可能是您的代码 + 示例代码中的问题,您在其中构造交换链 and/or 并在其中展示内容。仅仅因为它们是 SDK 示例并不意味着它们可以保证在您的特定 PC 上正常工作。
可能是 Vulkan 驱动程序的问题。要对此进行测试,运行 一个 OpenGL-based 屏幕保护程序并查找这些丢失的帧。
或者可能只是与 Vulkan 无关的 GPU 驱动程序的问题。在这种情况下,您可能会看到与 OpenGL 相同的问题。