glmark2 GPU 跑分工具移植到arm实机上运行

2024-05-11 09:48

本文主要是介绍glmark2 GPU 跑分工具移植到arm实机上运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

glmark2 是开源的对OpenGL 2.0 和 ES 2.0的基准测试程序,一般用来对GPU进行基准测试。glmark提供了一系列丰富的测试,涉及图形单元性能(缓冲,建筑,照明,纹理等)的不同方面,允许进行更全面和有意义的测试。 每次测试进行10秒,并且单独计算帧速率。

开源地址是:

https://github.com/glmark2/glmark2

但是glmark2只能在windows、安卓和linux X86上跑,如果想在arm板子上跑需要自己移植。然后在网上搜了一圈都没有人移植过。因此只能自己去移植一把了。

移植到arm实机上的代码请到我的github拉取:https://github.com/fanchenxinok/glmark2_arm

顺便点个Star哦  ^ @ ^ 

拉完代码就跑可不好,能学习下怎么去移植一个开源程序到自己的arm板也是蛮有意思的,知其然也要知所以然对吧,接下来我来分析下移植的过程:

在移植之前我在Linux X86虚拟机环境上跑了一把,并执行了./glmark2 --help熟悉了下glmark2的使用。这有助于我查看waf用到的一些环境变量代表的含义。在虚拟机上安装很简单,执行:sudo apt-get install glmark2 即可。

然后从开源地址拉取源代码,进入到glmark2主目录,如下图:

看一下目录结构,可以猜测 android目录存放安卓上跑的代码,data目录存放跑分的测试数据;doc存放说明文档;src存放安卓平台以外的代码;waflib存放waf工具依赖的库。 

如果你用过waf帮助编译及构建系统的框架工具就明白glmark2源码是用waf编译的,学习waf工具基本 的使用可以参考我的博客:学习笔记:waf帮助构建及编译系统_fanchenxinok的专栏-CSDN博客_waf编译

说实在的waf构建的编译环境改动起来还是蛮费劲的,我更喜欢用Makefile来构建编译系统。于是我想把glmark2用Makefile来构建。

打开主目录的"wscript"文件,一大堆变量看着就头疼,不要紧,因为我们是移植的arm板子上跑所以有关window,android的都可以不用care,找到build字段:

def build(ctx):
    ctx.recurse('src')
    ctx.recurse('data')
    ctx.recurse('doc')

可以看出我们只要关心src目录下的代码即可,还有glmark2的模式选择:

FLAVORS = {
    'dispmanx-glesv2' : 'glmark2-es2-dispmanx',
    'drm-gl' : 'glmark2-drm',
    'drm-glesv2' : 'glmark2-es2-drm',
    'mir-gl' : 'glmark2-mir',
    'mir-glesv2' : 'glmark2-es2-mir',
    'wayland-gl' : 'glmark2-wayland',
    'wayland-glesv2' : 'glmark2-es2-wayland',
    'win32-gl': 'glmark2-win32',
    'win32-glesv2': 'glmark2-es2',
    'x11-gl' : 'glmark2',
    'x11-glesv2' : 'glmark2-es2',
}

接下来我们进入src目录,打开wscript_build编译脚本,从头往下看:

(1)首先可以看到all_sources和platform_libs变量,可以猜测all_sources代表的是需要编译的源文件包括当前目录下的所有cpp文件,scene-ideas下的cc文件,scene-terrain下的cpp文件;platform_libs代表需要链接的系统库。

all_sources = bld.path.ant_glob('*.cpp scene-ideas/*.cc scene-terrain/*.cpp')

platform_libs = ['m', 'jpeg', 'dl']

那么我的Makefile也相应的添加如下变量(我将scene-terrain的cc文件都重命名为cpp文件):

SOURCES = $(wildcard ./*.cpp ./scene-terrain/*.cpp ./scene-ideas/*.cpp)

CLIBS =  -lm -ldl -lrt -ljpeg

(2)接下来可以看到有flavor_sources的字段,跑在arm板子上我们只需要drm-gl、drm-glesv2、wayland-gl、wayland-glesv2四种模式:

flavor_sources = {
  'dispmanx-glesv2' : common_flavor_sources + ['native-state-dispmanx.cpp', 'gl-state-egl.cpp'],
  'drm-gl' : common_flavor_sources + ['native-state-drm.cpp', 'gl-state-egl.cpp'],
  'drm-glesv2' : common_flavor_sources + ['native-state-drm.cpp', 'gl-state-egl.cpp'],

  'mir-gl' : common_flavor_sources + ['native-state-mir.cpp', 'gl-state-egl.cpp'],
  'mir-glesv2' : common_flavor_sources + ['native-state-mir.cpp', 'gl-state-egl.cpp'],
  'wayland-gl' : common_flavor_sources + ['native-state-wayland.cpp', 'gl-state-egl.cpp'],
  'wayland-glesv2' : common_flavor_sources + ['native-state-wayland.cpp', 'gl-state-egl.cpp'],

  'win32-gl': common_flavor_sources + ['native-state-win32.cpp', 'gl-state-wgl.cpp'],
  'win32-glesv2': common_flavor_sources + ['native-state-win32.cpp', 'gl-state-egl.cpp'],
  'x11-gl' : common_flavor_sources + ['native-state-x11.cpp', 'gl-state-glx.cpp'],
  'x11-glesv2' : common_flavor_sources + ['native-state-x11.cpp', 'gl-state-egl.cpp'],
}

因此我在Makefile也定义了MODULE_SELECT用来选择运行的模式,并且为SOURCES变量添加相应的native-开头的cpp文件(我把native-开头的文件都放在module_select目录下):

ifeq ($(MODULE_SELECT), drm-gl)
    SOURCES += ./module_select/native-state-drm.cpp
    CLIBS += -ldrm -lgbm -ludev
    CFLAGS += -DGLMARK2_USE_DRM -DGLMARK2_USE_GL -DGLMARK2_USE_EGL
    INCLUDE_DIRS += -I$(USR_INC)/include/EGL \
            -I$(USR_INC)/include/drm \
            -I$(USR_INC)/include/gbm
else ifeq ($(MODULE_SELECT), drm-glesv2)
    SOURCES += ./module_select/native-state-drm.cpp
    CLIBS += -ldrm -lgbm -ludev
    CFLAGS += -DGLMARK2_USE_DRM -DGLMARK2_USE_GLESv2 -DGLMARK2_USE_EGL
    INCLUDE_DIRS += -I$(USR_INC)/include/EGL \
            -I$(USR_INC)/include/GLES2 \
            -I$(USR_INC)/include/drm \
            -I$(USR_INC)/include/gbm
else ifeq ($(MODULE_SELECT), wayland-gl)
    SOURCES += ./module_select/native-state-wayland.cpp
    CLIBS += -lwayland-client -lwayland-server -L./xdc_shell -lxdc-shell -L./wayland-egl -lwayland-egl
    CFLAGS += -DGLMARK2_USE_WAYLAND -DGLMARK2_USE_GL -DGLMARK2_USE_EGL
    INCLUDE_DIRS += -I$(USR_INC)/include/EGL -I./xdc_shell
    SUBDIRS += ./xdc_shell ./wayland-egl
else ifeq ($(MODULE_SELECT), wayland-glesv2)
    SOURCES += ./module_select/native-state-wayland.cpp
    CLIBS += -lwayland-client -lwayland-server -L./xdc_shell -lxdc-shell -L./wayland-egl -lwayland-egl
    CFLAGS += -DGLMARK2_USE_WAYLAND -DGLMARK2_USE_GLESv2 -DGLMARK2_USE_EGL
    INCLUDE_DIRS += -I$(USR_INC)/include/EGL \
            -I$(USR_INC)/include/GLES2 \
            -I./xdc_shell
    SUBDIRS += ./xdc_shell ./wayland-egl
else
    SOURCES +=
endif

(3)接下来可以看到有flavor_uselibs定义,这表示不同的模式依赖的库不一样,将依赖的库添加到CLIBS环境变量下。

(4)往下可以看到flavor_defines定义,这表示选择不同的模式时,代码中定义的宏定义。我的Makefile中相应的在CFLAGS

编译参数后添加,如:

'drm-gl' : ['GLMARK2_USE_DRM', 'GLMARK2_USE_GL', 'GLMARK2_USE_EGL'],

则Makefile添加到CFLAGS的变量如下:

 CFLAGS += -DGLMARK2_USE_DRM     -DGLMARK2_USE_GL     -DGLMARK2_USE_EGL

(5)还可以看到all_uselibs定义,这表示需要依赖的库有matrix-gl/glesv2、libpng-local、zlib-local、libjpeg-turbo-local、glad-gl/glesv2。这五个库都有相应的子目录分别是libmatirx、libpng、zlib、libjpeg-turbo、glad。所以只要在这五个目录下添加Makefile并且编译为*.a的静态库,在链接阶段链接到可执行文件即可。子Makefile的写法如下(以png为例):

TOP_DIR = ..

SOURCES = $(wildcard ./*.c)
INCLUDE_DIRS = -I./ -I$(TOP_DIR)/include
TARGET = libpng.a
OBJECTS = $(patsubst %.c,%.o,$(SOURCES))

$(TARGET) : $(OBJECTS)
    $(AR) $(ARFLAG) $@ $^
    
$(OBJECTS) : %.o : %.c 
    $(CC) -c $(CFLAGS) $< -o $@ $(INCLUDE_DIRS)

.PHONY : clean
clean:
    rm -rf $(TARGET) $(OBJECTS) 

那么主Makefile的CLIBS环境变量就可以添加这几个库

CLIBS = -L./libmatrix/ -lmatrix -L./libpng -lpng -L./zlib -lzlib -L./glad -lglad -L./libjpeg-turbo -ljpeg-turbo -lm -ldl -lrt -ljpeg

到这里glmark2主要的编译框架已经完成,后面就是有编译报错修改下即可。

目前在我的板子上只跑了drm-glesv2模式,wayland模式还没测试成功。如果哪位仁兄将wayland模式跑起来,可以在github上提交。

运行及结果:

[root@x glmark2_arm]# ./glmark2_arm
failed to load module: /usr/lib/gbm/gbm_dri.so: cannot open shared object file: No such file or directory
failed to load module: /usr/lib/gbm/gbm_gallium_drm.so: cannot open shared object file: No such file or directory
loaded module : gbm_pvr.so
found valid GBM backend : gbm_pvr.so
PVR:(Error): Couldn't load WS module libpvrws_WAYLAND.so [0, ]
PVR:(Error): Couldn't load WS module libpvrws_WAYLAND.so [0, ]
=======================================================glmark2 2017.07
=======================================================OpenGL InformationGL_VENDOR:     Imagination TechnologiesGL_RENDERER:   PowerVR SGX 544MPGL_VERSION:    OpenGL ES 2.0 build 1.14@3699939 (MAIN)
=======================================================
[build] use-vbo=false: FPS: 60 FrameTime: 16.667 ms
[build] use-vbo=true: FPS: 60 FrameTime: 16.667 ms
[texture] texture-filter=nearest: FPS: 60 FrameTime: 16.667 ms
[texture] texture-filter=linear: FPS: 60 FrameTime: 16.667 ms
[texture] texture-filter=mipmap: FPS: 60 FrameTime: 16.667 ms
[shading] shading=gouraud: FPS: 60 FrameTime: 16.667 ms
[shading] shading=blinn-phong-inf: FPS: 60 FrameTime: 16.667 ms
[shading] shading=phong: FPS: 60 FrameTime: 16.667 ms
[shading] shading=cel: FPS: 60 FrameTime: 16.667 ms
[bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms
[bump] bump-render=normals: FPS: 60 FrameTime: 16.667 ms
[bump] bump-render=height: FPS: 59 FrameTime: 16.949 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 60 FrameTime: 16.667 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 20 FrameTime: 50.000 ms
[pulsar] light=false:quads=5:texture=false: FPS: 60 FrameTime: 16.667 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 30 FrameTime: 33.333 ms
[desktop] effect=shadow:windows=4: FPS: 59 FrameTime: 16.949 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 30 FrameTime: 33.333 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms
[ideas] speed=duration: FPS: 60 FrameTime: 16.667 ms
[jellyfish] <default>: FPS: 60 FrameTime: 16.667 ms
[terrain] <default>: FPS: 0 FrameTime: inf ms
[shadow] <default>: FPS: 20 FrameTime: 50.000 ms
[refract] <default>: FPS: 10 FrameTime: 100.000 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 60 FrameTime: 16.667 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 60 FrameTime: 16.667 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 60 FrameTime: 16.667 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 60 FrameTime: 16.667 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 60 FrameTime: 16.667 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 60 FrameTime: 16.667 ms
=======================================================glmark2 Score: 50
=======================================================

这篇关于glmark2 GPU 跑分工具移植到arm实机上运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979189

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼?市面上那么多工具,常常让人无从选择。今天,想给大家安利一款神器——PixPin,一款真正解放双手的截图工具。 想象一下,你只需要按下快捷键就能轻松完成多种截图任务,还能快速编辑、标注甚至保存多种格式的图片。这款工具能满足这些需求吗? PixPin不仅支持全屏、窗口、区域截图等基础功能,它还可以进行延时截图,让你捕捉到每个关键画面。不仅如此

如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN 问题 我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误 java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 90314637791991

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr