最近用服务器上的Matlab处理数据时发现,原先在自己电脑上正常运行的声谱绘图程序在服务器上却出现问题,声谱图中出现大量白色杂点,如下图所示:

出现问题之后做了如下尝试:

  1. 关闭图像网格,图像无变化;
  2. 对比原始数据,未发现差异;
  3. 逐项核对Matlab软件设置,未发现差异;
  4. 冒着内存溢出的风险在自己的电脑上运行了同样的程序并使用相同的原始数据,结果是自己电脑运行正常。(正常的图见最后)

就在快崩溃之时,发现原先绘图使用的是 surf(x,y,z) 函数,但使用 pcolor(x,y,z)则可以绘出完整的谱图,如下图所示:

但和自己电脑上绘出的图形反复对比还是有些许不同,一开始只是觉得服务器画出的图粗糙,声谱图上10^-1位置的谱线不是很清晰。这个对比下面这张自己电脑出的图就能明显看出:

正当我把服务器的图保存下来并用自己电脑打开进行对比的时候,果不其然的内存溢出导致蓝屏。但也就是这次崩溃后的Matlab提示给出了问题的答案。提示是这样的:

“警告: MATLAB 先前因底层图形错误而崩溃。为避免在此会话期间再次崩溃,MATLAB 将使用软件 OpenGL而不再使用图形硬件。要保存该设置以供此后的会话使用,请使用 opengl(‘save’, ‘software’) 命令。有关详细信息,请参见解决底层的图形问题。”

原来Matlab使用OpenGL进行图形绘制操作,自己的电脑由于有显卡所以使用的是hardware-full,而服务器只有集成显卡,配置是software。而最后两张图的区别就在于OpenGL hardware支持Graphics Smoothing且自动开启。也就是说最后那张看着最好的图实际是平滑后的结果,去除了噪点当然谱线就明显了很多。

同时使用 “opengl info” 命令可以查看Matlab当前的OpenGL配置情况,附上自己电脑和服务器的输出结果以供参考:

自己电脑:>> opengl info
Version: ‘4.6.0 NVIDIA 387.95’
Vendor: ‘NVIDIA Corporation’
Renderer: ‘GeForce GTX 1050/PCIe/SSE2’
RendererDriverVersion: ‘23.21.13.8795’
RendererDriverReleaseDate: ‘2017-10-09’
MaxTextureSize: 32768
Visual: ‘视觉效果 0x09,(RGBA 32 位(8 8 8 8)、Z 深度 16 位、硬件加速、双缓冲区、消除锯齿 8 次采样)’
Software: ‘false’
HardwareSupportLevel: ‘full’
SupportsGraphicsSmoothing: 1
SupportsDepthPeelTransparency: 1
SupportsAlignVertexCenters: 1
Extensions: {375×1 cell}
MaxFrameBufferSize: 32768

服务器:>> opengl info
Version: ‘1.1.0’
Vendor: ‘Microsoft Corporation’
Renderer: ‘GDI Generic’
MaxTextureSize: 1024
Visual: ‘视觉效果 0x0e,(RGB 24 位(8 8 8)、Z 深度 16 位、软件、单缓冲区、消除锯齿 0 次采样)’
Software: ‘true’
HardwareSupportLevel: ‘none’
SupportsGraphicsSmoothing: 0
SupportsDepthPeelTransparency: 0
SupportsAlignVertexCenters: 0
Extensions: {3×1 cell}
MaxFrameBufferSize: 0

看出区别了吗?后面两张图的问题就出在:“消除锯齿 0 次采样” 和 SupportsGraphicsSmoothing 两项上了。至于最开始 surf 和 pcolor 的问题还不清楚是什么导致,一个可能的原因是设置了对数纵轴,从而导致色块位置计算出现问题。

至此这个由于OpenGL导致Matlab绘图失败的问题算是基本解决了,剩下的就是抽空给服务器装个显卡。最后附上Matlab对OpenGL配置的描述页面。

 

Reference:

https://www.mathworks.com/help/matlab/ref/opengl.html

 

2018.11.16 Update:

关于OpenGL硬件模式下蓝屏的问题,发现在硬件模式下Matlab没有考虑显卡显存限制,未对共享显存挤占内存空间进行预判和处理。运气好一点Matlab崩溃退出,运气差一点直接蓝屏。而在软件模式下Matlab会先计算每步需要的内存容量,空间不足时会提示并停止运行。

 

{ 本文链接: https://www.sy2k.com/2018/opengl-bug-in-matlab-plotting/;
原创文章, 转载请保留. 转载自 https://www.sy2k.com }